如何在RabbitMQ中实现循环主题交换
我知道在主题交换中实现循环行为可能很棘手或不可能,所以我的问题实际上是,我是否可以从RabbitMQ中了解到什么,或者看看其他支持这种行为的消息队列 以下是我的申请要求的详细说明:如何在RabbitMQ中实现循环主题交换,rabbitmq,apache-kafka,message-queue,amazon-kinesis,Rabbitmq,Apache Kafka,Message Queue,Amazon Kinesis,我知道在主题交换中实现循环行为可能很棘手或不可能,所以我的问题实际上是,我是否可以从RabbitMQ中了解到什么,或者看看其他支持这种行为的消息队列 以下是我的申请要求的详细说明: 将有一个制作人,我们称之为P 可能会有成千上万的消费者,让我们称他们为Cn 每个消费者可以“订阅”一个或多个主题交换,多个消费者可以订阅同一主题 发布到主题中的每条消息只能由一个使用者使用 用例#1 假设: 话题 foo.bar foo.baz 消费者 消费者C1已订阅主题# 消费者C2已订阅主题foo.* 消
P
Cn
foo.bar
foo.baz
- 消费者
已订阅主题C1
#
- 消费者
已订阅主题C2
foo.*
- 消费者
已订阅主题C3
*.bar
p
发布以下消息:
foo.qux
:C1
和C2
可能会使用此消息,但只有一个人会收到它foo.bar
:C1
,C2
和C3
可能会使用此消息,但只有一个人会收到它直接交换
不起作用,因为主题组合的数量可能很大(成千上万)
据我所知,RabbitMQ没有现成的解决方案。是否有人知道一种变通方法,或者有另一种消息队列解决方案支持这种方法,例如Kafka、Kinesis等
谢谢看来,交换的作用是路由消息,而队列的作用是为等待处理的消息提供等待位置。将消息导入一个或多个队列是exchange的工作,而将消息从队列导入多个使用者是队列的工作。循环赛只对后者起作用 基本上,
主题
交换通过复制消息进行操作,每个队列对应与消息发布的主题。因此,任何对循环行为的期望都是错误的,因为它违背了主题
交换的定义
所有这些都是为了证明,根据定义,问题中提出的情景没有意义。这并不意味着期望的行为是不可能的,但术语和拓扑结构可能需要一些明确的调整
让我们退一步,看看一条消息所描述的生命周期:它只由一个生产者生产,由许多消费者中的一个消费。通常情况下,这是直接交换解决的方案。其中的复杂因素是,您的消费者对他们将使用的消息类型是有选择性的(或者,换句话说,您的生产者对其生成的消息类型不一致)
通常在面向消息的处理中,单个消息类型对应于单个使用者类型。因此,每种不同类型的消息都将获得自己相应的队列。但是,根据本问题中给出的描述,单个消息类型可能对应于多个不同的使用者类型。我的一个问题是以下声明:
不幸的是,我不能为每个“主题”设置单独的队列
从表面上看,这句话毫无意义,因为它真正说的是你有任意多(事实上,数量未知)的消息类型;如果是这样的话,那么您将如何编写代码来处理它们呢
因此,暂时忽略该语句,我们将看到RabbitMQ开箱即用的两种可能性:
现在,这两个都没有明确涉及循环要求。由于没有解释这一点为何重要或如何重要,因此假定可以忽略这一点。如果没有,则需要进一步定义问题空间。虽然我理解这个问题,并且发现它在理论上非常有趣(这可以说是100%足够提出这个问题),但我也很好奇这个问题的用例。在我看来,主题交换的目的是发布关于“主题”的消息,并让“人们”对接收它的某种类型的消息感兴趣。我不认为从主题交换中“生产/消费”有什么用处,但我肯定错了。就我个人而言,除了使用一些数据存储推迟获胜消费者的选举外,我看不到任何其他办法。我可能错了,我对卡夫卡和动觉知之甚少。我的观点是:如果必须通知所有(或部分)消费者消息已发送,那么就使用主题交换。如果只有一个消费者必须以生产者/消费者的方式使用消息,则使用直接或扇出交换。如果你两个都需要,两个都用!向两家交易所发布。但是这并不能解决问题,事实上,因为你会有错误的消费者消费。顺便说一句,虽然我不是卡夫卡专家,但我99%肯定这不会有帮助(甚至会更糟),因为它根本没有路由的概念。无论好坏,它都是酒吧/酒吧,这意味着它对制片人/消费者的东西都没有帮助