2012-04-28 25 views
4

MySQLを使わずにデータストア内のデータに影響を及ぼすタスクをシリアル化する方法を探しています 例: group1でアカウンティングを行っているワーカーは、グループ1のアカウンティングを実行し、別のワーカーがグループ1のアカウンティングを行っている場合はキュー内で待機する必要があります。同時に実行してはいけないタスクをシリアル化するためにセマフォシステムを分散させるための分散セマンティックシステム

これは、セマフォテーブルを設定し、トランザクションを開始し、グループ1の行を更新し、自分のタスクを実行し、コミットすることでMySQLでこれを達成できます。

私はおそらく、0mq redisや何らかのメッセージングシステムを使用して同じ目標を達成し、私が今までにデータストアを使用できるようになったと考えていました。 また、ScalienDBがトランザクションをサポートしていることを確認するmysqlと同じ魔法の問題をScalienDBが解決できるかもしれないと考えていました。 ScalienDBのドキュメントは多少不完全であるように思われます。そのような方法でトランザクションを実行できるかどうかはまだ分かりません。
私の質問は次のとおりです。
1. ScalienDBは、別のクライアントも編集を行ったテーブルの行を編集する場合、クライアントが別のクライアントのコミットを待つようにするトランザクションを実行できます。
2.あなたはこのような何かに沸く何か実装することをお勧めどのようにメッセージングシステムを使用して:理想的には私は、集中ブローカーに依存
3にこのシステムを望んでいないだろう

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

がありますこの問題に合う代替ソリューションは、私がノードについて最も愛する

+0

この文脈では「何か」とは何ですか? – Joe

+0

セマフォを意味すると思います。 –

+1

私はsemaphoreを意味しました – work4liberty

答えて

1

事は、コードのすべての行がアトミック考えることができる意味ノースレッドではありません。したがって、JSコードのほんの数行を簡単に書くことができます。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); 

セマフォ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時間で構築できるシンプルなシステムです。他のライブラリ/ dbms/messaing-systemなど、私が嫌う私のソフトウェアには複雑さと管理の煩わしさが加わります。既にNodeに何かを構築していて、あなたが望むものをすでに完全に提供しているので、これは道のりです。

関連する問題