【发布时间】:2017-07-20 03:43:00
【问题描述】:
我知道在主题交换中实现循环行为可能很棘手或不可能,所以我的问题实际上是我是否可以从 RabbitMQ 中获得任何东西,或者转向支持它的其他消息队列。
下面是我的申请要求的详细说明:
- 会有一位制作人,姑且称之为
P - (可能)会有成千上万的消费者,我们称他们为
Cn - 每个消费者可以“订阅”一个或多个主题交换,并且多个消费者可以订阅同一个主题
- 发布到主题的每条消息都应仅由一个消费者使用
用例 #1
假设:
主题
foo.barfoo.baz
消费者
- 消费者
C1订阅了主题# - 消费者
C2订阅了主题foo.* - 消费者
C3订阅了主题*.bar
生产者P 发布以下消息:
- 发布
foo.qux:C1和C2可能会使用此消息,但只有一个人会收到它 - 发布
foo.bar:C1、C2和C3可能会使用此消息,但只有一个人会收到它
注意
不幸的是,我不能为每个“主题”设置单独的队列,因此使用 Direct Exchange 不起作用,因为主题组合的数量可能很大(数万)
据我所知,RabbitMQ 没有开箱即用的解决方案。有没有人知道解决方法或者有另一个消息队列解决方案可以支持这个,例如。 Kafka、Kinesis 等。
谢谢
【问题讨论】:
-
虽然我理解这个问题并且发现它在理论上非常有趣(这可以说是 100% 足以在 SO 上提问),但我也很好奇这个用例。在我看来,主题交换旨在发布关于“主题”的消息,并让“人们”对接收它的某种类型的消息感兴趣。看不出从主题交换中“生产/消费”有什么用处,但我一定是错的。就个人而言,除了使用某些数据存储来推迟获胜消费者的选举之外,我没有看到任何其他方法。我可能错了,我对 Kafka 和 Kinesis 了解不多。
-
我的观点是:如果必须通知所有(或部分)消费者已发送消息,则使用主题交换。如果只有一个消费者必须以生产者/消费者的方式消费消息,则使用直接或扇出交换。如果两者都需要,请同时使用!发布到两个交易所。但这并不能解决问题,事实上,因为你会有错误的消费者消费。
-
顺便说一句,虽然我不是 Kafka 专家,但我有 99% 的把握它在这里不会有帮助(甚至会更糟),因为它根本没有路由的概念。无论好坏,它都是 pub/sub,这意味着它甚至对生产者/消费者的东西都没有帮助。请注意,即使是 RabbitMQ 也不保证一次性交付。
-
@user1527491 不幸的是,我不能对实际的真实用例说太多(因为 NDA 和其他东西),但我已尽力解释这一点。我确实同意这是非常具有挑战性(且有趣)且有趣的事情要解决。我能想到的另一个例子是: > 想象多个彩票,每个彩票有一个或多个参赛者,每个参赛者可以参加一个或多个彩票,但每个彩票只有一个参赛者中奖者。
-
@user1527491 是的,经过几天的检查,似乎没有办法用纯 RabbitMQ 或任何其他消息队列来实现这一点,这非常可悲和令人失望。现在转移到事件驱动的数据库(RethinkDB)看看它提供了什么。
标签: rabbitmq apache-kafka message-queue amazon-kinesis