.Net Core RabbitMQ/Masstransit 同一应用程序中每个可配置线程数一个消费者

Posted

技术标签:

【中文标题】.Net Core RabbitMQ/Masstransit 同一应用程序中每个可配置线程数一个消费者【英文标题】:.Net Core RabbitMQ/Masstransit one consumer per configurable number of threads in same app 【发布时间】:2021-10-31 13:24:15 【问题描述】:

我可以创建一个workerservices来创建和配置n个RabbitMQ消费者,每个消费者都是自己的线程,用于应用内负载平衡。

我是 Masstransit 的新手,我不知道如何配置我想要的方式。我发现这段代码在 configureservices 中使用消息类型队列:

   // MassTransit-RabbitMQ Configuration
        services.AddMassTransit(config => 

            config.AddConsumer<BasketCheckoutConsumer>();

            config.UsingRabbitMq((ctx, cfg) => 
                cfg.Host(Configuration["EventBusSettings:HostAddress"]);
                cfg.UseHealthCheck(ctx);

                cfg.ReceiveEndpoint(EventBusConstants.BasketCheckoutQueue, c => 
                    c.ConfigureConsumer<BasketCheckoutConsumer>(ctx);
                );
            );
        );
        services.AddMassTransitHostedService();

        // General Configuration
        services.AddScoped<BasketCheckoutConsumer>();

问题是,如果我运行从 0 到 n-1 的循环,运行这条线 services.AddScoped&lt;BasketCheckoutConsumer&gt;();

这个箱子会产生 n 个消费者吗?也就是说,消费者从同一个队列中获取消息。

我的方向是否正确?

【问题讨论】:

【参考方案1】:

MassTransit 中的消费者不会连续使用线程。消费者也在单个消息处理的范围内被实例化,因此在涉及消费者实例的数量时谈论线程是没有意义的。

MassTransit 在 IO 方面是完全异步的,它会实例化同一消费者的多个实例来处理负载。您可以通过在配置中设置ConcurtrentMessageLimit 来指定给定接收端点需要多少并发消费者,因为它是described in the docs。还要记住adjust the prefetch count,这样您才能真正获得所需的并发级别。

【讨论】:

在接收端点上设置 ConcurrentMessageLimit 优于添加 UseConcurrencyLimit。 谢谢@ChrisPatterson,我会更新答案 @ChrisPatterson 顺便说一句,文档说“ConcurrentMessageLimit 仅传递给支持它的传输(当前为 Azure 服务总线)” 是的,我需要将文档更新为match the release notes。 我阅读了更多内容,发现我需要使用单个消费者类配置“竞争消费者模式”的方法。我没有找到如何在启动类中配置它的单个示例,您能提供一个示例吗?

以上是关于.Net Core RabbitMQ/Masstransit 同一应用程序中每个可配置线程数一个消费者的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core (.NET Core) and ASP.NET Core (.NET Framework)区别

net/core/pktgen.c怎么修改

细说.net core Startup

Asp.net core 配置文件

asp.net core 注入后仍然报错?

Asp.Net core (Full .Net framework) vs Asp.Net core (.Net Core) 性能