【问题标题】:Nodejs- prevent concurrent async calls on clustered serverNodejs-防止集群服务器上的并发异步调用
【发布时间】:2019-04-20 18:32:24
【问题描述】:

我在集群环境中运行 Nodejs Express 服务器。 服务器收到数百个对同一资源的请求。

在处理对该资源的请求时,我对另一个服务(例如服务 A)进行异步调用,等待其结果,在内存中记住对服务 A 的承诺调用并返回对请求的响应。

因为我运行的是集群服务器,其他工作人员开始接受对同一资源的请求。而且因为服务 A 的记忆承诺是每个工人的承诺,并且承诺尚未解决,所以我最终对服务 A 的同一资源进行了多次调用。

有没有办法可以在仍然使用集群环境的同时防止对服务 A 进行这些重复调用。

【问题讨论】:

  • 你能否通过 Redis 之类的服务将 Promise 结果缓存到内存中,然后任何时候你的自治工作人员收到对该资源的请求,只需执行对 Redis 的键查找调用,以查看是否有其他工作已经缓存了导致记忆?

标签: node.js concurrency node-cluster


【解决方案1】:

您应该为所有集群进程使用共享内存。

如前所述,您可以使用 redis,如果您需要扩展到一台集群机器之外,这是首选。

但是如果你没有很多数据要记住,我会使用 node-ipc (get,set) 实现一个超级简单的 key:value 存储

所有集群进程从同一个数据源读写,它会解决你的问题。

另一种方法

创建一个微服务, 它按需调用 API A、B、C,并将结果保存到内存中。 您也可以通过这种方式实现全局限制。

然后,集群获取请求,并调用您的微服务,该微服务要么立即返回(导致缓存),要么调用 api A。

P.S - 如果您需要扩展此微服务,您最好使用 redis 并将其简单地挂钩到集群。

【讨论】:

    猜你喜欢
    • 2018-10-31
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多