【发布时间】:2015-02-16 10:47:04
【问题描述】:
我正在寻找一种方法来设计我的系统,该系统由多个发布者、多个渠道和多个订阅者组成,所有这些都可以轻松地进行唯一标识。 我需要以尽可能低的延迟向两个方向发送消息。但是,如果订阅者死了,他订阅的消息不应该被丢弃,当它重新上线时,它应该会收到所有待处理的消息。由于我在使用低规格服务器的同时处理非常多的消息(经常每秒发生 1000 条消息),这意味着始终保留所有消息的列表不是一种选择。
我正在考虑消息的引用计数/列表是否是一个可行的选择。发布消息时,会使用该特定频道的订阅者列表对其进行初始化,当订阅者收到消息时,将从列表中删除订阅者。如果列表为空,则删除消息。
现在,如果订阅者在没有取消订阅的情况下死亡,消息将不会被删除,因为丢失的订阅者列表不为空。当它重新上线时,它将能够接收所有待处理消息的列表,因为它使用与死实例相同的 ID 进行标识。
可能需要让消息/订阅者超时,例如,如果订阅者 10 分钟不活动,则包含它的所有列表条目都将被清除。
这是个好主意,我是否忘记了该系统可能出现的问题?有没有任何系统已经这样做了? RabbitMQ 和类似的 PubSub 系统似乎没有这个 - 如果没有,我猜 redis 是要走的路?
【问题讨论】:
标签: publish-subscribe reference-counting