Nack
является специфичным для RabbitMQ расширением протокола AMQP.Это позволяет потребителю сообщения уведомлять сервер, когда сообщение не было успешно обработано.Я предполагаю, что вы уже достигли этого.
Интересно, что AMQP изначально не считал Nack
необходимым.Зачем?Поскольку поведение AMQP, когда потребитель не может обработать сообщение, заключается в том, что потребитель закрывает соединение без ack
-ing сообщения .В этой ситуации сообщение автоматически помещается в очередь в том порядке, в котором оно было изначально, и доставляется следующему доступному потребителю с установленным флагом redelivered
.
Почему это будет?
, потому чтоNack
указывает на проблему с потребителем, а не с сообщением.Если само сообщение является плохим, AMQP предположил, что потребитель будет достаточно умен, чтобы распознать это, ack
сообщение, а затем предпринять любые другие шаги, разработанные программистом для обработки плохих сообщений.
RabbitMQ добавил Nack
функция, которая принимает параметр requeue
.По умолчанию requeue
- «истина», то есть брокер будет запрашивать сообщение.Это соответствует первоначальному замыслу дизайна AMQP.Однако, если вы передадите requeue
как ложное, брокер ответит сообщением недействительным.Это сокращение к поведению, которое обычно разрабатывалось интеллектуальным архитектором приложений с использованием AMQP, поэтому вы можете думать об этом как об удобстве для программиста.
Разница между двумя
В первом случае Nack
указывает на проблему с получателем сообщения.Потребитель должен отключиться, пока решает свои проблемы.Во втором случае Nack
указывает на проблему с сообщением.Первый случай - временная проблема, а второй - постоянный сбой.
Что, если я не могу обработать определенное сообщение прямо сейчас , но возможно позже?
Если ваша структура сообщений была разработана правильно, это никогда не будет правдой.Если для одного конкретного сообщения требуются пути обработки или ресурсы, отличные от другого сообщения, этот тип сообщения должен иметь свою собственную очередь.Потребители этой очереди могут перестать потреблять, когда зависимость для обработки этих сообщений отключена или недоступна.