【问题标题】:MassTransit won't update settings for existing Azure Service Bus queueMassTransit 不会更新现有 Azure 服务总线队列的设置
【发布时间】:2021-06-11 12:17:06
【问题描述】:

如果我向特定队列发送消息,在创建队列之前,将自动为我创建一个队列。

问题在于,当添加新消息/队列时,它会导致一种竞争条件。如果我的生产者服务在消费者服务启动之前启动并产生一条消息,那么将使用默认值创建一个新队列。当消费者服务启动时,我希望它会使用我想要的特定配置重新配置现有队列,但它不会改变任何东西(AutoDeleteOnIdleMaxSizeInMegabytes 等)。

有推荐的方法吗? :thinking: 接收(和订阅端点)是否应该由所有服务全局配置,以便“第一个获胜”?

生产者服务:

private void ConfigureMassTransit(IServiceCollection services, string asbConnectionString)
{
    services.AddMassTransit(x =>
    {
        x.UsingAzureServiceBus((context, cfg) =>
        {
            cfg.Host(asbConnectionString);
        });
    });

    services.AddMassTransitHostedService(true);
}

...

private async SendAsync() {
    var sendEndpoint = await _bus.GetSendEndpoint(IMyCommand.QueueUri);
    await sendEndpoint.Send<IMyCommand>(new MyCommand { CommandText = $"The time is {DateTimeOffset.Now}" });
}

消费者服务:

private void ConfigureMassTransit(IServiceCollection services, string asbConnectionString)
{
    services.AddMassTransit(x =>
    {
        x.AddConsumer<MyCommandConsumer>();

        x.UsingAzureServiceBus((context, cfg) =>
        {
            cfg.Host(asbConnectionString);
        
            cfg.ReceiveEndpoint(IMyCommand.QueueName, configurator =>
            {
                configurator.PublishFaults = false;
                configurator.AutoDeleteOnIdle = TimeSpan.FromDays(30);
                configurator.MaxSizeInMegabytes = 2048;
                configurator.ConfigureConsumeTopology = false;

                configurator.ConfigureConsumer<MessageCommandConsumer>(context, consumerConfigurator =>
                {
                    consumerConfigurator.UseConcurrencyLimit(20);
                    consumerConfigurator.UseMessageRetry(r => r.Interval(2, 100));
                });
            });
        });
    });

    services.AddMassTransitHostedService(true);
}

【问题讨论】:

    标签: azureservicebus masstransit azure-servicebus-queues


    【解决方案1】:

    一般指导原则是,应在生成服务之前部署/启动使用服务。并且公共汽车在它启动之前不应该使用。

    虽然可以将某些值指定为目标地址上的查询参数,但 Azure 服务总线仅支持 autodeletetype(其中只有一个对最终用户有用)。

    队列描述/设置不会更新,因为如果服务不一致,它们会不断变化。

    更新:另一个原因是有些人使用资源管理器脚本(或类似 Terraform)部署他们的主题/队列,如果 MassTransit 更改它们,它会通过删除他们的自定义设置来破坏这些部署。

    【讨论】:

    • 好的!一个有点相关的问题:主题配置。你认为谁应该为此负责?发布事件的那个还是消费它的那个?我想我在想的是有多个发布者和/或消费者。但是,是的。我刚看到你的编辑。我想这对我来说最有意义。让 Terraform/ARM 配置/创建队列和主题,并让 MassTransit 使用它们。
    • 嗯,这不是我的建议,只是分享一些公司在有特定需求的配置时所做的事情。配置发布拓扑应该是一个共同的问题,生产者和消费者都需要知道,因为它正在改变默认行为。我通常将自定义项放入 Contracts 程序集中,以便跨服务共享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    相关资源
    最近更新 更多