【发布时间】:2015-06-21 03:43:22
【问题描述】:
我正在尝试设计一种重播机制,使用户能够重播队列中的消息。 对于包含多个队列和多个消费者的交换,我提出的最佳设计是:
-
创建一个记录器服务,它将:
- 创建一个队列并将所有路由键绑定到它。
- 使用来自交换的所有消息。
- 将所有消息保存到数据库。
-
订阅者请求重播。
- 每个订阅者创建一个新的交换、队列并使用与其常规队列相同的绑定绑定到它。
- 订阅者向 Web 服务器发送休息请求以使用过滤器(开始日期等)开始重播。请求包含其重播交换名称。
- Web 服务器从数据库中提取数据并将其发布到特定的交换器
- 可以添加改进,例如附加 RequestId 并将其回显。
问题:
1. 这有意义吗?
2. 我在发明轮子吗?有兔子固有的解决方案吗?插件?
3. 创建多个交易所是否被认为是一种好的做法?
在这个解决方案中,为每个队列创建了一个交换,以便发布相同的消息。
另一种解决方案:
1. 为每个队列创建一个附加队列“ReplayQueue”。设置一个 TTL(假设是一个月)。
2. 每次用户请求重放时,让他从自己的 ReplayQueue 中重放而不需要确认。
这个解决方案有点问题,因为。
- 为了重播最后一天,消费者必须获取之前的所有 29 天并将它们过滤掉。
- 此解决方案可扩展 - 队列将变得更大(与可以扩展的数据库存储不同)。
【问题讨论】:
-
整个问题看起来非常基于意见,但没有任何具体要求,很难回答您的任何子问题。你的应用应该是实时的吗?队列解决了什么问题?你需要排队吗?您是否需要访问队列中的消息(随机访问队列)?
-
Rabbitmq 不是这个恕我直言的最佳解决方案。你考虑过 Kafka 吗?
标签: rabbitmq message-queue replay