2014-09-01 107 views
0

有外部資源(通過API訪問可用清單),一次只能訪問一個線程。如何在NodeJS中鎖定(互斥)?

我的問題是:

  1. 服務器的NodeJS同時處理的請求,我們可能會在同一時間多個請求試圖保留庫存。
  2. 如果我打的庫存API同時,那麼它將返回重複可用庫存
  3. 所以,我必須確保我打庫存API一個線程在同一時間
  4. 沒有辦法,我更改庫存API(遺留),因此我必須找到一種方法來同步我的nodejs服務器。

注:

  • 只有一個服務器的NodeJS,運行一個過程,所以我只需要在該服務器
  • 低流量的服務器上運行express.js內的請求同步

回答

1

我會使用類似async模塊的queue,並將其參數concurrency設置爲1。這樣,您可以根據需要將盡可能多的任務放入隊列中,但它們一次只能運行一個。

隊列看起來是這樣的:

var inventoryQueue = async.queue(function(task, callback) { 
    // use the values in "task" to call your inventory API here 
    // pass your results to "callback" when you're done 
}, 1); 

然後,使庫存API請求時,你會做這樣的事情:

var inventoryRequestData = { /* data you need to make your request; product id, etc. */ }; 
inventoryQueue.push(inventoryRequestData, function(err, results) { 
    // this will be called with your results 
});