gpt4 book ai didi

node.js - 防止多个 NodeJS 实例处理 Redis PubSub 事件

转载 作者:行者123 更新时间:2023-12-03 06:41:08 25 4
gpt4 key购买 nike

我有一个有趣的难题;我使用 Redis PubSub 模式在我的 NodeJS 微服务网络中发出事件。我离开了 RabbitMQ,因为我需要多播消息,以便多个微服务可以接收和处理相同的事件。因此,如果我发出 LOGOUT 事件,UserService 和 WebSocketService 都应该听到它。
这一直很好,直到我的客户端部署在每个微服务的多个实例运行的环境中。现在,给定 3 个 UserService 实例,所有实例都连接到 Redis,并且它们都接收并处理 LOGOUT 事件,这很糟糕。
因此,一方面我需要不同的微服务来监听事件,但另一方面我需要防止同一微服务的重复副本都处理事件。摇滚,遇到困难的地方。
到目前为止,我最好的想法有点老套,但类似于:

  • 不是引发事件,而是将事件列表写入 Redis 缓存
  • UserService 和 WebSocketService 可以每 3 秒读取一次该列表并检查需要处理的新事件
  • 当找到相关事件时,UserService 会将其“名称”添加到处理该事件的服务列表
  • 当 WebSocketService 看到该事件时,它仍然能够处理它并将其“名称”添加到处理程序列表
  • 当 UserService 的重复实例看到该事件时,它将在处理程序列表中看到它的“名称”并忽略该事件

  • 我不喜欢这个解决方案,因为该列表将在内存中而不是在临时消息中不断增长。此外,我必须开始添加代码来管理已经检查过的事件;否则,在每个周期中,所有服务的所有实例都必须再次解析整个列表。
    欢迎提出想法。

    最佳答案

    Redis streams似乎对您的用例有帮助。你检查了吗?
    我们可以有多个消费者组。与 pub/sub 一样,每个消费者组都希望从流中接收消息。 (这里的流就像发布/订阅 channel /主题)。但是,当一个消费者组内有多个 Node 时,只有一个 Node 会处理该事件。不是全部。 Node 可以确认它已处理的消息。

  • 重启后, Node 不会处理已经发送的消息
  • 流将继续增长。我们可以根据尺寸进行修剪。我们可以保留最新的 N 个元素。

  • enter image description here

    关于node.js - 防止多个 NodeJS 实例处理 Redis PubSub 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62888050/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com