首页 > 解决方案 > MassTransit 中是否有对命名空间消费者的开箱即用支持?

问题描述

我正在使用 MassTransit 并且有这样的项目结构:

Api1 (Publisher)
   - (Instance 1) Publishes PersonCreatedEvent

Worker1 (Consumer)
   - (Instance 1) Consumes PersonCreatedEvent via PersonCreatedEventConsumer
   - (Instance 2) Consumes PersonCreatedEvent via PersonCreatedEventConsumer

Worker2 (Consumer)
   - (Instance 1) Consumes PersonCreatedEvent via PersonCreatedEventConsumer
   - (Instance 2) Consumes PersonCreatedEvent via PersonCreatedEventConsumer

我的目标是Api1发布PersonCreatedEvent两者Worker1Worker2接收消息并根据正在运行的实例数量循环处理它。

Worker1在使用 .NET Core DI 容器和Worker2.NET Core DI 容器中注册我的消费者时,我看到在 RabbitMQbusConfigurator.AddConsumer<PersonCreatedEventConsumer>中只创建了一个名为的队列。PersonCreatedEvent

考虑到消息与 MassTransit 中的命名空间一起使用,我希望创建以下队列名称:

Worker1.PersonCreatedEvent
Worker2.PersonCreatedEvent

包括命名空间似乎也是一个明智的默认设置。根据我所看到的行为,任何命名的类PersonCreatedEventConsumer(甚至跨项目)都将开始使用相同的队列。

我可以通过手动指定每个端点来解决这个问题,Worker如下所示:

busConfigurator
    .AddConsumer<PersonCreatedEventConsumer>()
    .Endpoint(e => e.Name = typeof(PersonCreatedEventConsumer).FullName);

注意:虽然指定端点有效,但似乎在 RabbitMQ 中也为我的消费者创建了 Exchange。为什么是这样?这些端点不应该只是队列,因为它们是消费者吗?

是否有针对命名空间消费者的开箱即用解决方案,还是我应该继续遵循我一直遵循的模式来指定我的端点?

标签: c#.net-corerabbitmqmasstransit

解决方案


默认端点名称格式化程序在格式化端点名称时不包括命名空间,它仅使用名称类型。您可以指定自己的端点名称格式化程序,而不是为每个使用者指定一个端点,方法是将其添加到容器中,或者在调用时显式指定ConfigureEndpoints

DefaultEndpointNameFormatter的源代码应该会给您一个良好的开端。

至于您的注释,请参阅文档的代理拓扑部分以了解 MassTransit 如何配置 RabbitMQ。


推荐阅读