Сообщение считается обработанным после ack от consumer. Без ack при отключении канал сообщение возвращается в очередь (или в DLQ при настройке). Nack (requeue=true) возвращает в очередь; requeue=false отбрасывает или отправляет в DLQ. В Go: после успешной обработки channel.Ack(deliveryTag, false). При ошибке - Nack с requeue в зависимости от политики (ретраи без requeue через DLQ предпочтительнее при постоянной ошибке).
err := process(msg)
if err != nil {
ch.Nack(d.Tag, false, false) // в DLQ
return
}
ch.Ack(d.Tag, false)