Mongo is definitely NOT always consistent.

On Fri, Oct 5, 2012 at 10:14 PM, Evan <evantah...@gmail.com> wrote:

> You are basically proposing the schema for DelayedJobs (Ruby) [
> https://github.com/collectiveidea/delayed_job ].  This kind of thing gets
> really weird in eventually consistant databases, but Mongo (like mySQL) is
> always consistant so you should be OK.  However, a lot of folks have been
> finding some locking problems with this approach (multiple job execution or
> really aggressive table locking is needed), so most folks tend to use a
> store which can support atomic "push" and "pop" operations  so you can
> ensure that one and only one worker gets the job.  Redis is the most
> popular of these types of stores these day.  I make use of that property in
> http://actionherojs.com/ for exactly this purpose, as does the very
> popular https://github.com/defunkt/resque and some other projects.
>
>
> On Friday, October 5, 2012 12:32:39 PM UTC-7, Mark Hahn wrote:
>
>> I may be crazy but I'm implementing a scheme where processes get the
>> tasks from a db record and then stores their process number in that record.
>>  Then while they are running they periodically check to make sure that
>> their server number is still the one in the record.  If another process has
>> 'stolen' the task then the process aborts and looks for another one to do.
>>
>> This is the only way I could figure out how to do task assignment when
>> faced with a db that only has "eventual consistency".  The CouchDB i'm
>> using offers no atomic operations so this was the only reliable way to do
>> it.
>>
>> It works quite well.  In the usual case it just grabs the task, does it,
>> and moves on.  Collisions are rare, but they may be more frequent as the
>> cluster grows in size.
>>
>>
>> On Fri, Oct 5, 2012 at 9:21 AM, Dan Milon <danm...@gmail.com> wrote:
>>
>>> greelkorke ment using a job queue where jobs are put, and handed to
>>> workers.
>>>
>>> If you want to do it only with mongo, you'll need to use some "lock"
>>> document, that is set and unset by the first process which tries to
>>> initiate a task. All other processes which try to grab the lock while its
>>> held by another process should assume that the job is being worked by
>>> another process. But thats really ugly & has problems because jobs cant be
>>> acknowledged, so if a process crashes while its performing some task,
>>> you're fucked.
>>>
>>> On Fri, Oct 5, 2012 at 5:07 PM, Tom <tomm...@gmail.com> wrote:
>>>
>>>> Unfortunately I'm afraid that I don't see how a scheduler can avoid the
>>>> concurrency problems. Note that the advantages (e.g. in availability) of
>>>> having a cluster should be maintained here, and so you cannot run a
>>>> scheduler in a separate process on a single server. If every server would
>>>> be running the scheduler, the same concurrency problems would arise. What
>>>> were you proposing?
>>>>
>>>> About the initialization, I guess that would work. It is not the way I
>>>> would prefer to do it, as I would like the application to be
>>>> self-controlled and usable without running special tools, but I reckon it
>>>> is an acceptable approach.
>>>>
>>>> Tom
>>>>
>>>> Op vrijdag 5 oktober 2012 19:59:33 UTC+7 schreef greelgorke het
>>>> volgende:
>>>>
>>>>> i wouldn't do it that way. when deploying your app just do a pre-start
>>>>> script, that ensures the existence of your desired data.
>>>>> If you have periodical tasks, it's best to use a lib for it, that
>>>>> triggers jobs appart of your main application. i.E
>>>>> http://stackoverflow.com/**q**uestions/3785736/is-there-a-**jo**
>>>>> b-scheduler-library-for-**node-**js<http://stackoverflow.com/questions/3785736/is-there-a-job-scheduler-library-for-node-js>,
>>>>>  so you just avoid the concurrency problems.
>>>>>
>>>>> Am Freitag, 5. Oktober 2012 14:04:58 UTC+2 schrieb Tom:
>>>>>>
>>>>>> I've setup a cluster of physical servers. Each server runs exactly
>>>>>> the same code. Moreover, each server runs multiple node processes using
>>>>>> the build in cluster functionality.
>>>>>>
>>>>>> I use MongoDB (native) to share information between processes and
>>>>>> servers. However, I am having some difficulty with running a special task
>>>>>> that needs to be executed only once during initialization:
>>>>>> > if a special `admin` account does not yet exist in the database, it
>>>>>> should be created
>>>>>>
>>>>>> Originally I figured that I could read from the MongoDB master server
>>>>>> on each node and check if the admin account already exists. If it does 
>>>>>> not
>>>>>> then another node has not yet created it, so this node should do so.
>>>>>> However this is problematic because creating an admin password hash is
>>>>>> asynchronous and takes time. Therefore there is a delay between when a 
>>>>>> node
>>>>>> decides to create the account and when the account is being found by 
>>>>>> other
>>>>>> nodes when querying the database.
>>>>>>
>>>>>> The code snippet that reads from the Mongo master only and creates
>>>>>> the account is available here: 
>>>>>> https://gist.github.com/****3839429<https://gist.github.com/3839429>
>>>>>>
>>>>>> In the future I would also like a special task to be executed every 5
>>>>>> minutes. This task must then only be executed by a running server, and 
>>>>>> not
>>>>>> by all servers.
>>>>>>
>>>>>> In short: when running a cluster of servers, how do you coordinate
>>>>>> between these servers which of them is going to execute a sole task such 
>>>>>> as
>>>>>> the one described above?
>>>>>>
>>>>>> Tom
>>>>>>
>>>>>  --
>>>> Job Board: http://jobs.nodejs.org/
>>>> Posting guidelines: https://github.com/joyent/**node/wiki/Mailing-List-
>>>> **Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>> You received this message because you are subscribed to the Google
>>>> Groups "nodejs" group.
>>>> To post to this group, send email to nod...@googlegroups.com
>>>>
>>>> To unsubscribe from this group, send email to
>>>> nodejs+un...@**googlegroups.com
>>>>
>>>> For more options, visit this group at
>>>> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>
>>>
>>>  --
>>> Job Board: http://jobs.nodejs.org/
>>> Posting guidelines: https://github.com/joyent/**node/wiki/Mailing-List-*
>>> *Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>> You received this message because you are subscribed to the Google
>>> Groups "nodejs" group.
>>> To post to this group, send email to nod...@googlegroups.com
>>>
>>> To unsubscribe from this group, send email to
>>> nodejs+un...@**googlegroups.com
>>>
>>> For more options, visit this group at
>>> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>
>>
>>  --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to nodejs@googlegroups.com
> To unsubscribe from this group, send email to
> nodejs+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en
>

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to