我们正在将Masstransit与RabbitMq结合使用,以将RPC从我们系统的一个组件传递到其他组件。
最近,我们面临客户端吞吐量的限制,每秒大约完成80次响应。
在尝试调查问题出在哪里时,我发现请求已由RPC服务器快速处理,然后将响应放入回调队列,然后,队列处理速度为80 M \ s
此限制仅在客户端。在同一台计算机上启动同一客户端应用程序的另一个进程会使服务器端的请求吞吐量增加一倍,但是随后我看到两个填充有消息的回调队列正在以相同的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的新手,将感谢您解决我的问题。 希望可以通过配置方式修复
答案 0 :(得分:0)
您可以尝试一些方法来优化性能。我还建议您检查MassTransit-Benchmark并在您的环境中运行它-这将使您对代理的可能吞吐量有所了解。它允许您调整预取计数,并发等设置,以了解它们如何影响您的结果。
此外,我建议使用一个请求客户端来减少每个请求/响应的设置。例如,创建一次请求客户端,然后对每个请求使用相同的客户端。
var serviceUrl = yourMethodToGetIt<TRequest>(...);
var client = Bus.CreateRequestClient<TRequest>(serviceUrl);
然后,在需要执行请求时使用该IRequestClient<TRequest>
实例。
Response<Value> response = await client.GetResponse<TResponse>(new Request());
由于您仅使用RPC,因此强烈建议将接收端点队列设置为非持久,以避免将RPC请求写入磁盘。并将总线预取计数调整为更高的值(比您可能拥有的并发请求的最大数量高2倍),以确保始终将响应直接传递给等待的响应使用者(这是RabbitMQ传递消息的内部原因)。
var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.PrefetchCount = 1000;
}