Sorry, I should have been more clear: Mongo in a cluster (as Dan points out) is 
certainly not `always consistent`. I got the impression that your 
implementation had many node servers reading from a single mongo server.  If 
thats the case, then that one server will be consistent with itself :D

Sorry for the confusion!  

On Friday, October 5, 2012 at 4:14 PM, Dan Milon wrote:

> Mongo is definitely NOT always consistent.
> 
> On Fri, Oct 5, 2012 at 10:14 PM, Evan <evantah...@gmail.com 
> (mailto: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/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 
> > > > > > > 
> > > > > > > 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
> > > > > 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
> > > > 
> > > > -- 
> > > > 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 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
> > > 
> > -- 
> > 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 
> > (mailto:nodejs@googlegroups.com)
> > To unsubscribe from this group, send email to
> > nodejs+unsubscr...@googlegroups.com 
> > (mailto:nodejs%2bunsubscr...@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 
> (mailto:nodejs@googlegroups.com)
> To unsubscribe from this group, send email to
> nodejs+unsubscr...@googlegroups.com 
> (mailto: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