Массовое отправление сообщений не будет повторно подключаться

#rabbitmq #masstransit

#rabbitmq #массовый переход

Вопрос:

Мы используем RabbitMQ и MassTransit в качестве нашей инфраструктуры обмена сообщениями в нашем приложении.

У меня есть сценарий, в котором моему потребителю необходимо на некоторое время прекратить обработку сообщений, а затем перезапустить их в какой-то более поздний момент.

Я могу успешно остановить шину, и потребитель прекращает обработку дальнейших сообщений, но когда я перезапускаю шину, он сообщает, что шина уже запущена, но потребитель больше не получает сообщений для дальнейшей обработки

Пример кода выглядит следующим образом

 var iBusControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(new Uri("rabbitmq://localhost"), h =>
    {
        h.Username("guest");
        h.Password("guest");
    });

    if (linkConsumer)
        cfg.ReceiveEndpoint("TestMessage_Queue", x =>
        {
            x.Consumer<TestMessageConsumer>();
        });
});

iBusControl.Start();
// Consumer starts processing messages

// later on in the code I call stop on the same bus instance
iBusControl.Stop();
// Consumer stops processing messages    

// later on in the code I call start again on the bus instance
iBusControl.Start();
// Masstransit also says, bus already started
// But the consumer won't pick up any further messages for processing.
  

Шина, если я создам новый экземпляр шины, такой же, как в первом блоке моего кода, и вызову start на нем, он правильно подключит получателя, и обработка сообщения начнется снова. Несколько вопросов / недоразумений

  1. Это ожидаемое поведение?
  2. Удаляет ли остановка шины всю конфигурацию конечной точки приема?
  3. Почему я не могу запустить шину после ее остановки?

Использование MassTransit 5.3.3 с RabbitMQ 3.6.14 Erlang 20.1

Комментарии:

1. Я считаю, что шина не может быть запущена после того, как она была остановлена. Приложение необходимо перезапустить. Для меня то, что вы пытаетесь сделать, пахнет дизайном. Должен быть какой-то другой способ удовлетворить это требование.

2. Что мы пытаемся сделать, так это прекратить сбор дальнейших сообщений, если мы не можем обработать из-за нарушенной зависимости дальше по потоку. Приведенный выше пример не является производственным дизайном.

3. Необходимо использовать автоматический выключатель, повторную доставку и другие доступные методы. Все эти шаблоны широко известны и должным образом описаны.

4. Не хочу показаться грубым, я не ищу предложений по дизайну. Я знаком с этими шаблонами. Мой вопрос касается того, почему MassTransit ведет себя определенным образом.

5. Вы не можете перезапустить остановленный экземпляр шины. Вам необходимо перенастроить новый экземпляр и запустить его. Просто расширьте цикл перезапуска, включив в него перенастройку, и все будет в порядке.

Ответ №1:

С выпуском masstransit версии 7.1.0 шина может быть перезапущена после остановки. До этого это было невозможно.

Из примечаний к выпуску:

С момента создания MassTransit никогда не было возможности запустить шину, которая была ранее запущена, а затем остановлена. С этой версией теперь можно запускать, останавливать, запускать и останавливать шину, запускать и останавливать…