#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 на нем, он правильно подключит получателя, и обработка сообщения начнется снова. Несколько вопросов / недоразумений
- Это ожидаемое поведение?
- Удаляет ли остановка шины всю конфигурацию конечной точки приема?
- Почему я не могу запустить шину после ее остановки?
Использование MassTransit 5.3.3 с RabbitMQ 3.6.14 Erlang 20.1
Комментарии:
1. Я считаю, что шина не может быть запущена после того, как она была остановлена. Приложение необходимо перезапустить. Для меня то, что вы пытаетесь сделать, пахнет дизайном. Должен быть какой-то другой способ удовлетворить это требование.
2. Что мы пытаемся сделать, так это прекратить сбор дальнейших сообщений, если мы не можем обработать из-за нарушенной зависимости дальше по потоку. Приведенный выше пример не является производственным дизайном.
3. Необходимо использовать автоматический выключатель, повторную доставку и другие доступные методы. Все эти шаблоны широко известны и должным образом описаны.
4. Не хочу показаться грубым, я не ищу предложений по дизайну. Я знаком с этими шаблонами. Мой вопрос касается того, почему MassTransit ведет себя определенным образом.
5. Вы не можете перезапустить остановленный экземпляр шины. Вам необходимо перенастроить новый экземпляр и запустить его. Просто расширьте цикл перезапуска, включив в него перенастройку, и все будет в порядке.
Ответ №1:
С выпуском masstransit версии 7.1.0 шина может быть перезапущена после остановки. До этого это было невозможно.
Из примечаний к выпуску:
С момента создания MassTransit никогда не было возможности запустить шину, которая была ранее запущена, а затем остановлена. С этой версией теперь можно запускать, останавливать, запускать и останавливать шину, запускать и останавливать…