Поскольку очереди 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:)