2014-09-01 78 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 
});