Yes, my case is about the same logical queue. I currently don’t have any
abstraction for “units of work” or whatever you may call it - application
didn’t need it when it was running on a single machine. I’ll have to
introduce something similar to isolate jobs from actual business objects.


On Wed, Jun 28, 2017 at 11:24 PM, Dmitry Gusev <dmitry.gu...@gmail.com>
wrote:

> Not sure I understand where those pessimistic locks came from.
>
> In out case there's no locking at all, every machine in a cluster processes
> jobs simultaneously, unless, of course, the jobs are not from the same
> logical queue and must be executed in order.
>
> By row-level locking I mean PostgreSQL's SELECT ... FOR UPDATE, i.e.:
>
> UPDATE units_of_work
> SET started_at = ?
> WHERE id = (SELECT id
>             FROM units_of_work
>             WHERE started_at IS NULL
>             LIMIT 1
>             FOR UPDATE)
> RETURNING id
>
> This is a simplified version of what's actually happening, but illustrates
> the idea: different coordinators don't lock each other.
>
>
> On Wed, Jun 28, 2017 at 11:05 PM, Ilya Obshadko <ilya.obsha...@gmail.com>
> wrote:
>
> > I was actually looking at Spring Batch (and a couple of other
> solutions). I
> > don’t think Spring Batch could be of much help here.
> >
> > My conclusion is similar to what you are saying - implementing
> lightweight
> > job coordinator is much easier.
> >
> > Row-level locking works well when you are dealing with a simple queue
> table
> > - you do a pessimistic lock on N rows, process them and give a chance to
> > another host in the cluster. Unfortunately only one of my background jobs
> > is suitable for this type of refactoring.
> >
> > Other jobs process records that shouldn’t be locked for a considerable
> > amount of time.
> >
> > So currently I’m thinking of the following scenario:
> >
> > - pass deployment ID via environment to all containers (ECS can do this
> > quite easily)
> > - use a simple table with records containing job name, current cluster
> > deployment ID and state
> > - first background executor that is able to lock an appropriate job row
> > starts working, the other(s) are cancelled
> >
> >
> >
> > On Tue, Jun 27, 2017 at 10:16 PM, Dmitry Gusev <dmitry.gu...@gmail.com>
> > wrote:
> >
> > > Hi Ilya,
> > >
> > > If you have Spring in your classpath you may look at Spring Batch.
> > >
> > > For our projects we've built something similar -- a custom jobs
> framework
> > > on top of PostgreSQL.
> > >
> > > The idea is that there a coordinator service (Tapestry service) that
> runs
> > > in a thread pool and constantly polls special DB tables for new
> records.
> > > For every new unit of work it creates instance of a worker (using
> > > `ObjectLocator.autobuild()`) that's capable of processing the job.
> > >
> > > The polling can be optimised well for performance using row-level
> locks &
> > > DB indexing.
> > >
> > > Coordinator runs in the same JVM as the rest of the app so there's no
> > > dedicated process.
> > > It integrates with tapestry's EntityManager so that you could create a
> > job
> > > in transaction.
> > >
> > > When running in a cluster every JVM has its own coordinator -- this it
> > how
> > > the jobs get distributed.
> > >
> > > But you're saying that row-level locking doesn't work for some of your
> > > use-cases, can you be more concrete here?
> > >
> > >
> > > On Tue, Jun 27, 2017 at 9:35 PM, Ilya Obshadko <
> ilya.obsha...@gmail.com>
> > > wrote:
> > >
> > > > I’ve recently expanded my Tapestry application to run multiple hosts.
> > > While
> > > > it’s quite OK for the web-faced part (sticky load balancer does most
> of
> > > the
> > > > job), it’s not very straightforward with background jobs.
> > > >
> > > > Some of them can be quite easily distributed using database row-level
> > > > locks, but this doesn’t work for every use case I have.
> > > >
> > > > Are there any suggestions about this? I’d prefer not to have a
> > dedicated
> > > > process running background tasks. Ideally, I want to dynamically
> > > distribute
> > > > background jobs between hosts in cluster, based on current load
> status.
> > > >
> > > >
> > > > --
> > > > Ilya Obshadko
> > > >
> > >
> > >
> > >
> > > --
> > > Dmitry Gusev
> > >
> > > AnjLab Team
> > > http://anjlab.com
> > >
> >
> >
> >
> > --
> > Ilya Obshadko
> >
>
>
>
> --
> Dmitry Gusev
>
> AnjLab Team
> http://anjlab.com
>



-- 
Ilya Obshadko

Reply via email to