如何在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 实现负载平衡:)
有什么方法可以使用 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 实现负载平衡:)