【问题标题】:Multiple AWS Instances and Node events多个 AWS 实例和节点事件
【发布时间】:2019-11-25 13:00:28
【问题描述】:

我在节点中有一个实现,其中调用 API 时会进行一些处理,并在返回响应之前等待来自另一个函数的事件。这在本地运行和在 AWS 中的单个实例中运行时工作正常,但是当涉及多个实例时,我假设存在一些问题,因为 API 是从一个实例调用的,而发射器是在另一个实例中发射的。有什么方法可以在所有实例中保持监听器和发射器相同?

更新:

经过一些研究,我发现使用带有一些路由逻辑的应用程序负载均衡器可以帮助解决这个问题。我将下面的答案标记为正确,因为虽然它对 AWS 自动缩放没有帮助,但它确实帮助我找到了解决问题的替代方案。

【问题讨论】:

    标签: node.js amazon-web-services amazon-elastic-beanstalk


    【解决方案1】:

    AFAIU,您认为从一个进程发出的事件正在另一个进程中处理,但据我所知,情况绝不会如此,因为每个进程都有自己的内存,而且事件只会与进程相关联。

    我添加了一个示例代码来演示我的意思。也许如果您发布您所指的代码,我们可以检查出了什么问题。

    const cluster = require("cluster");
    const EventEmitter = require("events");
    
    if (cluster.isMaster) {
      cluster.fork();
      const myEE = new EventEmitter();
      myEE.on("foo", arg =>
        console.log("emitted from ", arg, "received in master")
      );
      setTimeout(() => {
        myEE.emit("foo", "master");
      }, 1000);
    } else {
      const myEE = new EventEmitter();
      myEE.on("foo", arg => console.log("emitted from", arg, "received in worker"));
      setTimeout(() => {
        myEE.emit("foo", "client");
      }, 2000);
    }
    

    【讨论】:

    • 嗨 Kiran,我尝试了这个实现,但我面临的问题是,如果一个事件在一个分支中发出,那么其他分支中的所有其他侦听器也应该能够接收到该事件并处理它。这可能吗?
    • @Vinaayakh 我认为您的要求与您在问题中所说的不同,但我可以为您的要求提出一些解决方案。您可以做的就是使用process.send(msg); 从worker 发送消息,然后让master 使用worker.send('hi there'); 将消息重新发送给所有其他worker。或者最好和首选的方法是使用 redis(redis.io/topics/pubsub) 或 node-ipc(npmjs.com/package/node-ipc) 设置发布/订阅。更多想法请参考stackoverflow.com/questions/55400905/…
    猜你喜欢
    • 2014-08-18
    • 2020-08-19
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多