使用 Redis 的 MultiPublisher-MultiConsumer 队列
MultiPublisher-MultiConsumer Queue using Redis
- 我有多个监控服务
MonSvc(1..N)
,它们检测更改并发布这些更改。
- 我有多个服务对这些更新进行操作(例如
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.
- 我有多个监控服务
MonSvc(1..N)
,它们检测更改并发布这些更改。 - 我有多个服务对这些更新进行操作(例如
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.