【问题标题】:MassTransit: Configure queue for multiple API instancesMassTransit:为多个 API 实例配置队列
【发布时间】:2020-12-02 15:21:21
【问题描述】:

我正在使用 MassTransit 和本地主机上的 RabbitMQ 和实时环境上的 AWS 将自己介绍给事件驱动架构,使用 .NET 5 Web API.

我有一个生成事件的 API (#API-1),例如 EntityCreatedEntityUpdatedEntityDeleted强>等

然后我有另一个 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();

【问题讨论】:

    标签: asp.net rabbitmq queue publish-subscribe masstransit


    【解决方案1】:

    您需要使用不同的端点名称。每个端点都有自己的队列和绑定,因此如果您使用相同的端点名称,您将获得一个队列并且所有实例开始竞争消息。

    这是一个常见的错误,这就是为什么它在文档中甚至是 mentioned

    【讨论】:

    • 感谢您指出这一点。我假设我应该在队列名称后面加上一些唯一标识符,例如 MachineName。这是一个好习惯吗?此外,我认为我应该将这些队列标记为 AutoDelete,以便在关闭实例时将它们删除。
    【解决方案2】:

    要为您的消费者正确配置特定于实例的端点,您可以在添加消费者时使用Endpoint 配置。我已经更新了你的代码来展示如何使用它。

    string instanceId = "SomeUniqueValue";
    
    services.AddMassTransit(x =>
    {
        x.AddConsumer<EntityCreatedConsumer>()        
            .Endpoint(e => e.InstanceId = instanceId);
        x.AddConsumer<EntityUpdatedConsumer>()
            .Endpoint(e => e.InstanceId = instanceId);
        x.AddConsumer<EntityDeletedConsumer>()
            .Endpoint(e => e.InstanceId = instanceId);
    
        x.UsingRabbitMq((context, cfg) =>
        {
            cfg.ConfigureEndpoints(context);
        });
    });
    services.AddMassTransitHostedService();
    

    instanceId 可以从环境中提取,甚至是随机的。如果您希望在进程退出时移除队列,您可以指定:

    .Endpoint(e =>
    {
        e.InstanceId = instanceId;
        e.Temporary = true;
    });
    

    这是在v7.0.4中添加的

    【讨论】:

      猜你喜欢
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多