Мы используем Masstransit с RabbitMq для создания RPC из одного компонента нашей системы в другие.
Недавно мы столкнулись с ограничением пропускной способности на стороне клиента, измеряемым около 80 завершенных ответов в секунду.
При попытке выяснить, в чем проблема, я обнаружил, что запросы RPC-сервером быстро обрабатывались, затем ответы помещались в очередь обратного вызова, а затем скорость обработки в очереди составляла 80 М \ с
Этопредел только на стороне клиента.Запуск другого процесса того же клиентского приложения на том же компьютере удваивает пропускную способность запросов на стороне сервера, но затем я вижу, что используются две очереди обратного вызова, заполненные сообщениями, каждая с одинаковыми 80 M \ s
Мыиспользуется один экземпляр 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 и буду признателен за любую помощь в решении моей проблемы.Надеюсь, что это может быть исправлено в конфигурации