MassTransit (C#) 中跨端点的并发限制

Posted

技术标签:

【中文标题】MassTransit (C#) 中跨端点的并发限制【英文标题】:Concurrency Limit across endpoints in MassTransit (C#) 【发布时间】:2017-12-12 21:37:07 【问题描述】:

公共交通 3.5, RabbitMq

我有一个总线连接服务,它监听队列的数量。

第一季度 第二季度 第三季度 第四季度 等等

所有队列都接受相同的消息类型,并且所有队列都使用竞争消费者模式,其中不同机器上的多个服务侦听这些相同的队列。

我所追求的是对所有这些队列一起设置并发限制,每个单个进程。

我的资源(可用许可证数量)有限,并且需要将并发请求限制为每台机器的可用许可证数量。

所以机器 A 可能有 4 个,机器 B 可能有 10 个,等等。

如果我已经有 4 个消费者处理所有队列中的消息,我不希望机器 A 使用所有这些队列中的任何消息,它应该让其他人(机器 B、C 等)在有可用资源的情况下使用它。

我的问题是使用

    sbc.UseConcurrencyLimit(4)

里面

    var bus = MassTransit.Bus.Factory.CreateUsingRabbitMq

正在设置每个队列的并发限制,所以如果我有 4 个,它们都会加起来。

我需要的是所有队列累积达到该并发限制,但不超过它。

MassTransit 中是否有实现此目标的内置方法?

【问题讨论】:

【参考方案1】:

没有一种内置方法可以限制多个服务的并发性。这需要使用某种类型的全局资源管理器,而 MassTransit 不支持开箱即用。

【讨论】:

以上是关于MassTransit (C#) 中跨端点的并发限制的主要内容,如果未能解决你的问题,请参考以下文章

未在代码中指定的交换上的MassTransit ACCESS_REFUSED

如何在 C# 中跨本地网络进行 UDP 多播?

MassTransit 与 Kafka 和 NodaTime

MassTransit:在消费者消费完所有消息后如何停止公共汽车?

C# - 在共享命名空间中跨文件使用命名空间

基于双门限法的端点检测