【问题标题】:Notifying all consumers of a message通知所有消费者消息
【发布时间】:2018-09-24 09:02:59
【问题描述】:

我们正在使用 Rebus 4.2.1 和 RabbitMQ

我们想要实现的是让三个(或更多)实例上的处理程序都对同一消息做出反应。

据我了解(这可能是错误的)- .Publish 在 IBus 接口上应该完全做到这一点(我们一直在 MSMQ 上运行)。

RabbitMQ 的工作方式有什么我遗漏的吗?

(编辑:我认为 RabbitMQ 中使用的术语是“扇出”式消息)

EDIT2:mookid8000 让我走上了正轨——问题是每个副本都要求相同的队列。一旦我做到了这一点 - 一切都开始按预期(和预期)工作。

【问题讨论】:

标签: c# rabbitmq rebus rebus-rabbitmq


【解决方案1】:

使用 Rebus + RabbitMQ,这非常简单,因为 RabbitMQ 原生支持基于主题的发布/订阅消息传递。

在每个订阅者中,您只需调用

await bus.Subscribe<YourEvent>();

这将使Rebus从你的事件类型中生成一个主题字符串,然后将它绑定到订阅者的输入队列,然后在你的发布者中

await bus.Publish(new YourEvent(...));

然后每个订阅者将在其输入队列中获得事件的副本。

在幕后,Rebus 使用 RabbitMQ 的“主题交换”交换类型来完成这项工作。

【讨论】:

  • 感谢您的回答 - 然而,这正是我们正在做的事情,我们看到三个相同的消费者(除了在不同的机器上)只有一个得到他们的处理程序调用发布的每条消息。
  • 只是为了解释设置 - 我们有三个 webfronts,每个都调用它: var bus = Configure.With(new CastleWindsorContainerAdapter(container)) .Logging(l => l.Log4Net()) .Routing (t => t.TypeBased().AddEndpointMappingsFromAppConfig()) .Transport(t => t.UseRabbitMq(endpoints, "Xena.Web")) .Start();启动时
  • 如果只有一个实例收到了事件,那一定是因为他们正在从同一个队列接收消息.....?他们是一样的吗?
  • 它们完全相同(只是负载均衡器后面的三个实例)
  • 好吧,在这种情况下,您不能将相同的消息分发给所有人——他们总是会为您放入队列中的每条消息而竞争,这很好,因为这样您就可以轻松地分发工作均匀分布(这就是"Competing Consumers" 模式)
猜你喜欢
  • 2020-09-19
  • 2017-12-21
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 2017-09-23
  • 1970-01-01
相关资源
最近更新 更多