2016-03-05 3 views
0

Буду признателен Вам за это.Абонент RabbitMQ отправляет сообщение обратно в очередь RabbitMQ?

У меня есть приложение для узлов, которое подписывается на очередь RabbitMQ. Когда он получает сообщение, он что-то проверяет, а затем сохраняет его в базе данных.

Однако, если сообщение отсутствует, информация или некоторые другие критерии еще не выполнены, я хотел бы, чтобы подписчик опубликовал сообщение обратно в очередь RabbitMQ.

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

Благодарим за помощь.

+0

, когда сообщение что-то упустило, затем опубликуйте в той же очереди, которая получает сообщение от него? Если это так, вы можете установить 'autoack'' 'false ', и сообщение будет удалено из очереди, если вы не дадите ему. то, если в сообщении отсутствует что-то, no ack, и это сообщение останется в очереди без удаления.Если сообщение является goo, дайте ссылку на эту очередь, это сообщение будет удалено из очереди. – zangw

+0

@zangw да опубликовать в той же очереди, откуда оно было получено. (это трудно объяснить, но в сообщениях есть элемент времени, поэтому он может быть действителен через 5 минут, а не сейчас). –

ответ

1

Как я указываю в комментарии, когда вы создаете соединение с очередью и устанавливаете autoAck = true, чтобы включить подтверждение сообщения. Сообщение в очереди будет удалено до получения подтверждения.

Когда полученное сообщение отвечает требованиям, затем отправьте сообщение ack в эту очередь, и это сообщение будет удалено из очереди. В противном случае в очередь не отправляется сообщение ack, это сообщение останется в очереди.

Как вы упомянули в комментарии, действительный процесс может занять 5 минут, просто установите отправное сообщение ack как функцию обратного вызова функции проверки.

0

В вашем вопросе, вы описываете два критерия, когда сообщение не может быть обработано:

  1. если сообщение отсутствует некоторая информация или
  2. некоторые другие критерии еще не встречались

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

Вторая из них довольно расплывчата, но для целей этого ответа предполагается, что проблема связана не с сообщением, а с каким-либо другим компонентом системы (например, с проблемой подключения к сети). В этом случае приложение-потребитель может отправить сообщение Nack (negative acknowldegement), которое может дополнительно запросить сообщение.

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

Зачем использовать nack вместо простой переиздания?
Это установит флаг «redelivered» в сообщении, чтобы вы знали, что он был доставлен один раз уже. Есть other options, а также для обработки плохих сообщений.

Смежные вопросы