Подтверждение сообщения
Выполнение задачи может занять несколько секунд. Вас может удивить, что произойдет, если один из потребителей начнет долгое задание и умрет, выполнив его лишь частично. С нашим текущим кодом, как только RabbitMQ доставит сообщение потребителю, он сразу же пометит его для удаления. В этом случае, если вы убьете работника, мы потеряем сообщение, которое он только что обработал. Мы также потеряем все сообщения, которые были отправлены этому конкретному работнику, но еще не были обработаны. Но мы не хотим терять никаких задач. Если работник умирает, мы хотели бы, чтобы задачу доставили другому работнику.
Чтобы убедиться, что сообщение никогда не теряется, RabbitMQ поддерживает подтверждения сообщений. Потребитель отправляет ack (nowledgement), чтобы сообщить RabbitMQ, что конкретное сообщение было получено, обработано и что RabbitMQ может удалить его.
Если потребитель умирает (его канал закрыт, соединение установлено)закрыто или соединение TCP потеряно) без отправки подтверждения RabbitMQ поймет, что сообщение не было обработано полностью, и поставит его в очередь. Если в то же время в сети есть другие потребители, он быстро доставит их другому потребителю. Таким образом, вы можете быть уверены, что ни одно сообщение не будет потеряно, даже если рабочие иногда умирают.
Нет тайм-аутов сообщений;RabbitMQ повторно доставит сообщение, когда потребитель умрет. Это нормально, даже если обработка сообщения занимает очень-очень много времени.
Ручные подтверждения сообщений включены по умолчанию. В предыдущих примерах мы явно отключали их с помощью флага autoAck = true. Пришло время установить этот флаг на false и отправить правильное подтверждение от работника, как только мы закончим с задачей.
Подумав об этом, использование ACK кажется логичной вещью,Причина, по которой я раньше не думал об этом, заключается в том, что я думал о ACK только с точки зрения издателя, а не брокера. Часть документации выше была очень полезна для меня.