问题描述
我正在使用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
,其中Worker1
和Worker2
都接收到该消息并根据正在运行的实例进行循环处理。
在使用Worker1
在.NET Core DI容器中的Worker2
和busConfigurator.AddConsumer<PersonCreatedEventConsumer>
中注册我的使用者时,我看到在其中仅创建了一个名为PersonCreatedEvent
的队列。 RabbitMQ。
考虑到消息可与Masstransit中的名称空间一起使用,我希望创建以下队列名称:
Worker1.PersonCreatedEvent
Worker2.PersonCreatedEvent
包含名称空间似乎也是明智的默认选择。根据我所看到的行为,任何名为PersonCreatedEventConsumer
的类(甚至跨项目)都将开始消耗相同的队列。
我可以通过手动在每个Worker
中指定端点来解决此问题,如下所示:
busConfigurator
.AddConsumer<PersonCreatedEventConsumer>()
.Endpoint(e => e.Name = typeof(PersonCreatedEventConsumer).FullName);
注意:尽管指定端点有效,但似乎在RabbitMQ中也为我的使用者创建了交易所。为什么是这样?这些端点不应该是队列,因为它们是使用者?
是否为命名空间的使用者提供了一个开箱即用的解决方案,还是我应该继续遵循我一直遵循的指定端点的模式?
解决方法
默认端点名称格式器在格式化端点名称时不包括名称空间,仅使用名称类型。您可以通过将其添加到容器中,或在调用ConfigureEndpoints
时显式指定,而不是为每个使用者指定一个端点名称格式化程序。
DefaultEndpointNameFormatter的source应该为您提供良好的开端。
关于您的注释,请参阅文档的broker topology部分,以了解MassTransit如何配置RabbitMQ。