4

MySQLを使用せずにデータストア内のデータに影響を与えるタスクをシリアル化する方法を探しています 。例:アカウンティングをgroup1行うワーカーは、グループ1でアカウンティングを行う唯一のワーカーであり、別のワーカーがグループ1でアカウンティングを行う場合はキューで待機する必要があります。

MySQLでこれを実現するには、セマフォテーブルを設定し、トランザクションを開始し、の行を更新しgroup1、タスクを実行して、コミットします。

おそらく0mqredisまたはある種のメッセージングシステムを使用して同じ目標を達成し、必要なデータストアを使用できるようになると考えていました。また、ScalienDBは、トランザクションをサポートしていることを確認して、mysqlと同じ方法で問題を解決できる可能性があると考えていました。ScalienDBのドキュメントはやや不完全なように思われるので、その方法でトランザクションを実行できるかどうかはよくわかりません。
だから私の質問は:

  1. ScalienDBは、別のクライアントも編集を行ったテーブルの行を編集したい場合に、クライアントが別のクライアントのコミットを待機するように強制するトランザクションを実行できますか。

  2. メッセージングシステムを使用して、次のようなものを実装することをどのように提案しますか。

var semaphore = semaphore_group()
semaphore.acquire('task1'、function(){
    //2年生がロックインされた後に作業を行います
    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やその他のメッセージングは​​必要ありません。ワーカーにタイムアウトを追加することを検討してください。タイムアウトが発生するたびに、「まだ作業していますか?」というメッセージをワーカーに送信してください。それに応じて続行します。タイムアウトハンドラーは、キューに他のワーカーが存在するかどうかを確認することもできるため、存在しない場合は、ワーカーに時間を費やす必要はありません...

私は通常、このように1時間で構築できる単純なシステムだけが必要な場合は、サードパーティに行くよりも、すでに手元にあるツールを使用することを好みます。他のlibrary/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 に答える