0

我们正在研究使用 redis 流作为集群范围的消息传递总线,其中集群中的每个节点都有一个唯一的 id。这个想法是,每个节点在生成时都会创建一个具有该唯一 ID 的消费者组到中央 redis 流,以保证集群中的每个节点都获得每条消息的副本。在一个编排的环境中,集群节点将在运行中生成和删除,每个节点都有一个唯一的 id。随着时间的推移,我可以看到这导致有 100 个甚至 1000 个旧的/未使用的消费者组都订阅了同一个 redis 流。

我的问题是——redis可以处理的消费者群体的数量是否有上限,大量(未使用的)消费者群体是否有任何实际处理成本?似乎消费者组只是存储在redis中的一个指针,它指向流中的最后一个读取条目,并且仅在该组的消费者执行范围XREADGROUP时才被访问。这将导致我假设(无需深入研究 Redis 代码)消费者组的数量确实无关紧要,除了消费者组指针会占用的少量 RAM。

现在,我知道我们应该更聪明,一个节点应该在它被杀死时删除它自己的消费者组,或者我们应该定期清理它,但是如果一个消费者组只是 redis 中的一条记录,我不确定值得付出努力 - 至少在 MVP 开发阶段。

TL;博士; 我的理解是否正确,给定流的消费者组数量没有实际限制,除非使用它们没有处理成本?

4

1 回答 1

1

您的理解是正确的,CG 的数量没有实际限制,并且这些不会影响操作性能。

也就是说,除了浪费的 RAM(这可能会变得很重要,具体取决于组中的消费者数量和 PEL 条目),这将增加调用的时间复杂度XINFO STREAM ... FULLXINFO GROUPS因为这些会列出 CG。一旦你有大量的 CG,对它们的每次调用都会变慢(并在服务器执行时阻塞服务器)。

因此,我仍然建议为“陈旧”的 CG 实施某种类型的“垃圾收集”,也许在 MVP 完成后就可以了。与任何计算资源(例如磁盘空间、网络、互斥体...)一样,鉴于没有免费的午餐,CG 也需要进行管理。

PS IIUC,您计划在每个组中使用一个消费者,并让每个 CG/消费者对应于应用程序集群中的一个节点。如果是这种情况,我不确定您是否需要 CG,您可以使用更简单的XREAD(而不是XREADGROUP),同时将最后一个 ID 保留在节点中。

OTOH,假设我遗漏了一些东西并且确实需要这种使用模式,我想 Redis 能够通过为空闲组提供某种形式的到期来更好地支持它。

于 2021-12-13T13:54:48.843 回答