How to lock (Mutex) in NodeJS?

2019-03-04 08:23发布

问题:

There are external resources (accessing available inventories through an API) that can only be accessed one thread at a time.

My problems are:

  1. NodeJS server handles requests concurrently, we might have multiple requests at the same time trying to reserve inventories.
  2. If I hit the inventory API concurrently, then it will return duplicate available inventories
  3. Therefore, I need to make sure that I am hitting the inventory API one thread at a time
  4. There is no way for me to change the inventory API (legacy), therefore I must find a way to synchronize my nodejs server.

Note:

  • There is only one nodejs server, running one process, so I only need to synchronize the requests within that server
  • Low traffic server running on express.js

回答1:

I'd use something like the async module's queue and set its concurrency parameter to 1. That way, you can put as many tasks in the queue as you need to run, but they'll only run one at a time.

The queue would look something like:

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);

Then, to make an inventory API request, you'd do something like:

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
});


标签: node.js mutex