【发布时间】:2020-11-03 08:51:03
【问题描述】:
我有一个有趣的难题;我使用 Redis PubSub 模式在我的 NodeJS 微服务网络中发出事件。我离开了 RabbitMQ,因为我需要多播消息,以便多个微服务可以接收和处理相同的事件。因此,如果我发出 LOGOUT 事件,UserService 和 WebSocketService 都应该听到它。
在我的客户端部署在每个微服务的多个实例运行的环境中之前,这一直很好。现在,给定 3 个 UserService 实例,所有实例都连接到 Redis,它们都接收并处理 LOGOUT 事件,这很糟糕。
因此,一方面我需要不同的微服务来听到事件,但另一方面我需要防止同一微服务的重复副本全部处理事件。摇滚,遇到困难的地方。
到目前为止,我最好的想法有点老套,但类似于:
- 不引发事件,而是将事件列表写入 Redis 缓存
- UserService 和 WebSocketService 可以每 3 秒读取一次该列表并检查需要处理的新事件
- 找到相关事件后,UserService 会将其“名称”添加到正在处理该事件的服务列表中
- 当 WebSocketService 看到事件时,它仍然能够处理它并将其“名称”添加到处理程序列表中
- 当 UserService 的重复实例看到该事件时,它会在处理程序列表中看到其“名称”并忽略该事件
我不喜欢这个解决方案,因为列表会在内存中不断增长,而不是在短暂的消息中。此外,我必须开始添加代码来管理已检查的事件;否则每个周期,整个列表都必须由所有服务的所有实例再次解析。
欢迎提出想法。
【问题讨论】:
标签: node.js redis publish-subscribe