【问题标题】:MassTransit - publish to all consumer instancesMassTransit - 发布到所有消费者实例
【发布时间】:2018-09-13 08:55:54
【问题描述】:

我正在为每个消费者实例寻找一种方法来接收通过 MassTransit 发布到 RabbitMQ 的消息。场景是,我们有多个微服务需要在通知时使缓存无效。 Pub-Sub 在这种情况下不起作用,因为每个服务实例将有 5 个与其相同代码相同类型的消费者,因此只有一个消费者会在传统 PubSub 中接收消息。

消息观察可能是一种选择,但这意味着消息永远不会被消费并永远在公共汽车上徘徊。

任何人都可以建议在 MassTransit 环境中使用的模式吗?

提前致谢。

【问题讨论】:

  • 如果你有竞争的消费者,你就是横向扩展。在这种情况下,拥有本地缓存​​是个坏主意。您不仅要处理所描述的奇异用例,而且还要独立填充每个缓存。如果您想水平扩展 - 也可以考虑使用一些分布式缓存。
  • @AlexeyZimarev 感谢您的来信。我们有一个非常复杂的分层模型,它保存在本地的易失性内存中,不能很好地序列化,因此我们需要使用进程内存储来提高速度。当此模型更改时 - 每周一次,所有实例都需要收到通知,以便从存储中补充其本地副本。

标签: masstransit


【解决方案1】:

您应该在每个服务中创建一个管理端点,它甚至可以是一个临时队列(只需请求一个不带队列名称的接收端点,就会动态生成一个)。然后,将您的队列失效消费者放在该端点上。每个服务实例都会收到一个唯一的消息实例(当调用 Publish 时),一旦服务退出,这些队列和绑定将自动删除。

这正是总线端点的工作方式,但在您的情况下,您正在创建一个接收端点,该端点可以具有消费者消息类型绑定,以便接收发布的消息,每个服务一个副本。

cfg.ReceiveEndpoint(cfg => { ... });

注意队列名没有指定,会自动生成唯一的。

【讨论】:

  • 非常感谢,这真的帮助了我!
  • 如何通过 ConsumerDefinition 实现这一行为?我找不到在 ConfigureConsumer 覆盖方法中设置接收端点名称的位置。
  • 我在Definition类的构造函数中将EndpointName设置为一些随机名称
  • 您也可以使用TemporaryEndpointDefinition - 它会生成一个临时端点名称。
猜你喜欢
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多