Как обработать сбой приложения после чтения события из источника в Spring Cloud Stream с помощью rabbit MQ - PullRequest
0 голосов
/ 11 октября 2019

Я использую Spring Cloud Stream поверх RabbitMQ для своего проекта. У меня есть процессор, который читает из источника, обрабатывает сообщение и публикует его в приемнике. Верно ли мое понимание того, что если мое приложение получает событие из потока и завершается ошибкой (например, внезапная смерть приложения):

  • , если я не подтвердил сообщение или
  • , я сохраню сообщение послечитая его из очереди

тогда мое событие будет потеряно? Какой еще вариант я бы выбрал, чтобы не потерять событие в таком случае?

1 Ответ

1 голос
/ 14 октября 2019

DIbing в документации Rabbit-MQ Я нашел эту очень полезную страницу для различных типов очередей и доставки сообщений для RabbitMQ, и большинство из них можно использовать с AMPQ. В частности, глядя на пример рабочей очереди для Java, я нашел именно тот ответ, который искал:

Подтверждение сообщения

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

Чтобы убедиться, что сообщение никогда не теряется, RabbitMQ поддерживает подтверждения сообщений. Потребитель отправляет ack (nowledgement), чтобы сообщить RabbitMQ, что конкретное сообщение было получено, обработано и что RabbitMQ может удалить его.

Если потребитель умирает (его канал закрыт, соединение установлено)закрыто или соединение TCP потеряно) без отправки подтверждения RabbitMQ поймет, что сообщение не было обработано полностью, и поставит его в очередь. Если в то же время в сети есть другие потребители, он быстро доставит их другому потребителю. Таким образом, вы можете быть уверены, что ни одно сообщение не будет потеряно, даже если рабочие иногда умирают.

Нет тайм-аутов сообщений;RabbitMQ повторно доставит сообщение, когда потребитель умрет. Это нормально, даже если обработка сообщения занимает очень-очень много времени.

Ручные подтверждения сообщений включены по умолчанию. В предыдущих примерах мы явно отключали их с помощью флага autoAck = true. Пришло время установить этот флаг на false и отправить правильное подтверждение от работника, как только мы закончим с задачей.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...