4

我正在寻找一种在不使用MySQL的情况下序列化影响数据存储中数据的任务的方法, 例如:进行记账的工作人员group1应该是唯一对第一组进行记账的工作人员,如果另一名工作人员正在对第一组进行记账,则应该在队列中等待。

我可以通过设置信号量表、启动事务、更新 for 的行group1、执行我的任务并提交来使用 MySQL 完成此操作。

我在想也许可以使用 0mq redis 或某种消息传递系统来实现相同的目标,并允许我使用我想要的任何数据存储。我还认为ScalienDB可能能够在与 mysql 相同的庄园中解决问题,因为它支持事务。ScalaenDB的文档似乎有些不完整,所以我无法确定它是否可以以这种方式进行交易。
所以我的问题是:

  1. 如果ScalienDB想要编辑另一个客户端也已对其进行编辑的表中的行,那么ScalienDB是否可以执行强制客户端等待另一个客户端提交的事务。

  2. 使用消息传递系统,你会如何建议实现一些归结为这样的东西:

var semaphore = semaphore_group()
semaphore.acquire('task1',function(){
    // 在大二学生被锁定后做工作
    semaphore.release() //
})

理想情况下,我不希望该系统依赖于集中式代理

  1. 是否有适合此问题的替代解决方案
4

2 回答 2

1

我最喜欢 Node 的是无线程,这意味着每一行代码都可以被认为是原子的。因此,您可以轻松编写几行 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-system 或任何会增加我不喜欢的软件的复杂性和管理工作的东西。由于您已经在 Node 中构建了一些东西,并且它已经完美地提供了您想要的东西,我相信这是要走的路。

于 2012-07-04T19:01:03.233 回答
0

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

于 2013-02-15T12:53:08.730 回答