大众运输+ RabbitMQ。在两种不同的消息类型之间共享一个队列

Posted

技术标签:

【中文标题】大众运输+ RabbitMQ。在两种不同的消息类型之间共享一个队列【英文标题】:Masstransit+ RabbitMQ. Share one queue among two different message types 【发布时间】:2017-12-12 03:52:34 【问题描述】:

我有一个发布者,它将消息发布到 rabbitmq://localhost/test123 队列。一条消息具有 TestMessage 类型,另一条消息具有 TestMessage2 类型。

发布者配置:

 sbc.UseRabbitMq(r => r.ConfigureHost(new MessageUrn("rabbitmq://localhost/test123"), c =>  ));
 sbc.UseLog4Net();
 sbc.UseJsonSerializer();
 sbc.EnableMessageTracing();
 sbc.ReceiveFrom(new MessageUrn("rabbitmq://localhost/test123"));

每种消息类型有两个单独的消费者(2 个消费者),消费者 1:

  //config stuff
  sbc.ReceiveFrom("rabbitmq://localhost/test678?prefetch=20");
  sbc.Subscribe(subs =>  subs.Handler<TestMessage>(msg =>  Logger.Info(msg.Text); ); );

消费者2:

 //config stuff
 sbc.ReceiveFrom("rabbitmq://localhost/test678");
            sbc.Subscribe(
                subs =>
                
                    subs.Handler<TestMessage2>(
                        msg =>  Logger.Info(String.Format("rcv:txt= 0, number= 1", msg.Text, msg.Number)); );
                );

因此,当我停止发布者并运行其中一个消费者时,他会使用他类型的所有消息并将其他消息移动到错误队列中。 Exchange for test678 对这两种类型都有绑定。

两个不同的消费者在将其他消息移动到错误队列时尝试读取他们的消息是正常行为吗?为什么我不能在具有不同兴趣类型的不同消费者之间共享一个队列?

(我认为这不是公共交通问题,而是rabbitmq设计考虑或限制)

提前致谢。

【问题讨论】:

【参考方案1】:

如果您有多个服务总线实例从同一个队列接收,您需要确保在该服务总线实例上注册的消费者是相同的。否则,服务消费的消息将被移动到该服务实例上没有消费者的消息类型的 _error 队列中。

【讨论】:

非常感谢你,克里斯。还有一个问题:是因为队列(在这种情况下是rabbitmq)将消息推送给消费者吗?因此,如果消费者不知道如何处理此消息类型,他会将其移至错误队列。我相信如果有消费者方面的投票,这种情况是可以避免的...... 没有轮询之类的东西,无论如何都没有关系,因为 RMQ 不区分消息类型。

以上是关于大众运输+ RabbitMQ。在两种不同的消息类型之间共享一个队列的主要内容,如果未能解决你的问题,请参考以下文章

nodejs操作消息队列RabbitMQ

消息中间件-----AMQP概论rabbitMQ入门

消息中间件-----AMQP概论rabbitMQ入门

Salesforce - 我可以在两种不同的对象类型上有一个查找字段吗?

事件驱动架构 全面了解Kafka和RabbitMQ选型 -两种不同的消息传递方式

如何在 .Net 中使用不同类型的消费者使用 RabbitMq 消息?