Как реализовать конкурирующий потребительский шаблон с ребусом на MSMQ - PullRequest
0 голосов
/ 09 мая 2018

Есть ли способ реализовать конкурирующую потребительскую программу в MSMQ с помощью Rebus?

Я надеялся просто указать точку потребителя в одной удаленной очереди, но, похоже, это не сработало.

Спасибо

Мэтт

1 Ответ

0 голосов
/ 10 мая 2018

Поскольку очереди MSMQ являются локальными на компьютере, а удаленный прием транзакций довольно неэффективен, нет смысла создавать реальных конкурирующих потребителей с MSMQ.

Именно поэтому настройка удаленной очереди в качестве входной очереди конечной точки просто невозможна с Rebus.

То, что вы можете сделать, это использовать возможности маршрутизации транспортных сообщений Rebus и вставить маршрутизатор, который будет функционировать как круговой балансировщик нагрузки, для пересылки сообщений отдельным работникам (которые затем могут свободно запускаться на других машинах). ).

Ваша отправная точка может выглядеть примерно так (где queue - это просто текущее имя входной очереди):

producer and consumer with single queue

Не изменяя ничего в Producer, вы можете установить Маршрутизатор для получения сообщений от queue, используя вышеупомянутые возможности пересылки транспортных сообщений для пересылки каждого сообщения одному из потребителей:

producer and multiple consumers with router in the middle

Маршрутизатор может быть реализован с помощью следующего кода:

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:)

...