如何在msmq上用rebus实现竞争消费者模式

How to implement a competing consumer patter with rebus on msmq

有什么方法可以使用 Rebus 在 MSMQ 上实现竞争消费者模式吗?

我原本希望只让消费者指向一个远程队列,但这似乎行不通。

谢谢

马特

由于 MSMQ 队列在机器上是本地的,并且由于事务性远程接收效率很低,因此与 MSMQ 进行真正的竞争消费者是没有意义的。

这也是为什么使用 Rebus 无法将远程队列配置为端点的输入队列的原因。

你可以做的是使用 Rebus 的传输消息路由功能并插入一个路由器,它将充当循环负载平衡器,将消息转发给各个工作人员(然后可以自由地 运行 在其他机器上)。

您的起点可能是这样的(其中 queue 只是输入队列的当前名称):

无需更改 Producer 中的任何内容,您可以安装路由器以接收来自 queue 的消息,使用上述传输消息转发功能将每条消息转发给其中一个消费者:

路由器可以用类似下面的代码来实现:

var consumerQueueNames = new [] {
    "worker1",
    "worker2",
    "worker3"
};

var currentConsumerIndex = 0;

Configure.With(...)
    .Transport(t => t.UseMsmq("queue"))
    .Routing(r => {
        r.AddTransportMessageForwarder(async transportMessage => {
            var index = Interlocked.Increment(ref currentConsumerIndex) 
                        % consumerQueueNames.Length;

            var destination = consumerQueueNames[index];

            return ForwardAction.ForwardTo(destination);
        });
    })
    .Start();

我希望这能给你足够的灵感来使用 Rebus 和 MSMQ 实现负载平衡:)