MassTransit 不会更新现有 Azure 服务总线队列的设置

MassTransit won't update settings for existing Azure Service Bus queue

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

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

一般指导是消费服务应该在生产服务之前 deployed/started。并且在启动之前不应使用公共汽车。

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

队列 description/settings 未更新,因为如果服务不一致,它们会不断更改。

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