简体   繁体   中英

Nodejs- prevent concurrent async calls on clustered server

I'm running a Nodejs Express server in a clustered environment. The server gets hundreds of requests for the same resource.

While processing the request for this resource, I make an async call to another service(say service A), wait for its result, memoizes the promise call to service A in-memory and return the response for the request.

Because I'm running a clustered server, other workers start accepting requests for the same resource. And because the memoized promise for service A is per worker and the promise hasn't resolved yet, I end up making multiple calls for the same resource to Service A.

Is there a way I can prevent making these duplicate calls to service A whilst still working with a clustered environment.

You should use a shared memory for all cluster processes.

As mentioned , you can use redis, which is preferred if you need to scale beyond one Cluster machine.

But if you don't have a lot of data to memorize I would implement a super-simple key:value store with node-ipc (get,set)

All cluster process write&read from the same data source and it will solve your problem.

Another Approach

Create a micro service , Which calls API A,B,C on demand, and save the result to memory. You can also implement global throttling this way.

Then , the cluster gets requests , and calls your micro-service which either immediately return (result in cache) or calls api A.

PS - if you need to scale this micro service, you may better use redis and simply hook it to the cluster.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM