distibuted信号量系统序列化不能在同一时间运行的任务

我正在寻找一种方法来序列化影响数据存储中的数据的任务,而不使用MySQL ex:在group1上执行记帐的工作人员应该是唯一一个在第一组上进行记帐的工作人员,并且如果另一个工作人员正在对第一组进行记帐, 。

我可以通过设置信号表来实现这一点,启动一个事务,在group1的行上进行更新,完成我的任务,然后提交。

我在想,也许0mq redis或某种消息传递系统可以用来实现相同的目标,并允许我使用我想要的任何数据存储。 我也在想,ScalienDB可能能够解决与mysql相同的庄园问题,因为它支持交易。 ScalienDB的文档似乎有些不完整,所以我不能确定它是否可以以这种方式进行交易。
所以我的问题是:
1. ScalienDB可以执行一个事务来强制客户端等待另一个客户端提交,如果它想要编辑另一个客户端也做了编辑的表中的一行。
2.使用消息传递系统,你会如何build议实现一些归结为这样的东西:

var semaphore = semaphore_group() semaphore.acquire('task1',function(){ // do work after a sophomore is locked in semaphore.release() // }) 

理想情况下,我不希望这个系统依赖于一个集中的经纪人
3.有没有一个可以解决这个问题的替代解决scheme

我最喜欢Node的东西是no-threads ,这意味着每一行代码都可以被认为是primefaces的 。 因此,您可以轻松地编写几行JS代码,这些代码将运行一个套接字服务器,为您的工作人员提供您想要的示例代码中所示的确切机制。

我不确定技术上称这个信号量是否正确,因为我们跟踪了等待轮到的工人。

工人:

 var Semaphore = reqire('./semaphore.js'), semaphore = new Semaphore(worker-id, group-id); semaphore.on('ready', function() { // Yay! We can work..! semaphore.done(); } 

semaphore.js骨架:

 // imports... module.exports = S = function(gid) { events.EventEmitter.call(this); // create socket connection to semaphore server // send a message for lock on gid // emit ready event when server sends ready message. // send 'done' message when done() method is called. }; util.inherits(S, events.EventEmitter); 

semaphore-server.js骨架:

 // imports... var queues = {}; // { 'group-id': [worker1, worker2, ...] } // start socket server /* on message: take worker-id and group-id queues[groupid].push(workerid); check if queues[groupid][0]==workerid and if it is, send back ready message. */ /* on message 'done', remove workerid from queues[groupid] and if there are any workers waiting, send the first one ready message. */ 

你的代码不会比上面这个框架长得多。 对于这种简单的消息系统,ZeroMQ或任何其他消息传递都不是必需的。 你可能会考虑给工作人员增加超时时间,每当超时发生时,向工作人员发出一个信息,询问“你还在工作吗? 并继续按照这一点。 您的超时处理程序还可以检查队列上是否有其他工作人员,如果没有,则甚至不必为时间打扰工作人员。

我通常更喜欢使用手头已经有的工具,而不是去第三方,如果我需要的只是一个简单的系统,我可以在一个小时内完成。 任何其他库/ dbms / messaing-系统或任何将增加复杂性和pipe理drudgery到我不喜欢的软件。 由于您已经在Node中构build了一些东西,而且它已经完美地提供了您想要的东西,所以我相信这是要走的路。

我会考虑使用像Apache Zookeeper这样的分布式协调服务来创build和处理分布式锁。 这是一个描述你将如何去做的食谱:http: //zookeeper.apache.org/doc/trunk/recipes.html#sc_recipes_Locks