MassTransit 确保在发布消息之前创建队列

Posted

技术标签:

【中文标题】MassTransit 确保在发布消息之前创建队列【英文标题】:MassTransit Ensure Queues Created before Publishing Messages 【发布时间】:2022-01-22 00:52:12 【问题描述】:

我们有多个服务并使用发布/订阅模式从服务 A 发送事​​件以由其他服务 (B & C) 处理。目标是允许多个队列通过匹配绑定键/主题来接收来自生产者的消息。

如果服务 B 和 C 先启动,这会很好。在这种情况下,Subscribe 方法创建 Exchanges 和 Queues 以在发布时接收消息。但是,如果服务 A 先启动,则发布的消息会丢失,因为没有创建接收队列。

寻找最佳实践方法以确保在发布前创建队列。生产者不了解消费者,并且随着时间的推移,对于给定的消息类型可能会有更多消费者,因此我们不能让生产者代码负责创建队列。

我们当前的实现是在背板上使用 RabbitMQ,但我们希望随着时间的推移迁移到 SQS 和 Azure 服务总线,因此我们需要它与 Message Broker 无关

【问题讨论】:

【参考方案1】:

简单的答案是,在启动发布者之前启动消费者服务。

或者,您可以使用带有自定义构建或命令行的DeployTopologyOnly 标志来部署队列/交换/绑定,而无需实际启动消费者,但它仍然是具有所有配置的消费者服务。

【讨论】:

谢谢,由于我们的系统是分布式的,即使我完全同意您的方法,我们也不能确保订阅者在 100% 的时间内首先上升。我们将研究您的建议(从这里开始masstransit-project.com/advanced/topology/deploy.html)我们可能会创建一个控制台应用程序,该应用程序在部署期间运行并检查我们程序集中的所有 IConsumer 实现,使用 DeployTopologyOnly = true 并将它们添加到 IRegistrationConfigurator 并运行 DeployAsync。

以上是关于MassTransit 确保在发布消息之前创建队列的主要内容,如果未能解决你的问题,请参考以下文章

如何托管MassTransit和RabbitMq

使用交换和使用 MassTransit 的路由密钥发布消息

是否可以使用 MassTransit 为 RabbitMQ 队列注册多个消费者?

MassTransit:在消费者消费完所有消息后如何停止公共汽车?

MassTransit / RabbitMQ - 为啥跳过这么多消息?

MassTransit一个优秀的.NET消息(事件)总线框架