There are external resources (accessing available inventories through an API) that can only be accessed one thread at a time.
My problems are:
- NodeJS server handles requests concurrently, we might have multiple requests at the same time trying to reserve inventories.
- If I hit the inventory API concurrently, then it will return duplicate available inventories
- Therefore, I need to make sure that I am hitting the inventory API one thread at a time
- 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
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
});
来源:https://stackoverflow.com/questions/25613227/how-to-lock-mutex-in-nodejs