2012-04-28 65 views
4

我正在尋找一種方法來序列化影響數據存儲區中數據的任務而不使用MySQL ex: 對group1進行記帳的工人應該是唯一的工人對第一組進行會計覈算,如果另一名工人正在對第一組進行會計覈算,則應該排隊等候。distibuted semaphore system to serialize tasks that must not run on the same time

我可以通過設置信號表,啓動一個事務,在group1的行上執行更新,完成我的任務,並提交來完成這項工作。

我在想,也許0mq redis或某種消息系統可以用來實現相同的目標,並允許我使用我想要的任何數據存儲。 我也在想,ScalienDB可能能夠解決與mysql相同的莊園問題,因爲它支持事務。 ScalienDB的文檔似乎有些不完整,所以我無法確定它是否可以以這種方式進行交易。
所以我的問題是:
1.可以ScalienDB做交易,這將迫使客戶等待另一個客戶承諾,如果它想在另一個客戶端也做一個編輯的表格編輯一行。
2.使用郵件系統你會如何建議實施的東西,可以歸結爲這樣的事:

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

理想我不希望在一個集中的經紀人
3.這個系統依賴是有這將符合這一問題

+0

在這種情況下'二年級'是什麼? – Joe 2012-04-28 19:02:25

+0

我懷疑你的意思是信號量。 – 2012-04-28 19:09:18

+1

我的意思是信號量 – work4liberty 2012-04-28 19:31:44

回答

1

我最喜愛節點的東西替代的解決方案是無螺紋這意味着每行代碼可以被認爲是原子。因此,您可以輕鬆編寫幾行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或任何其他消息傳遞不是必需的。您可能會考慮向工作人員添加超時,並且每當發生超時時,都會向工作人員發送一條消息,詢問「您還在工作嗎?」並繼續按照這一點。你的超時處理程序還可以檢查隊列上是否有其他工人,所以如果沒有,甚至不需要打擾工人的時間...

我通常更喜歡使用我已經掌握的工具如果我需要的只是一個簡單的系統,而不是第三方,那麼我可以在這樣的一個小時內完成。任何其他庫/ dbms/messaing-system或其他任何操作都會增加我不喜歡的軟件的複雜性和管理困難。既然您已經在Node中構建了一些東西,並且它已經完美地提供了您想要的東西,我相信這是要走的路。

相關問題