MassTransit 不会更新现有 Azure 服务总线队列的设置
MassTransit won't update settings for existing Azure Service Bus queue
如果我向特定队列发送消息,在创建队列之前,系统会自动为我创建一个队列。
问题是当添加新的 messages/queues 时会导致一种竞争条件。如果我的生产者服务在消费者服务启动之前启动并生成一条消息,那么将使用默认值创建一个新队列。当消费者服务启动时,我希望它会用我想要的特定配置重新配置现有队列,但它不会改变任何东西(AutoDeleteOnIdle
、MaxSizeInMegabytes
等)。
有推荐的方法吗? :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 服务总线支持的唯一值是 autodelete
和 type
(其中只有一个对结束有用用户)。
队列 description/settings 未更新,因为如果服务不一致,它们会不断更改。
更新:另一个原因是有些人使用资源管理器脚本(或类似 Terraform 的东西)部署他们的 topics/queues,如果 MassTransit 改变了他们,它会通过删除他们的自定义设置来破坏这些部署.
如果我向特定队列发送消息,在创建队列之前,系统会自动为我创建一个队列。
问题是当添加新的 messages/queues 时会导致一种竞争条件。如果我的生产者服务在消费者服务启动之前启动并生成一条消息,那么将使用默认值创建一个新队列。当消费者服务启动时,我希望它会用我想要的特定配置重新配置现有队列,但它不会改变任何东西(AutoDeleteOnIdle
、MaxSizeInMegabytes
等)。
有推荐的方法吗? :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 服务总线支持的唯一值是 autodelete
和 type
(其中只有一个对结束有用用户)。
队列 description/settings 未更新,因为如果服务不一致,它们会不断更改。
更新:另一个原因是有些人使用资源管理器脚本(或类似 Terraform 的东西)部署他们的 topics/queues,如果 MassTransit 改变了他们,它会通过删除他们的自定义设置来破坏这些部署.