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容器中的Worker2busConfigurator.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。