asp.net - MassTransit:为多个 API 实例配置队列
问题描述
我正在使用MassTransit和本地主机上的RabbitMQ 和实时环境上的AWS使用.NET 5 Web API将自己介绍给事件驱动的架构。
我有一个 API ( #API-1 ),它产生事件,例如EntityCreated、EntityUpdated、EntityDeleted等。
然后我有另一个 API ( #API-2 ) 存储实体的内存副本。此#API-2必须订阅这些事件才能更新其本地缓存。#API-2将有多个正在运行的实例,比如说 3。
- 我应该如何配置#API-2以便所有实例都收到相同的消息?
生产者配置(#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();
解决方案
您需要使用不同的端点名称。每个端点都有自己的队列和绑定,因此如果您使用相同的端点名称,您将获得一个队列并且所有实例开始竞争消息。
这是一个常见的错误,这就是为什么它甚至在文档中提到。
推荐阅读
- java - String replaceAll() method replace except string
- javascript - How to limit the number of selected check-boxes in React JS?
- ios - Way to dequeue multiple cells in UIcollectionview
- ios - Subclass of UIButton cant call the buttonType initializer
- c - C preprocessor adds trailing "1" after expanding a macro defined in a command line
- php - 将 Postman 请求转换为 guzzle 或其他 PHP HTTP 客户端
- docker - 如何使 docker 请求服务名称而不是 IP 地址
- sql-server - EncryptByPassPhrase 舍入大于 6 位的数字
- mysqli - getting the 1st row in a database
- c# - Is there is a way that program is not asking for Admin password?