- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在玩 PreFetch,并试图弄清楚为什么 PreFetch 在队列的管理界面上总是设置为 0。在 RabbitMQ 管理界面中,我可以看到 channel 上配置的 Prefetch,但看不到队列本身。我还注意到它们被注册为“全局”而不是“每个消费者”,但对于我的生活,我似乎无法在 MassTransit 中找到改变它的设置,尽管我猜我有一个误解关于这是如何工作的,文档并没有帮助给我一个 ELI5。
这是一个示例配置:
var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(
new Uri(busSettings.HostAddress),
h =>
{
h.Username(busSettings.Username);
h.Password(busSettings.Password);
});
cfg.ReceiveEndpoint(
host,
"TEST-QUEUE-PF",
ec =>
{
ec.Consumer<MyConsumer>(context);
ec.PrefetchCount = 50; // consumer specific
ec.UseConcurrencyLimit(1); // consumer specific
});
cfg.PrefetchCount = 100; // bus control specific
cfg.UseConcurrencyLimit(1); // bus control specific
});
private class BusModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(GetType().Assembly).As<IConsumer>();
builder.Register(context =>
{
var busSettings = context.Resolve<BusSettings>();
var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(
new Uri(busSettings.HostAddress),
h =>
{
h.Username(busSettings.Username);
h.Password(busSettings.Password);
});
cfg.ReceiveEndpoint(
host,
$"TEST-QUEUE-GLOBAL", // shared queue name for all nodes
ec =>
{
ec.PrefetchCount = 50;
ec.UseConcurrencyLimit(2);
ec.Consumer<MyConsumer>(context);
ec.EnablePriority(5);
ec.UseRetry(retryConfig =>
{
retryConfig
.Intervals(new[] { 1, 2, 4, 8, 16, 32 }
.Select(t => TimeSpan.FromMinutes(t))
.ToArray());
retryConfig
.Handle<HttpRequestException>();
retryConfig
.Handle<SwaggerException>(ex => ex.IsRetryValid());
});
});
cfg.PrefetchCount = 100;
cfg.UseConcurrencyLimit(2);
cfg.UseSerilog();
var correlationIdProvider = context.Resolve<ICorrelationProvider>();
cfg.ConfigurePublish(x => x.UseExecute(sendContext =>
{
sendContext.CorrelationId =
sendContext.CorrelationId == Guid.Empty ?
correlationIdProvider.GetId() : sendContext.CorrelationId; // cascade
}));
});
return busControl;
})
.SingleInstance()
.As<IBusControl>()
.As<IBus>();
}
}
最佳答案
首先,我假设您使用的是较旧版本的 MassTransit,因为从 v6 开始,切换是为了远离全局预取。
其次,高预取计数与 1 的并发限制相结合将导致 (prefetchcount - 1) 条消息位于接收端点上等待处理,而一次处理 1 条消息。因此,如果只有 50 条消息,第一个节点可能会全部获取它们,然后您的其他节点处于空闲状态,因为消息正在单个节点上等待通过瓶颈。
带有 channel 预取的 RabbitMQ 管理控制台的当前版本如下所示:
由于 MassTransit 仅将单个消费者放在 channel 上,以前的方法本质上将消费者限制在全局 channel 预取中,但现在它更加明确。此外,新设置适用于不支持全局预取设置的仲裁队列。
如果您的数据库重载,并且已经优化了数据库查询以避免锁定/阻塞,并且需要减少流量,请将预取降低到接近并发限制的 140%。所以,说真的,如果你是 1,请将 prefetch 设置为 2。
关于c# - MassTransit - PrefetchCount 和单个消费者的多个 channel 的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61492494/
公共(public)交通中的 ConcurrencyLimit 和 PrefetchCount 有什么区别?以及它们的优化配置是什么。 最佳答案 PrefetchCount 是代理级设置。它向 Rab
我一直在玩 PreFetch,并试图弄清楚为什么 PreFetch 在队列的管理界面上总是设置为 0。在 RabbitMQ 管理界面中,我可以看到 channel 上配置的 Prefetch,但看不到
如何设置 prefetchCount为这个队列消费者开启? @Bean public Queue eventQueue(AmqpAdmin amqpAdmin) { Queue queue =
当将 Azure ServiceBus 主题订阅与多个竞争使用者结合使用时,我只能在未设置 SubscriptionClient 的 PrefetchCount 时让使用者进行循环。 当指定任何 Pr
我有一个队列处理器,它从 ServiceBus 队列中检索所有消息。我想知道如何确定 MessageReceiver PrefetchCount和 ReceiveBatch messageCount以
我是一名优秀的程序员,十分优秀!