Мы используем Masstransit с RabbitMq для создания RPC от одного компонента нашей системы к другим.
Недавно мы столкнулись с ограничением пропускной способности на стороне клиента, измерив около 80 завершенных ответов в секунду.
Пытаясь выяснить, в чем проблема, я обнаружил, что запросы обрабатывались сервером RPC быстро, затем ответы помещались в очередь обратного вызова, а затем скорость обработки очереди составляла 80 М\с.
Это ограничение только на стороне клиента. Запуск другого процесса того же клиентского приложения на той же машине удваивает пропускную способность запросов на стороне сервера, но затем я вижу две очереди обратного вызова, заполненные сообщениями, каждая из которых потребляет те же 80 М\с.
Мы используем один экземпляр IBus
builder.Register(c =>
{
var busSettings = c.Resolve<RabbitSettings>();
var busControl = MassTransitBus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri(busSettings.Host), h =>
{
h.Username(busSettings.Username);
h.Password(busSettings.Password);
});
cfg.UseSerilog();
cfg.Send<IProcessorContext>(x =>
{
x.UseCorrelationId(context => context.Scope.CommandContext.CommandId);
});
}
);
return busControl;
})
.As<IBusControl>()
.As<IBus>()
.SingleInstance();
Логика отправки выглядит так:
var busResponse = await _bus.Request<TRequest, TResult>(
destinationAddress: _settings.Host.GetServiceUrl<TCommand>(queueType),
message: commandContext,
cancellationToken: default(CancellationToken),
timeout: TimeSpan.FromSeconds(_settings.Timeout),
callback: p => { p.WithPriority(priority); });
Кто-нибудь сталкивался с проблемой такого рода? Я предполагаю, что в логике отправки ответов есть какой-то программный предел. Это может быть максимальный размер пула потоков или размер буфера, а также счетчик предварительной выборки очереди ответов. Я пытался поиграться с размером пула потоков .Net, но ничего не помогло.
Я новичок в Masstransit и буду признателен за любую помощь в решении моей проблемы. Надеюсь, это можно исправить в конфигурации