我正在使用.NET 5 Web API将MassTransit与localhost上的RabbitMQ以及实时环境中的AWS结合使用,从而将自己介绍给事件驱动的架构。
我有一个API(#API-1),它会产生事件,例如EntityCreated,EntityUpdated,EntityDeleted等。
然后,我有另一个API(#API-2),用于存储实体的内存中副本。这#API-2必须订阅这些事件,以更新其本地缓存。该#API-2将有多个正在运行的实例,让我们说3。
生产者配置(#API-1):
services.AddMassTransit(x =>
{
x.UsingRabbitMq();
});
services.AddMassTransitHostedService();
使用者配置(#API-2):
services.AddMassTransit(x =>
{
x.AddConsumer<EntityCreatedConsumer>();
x.AddConsumer<EntityUpdatedConsumer>();
x.AddConsumer<EntityDeletedConsumer>();
x.UsingRabbitMq((context, cfg) =>
{
cfg.ConfigureEndpoints(context);
});
});
services.AddMassTransitHostedService();
你需要使用不同的端点名称。每个终结点都有自己的队列和绑定,因此,如果使用相同的终结点名称,则会得到一个队列,并且所有实例都开始争夺消息。
这是一个常见的错误,这就是为什么在文档中甚至提到了它。
感谢您指出了这一点。我假设我应该在队列名称后加上一些唯一的标识符,例如MachineName。这是一个好习惯吗?此外,我相信我应该将这些队列标记为“自动删除”,以便在关闭实例后将其删除。