使用 Redis 的 MultiPublisher-MultiConsumer 队列

MultiPublisher-MultiConsumer Queue using Redis

  1. 我有多个监控服务 MonSvc(1..N),它们检测更改并发布这些更改。
  2. 我有多个服务对这些更新进行操作(例如 LoggerSvc & Enforcement-Svc

    Note: Consumer services needs all updates, and cannot miss an update.

我正在使用 Redis 作为我的协调器(代理),但我对如何实现它有点困惑。

选项 1:每个 MonSvc# 将更新发布到 Redis 频道,同时监控服务订阅
此设计失败,因为如果消费者服务出现故障,它可能会错过以后无法检索的更新

方案2:每个MonSvc# Enqueue更新到Redis List(Queue),而Consumers从queue中取元素
消费者不会接受所有更新,但每个人都会获得部分列表。

选项 3:每个 MonSvc# 将更新入队到多个 Redis 列表(队列)(queue/consumer),而消费者从队列中获取元素
这工作正常,但似乎扩展不佳(MonSvc# 需要知道它发布给谁+多少)

我怎样才能 "Multi-Publisher >> Multi-Consumer Queue" 使用 Redis(或者我应该使用更强大的代理?)

您正在寻找 Redis 5.0 中引入的带有消费者组的 Redis 流。看这里:https://redis.io/topics/streams-intro

有一个优秀的免费course for this is Redis University,推荐。

使用 Redis Streams,您可以实现您正在寻找的至少一次传递语义。

查看关键消费者组命令:

  • XGROUP is used in order to create, destroy and manage consumer groups.
  • XREADGROUP is used to read from a stream via a consumer group.
  • XACK is the command that allows a consumer to mark a pending message as correctly processed.