Чем принципиально отличается ack от reject (requeue=false)? Оба же удаляют сообщения

из очереди?

54 ответов

111 просмотров

Во-первых, лучше использовать nack, а не reject. Во-вторых, nack позволит перевести сообщение в dlq, а ack — нет.

Reject обрабатывается в dlx, reject это отклонение сообщения, а аск - потдверждение обработки

Юрий- Автор вопроса
Vadim
Во-первых, лучше использовать nack, а не reject. В...

Спасибо за ответ. Если отколенное сообщение больше точно не нужно и не хочется занимать место в памяти (диске) отклонёнными сообщениями, то нужно просто ack отправить?

Юрий
Спасибо за ответ. Если отколенное сообщение больш...

Под отклонением тут понимают "невозможность десериализации сообщения" например, а не бизнес ошибки

Юрий
Спасибо за ответ. Если отколенное сообщение больш...

Лучше сделать reject. Сейчас вам эти сообщения не нужны а завтра вы захотите собирать эти отклонённые сообщения в отдельную очередь

Vadim
Во-первых, лучше использовать nack, а не reject. В...

Ощущение что вы вообще всё неверно написали

Dmitry
Бизнес проблемы и реджект ну незнаааю

Есди не доступна бд для дальнейшей обработки - то nack. Есди фундаментальная ощибка то reject. Если отработано успешно то ack. Вот и вся логика

Юрий- Автор вопроса
Aleksey Barabanov
Лучше сделать reject. Сейчас вам эти сообщения не ...

Если обычное сообщение из-за скидывается на диск, то очередь из отклонённых тоже будет скидываться на диск или это отдельно настраивается?

Юрий
Если обычное сообщение из-за скидывается на диск, ...

Ну вы можете пока их не собирать, можете сразу складывать в отдельную очередь. Тут уже как захотите

Юрий- Автор вопроса
Юрий
Если обычное сообщение из-за скидывается на диск, ...

А если сообщение не отработано и поздно что-то делать, время ответа упущено, ответ больше не нужен. Тогда что?

Юрий- Автор вопроса
Aleksey Barabanov
А разве не реджект в dlx уводит?

И он, и nack, у них же одинаковые свойства за исключением дефолта и того, что nack может накнуть батч, а reject — нет.

Aleksey Barabanov
Ощущение что вы вообще всё неверно написали

Что значит вообще? ack подтверждает обработку и выкидывает сообщение, nack — отклоняет одно или батч сообщений и применяет правила, заложенные в очереди: если есть биндинг к dlq, то сообщение(я) уйдут туда.

Юрий- Автор вопроса
Vadim
Что значит вообще? ack подтверждает обработку и вы...

Вообще - это значит, что я не хочу анализировать очередь из отклонённых сообщений, особенно не хочу заботится о переполнение очереди, памяти, диска и т. п. отклонёнными сообщениями. Если нет биндинга отклонённых сообщений в dlq, то поведение ack и reject (requeue=false) будет одинаковое?

Юрий- Автор вопроса
Vadim
Я не вам отвечал.

Перепутал )) Сорян ))

Юрий- Автор вопроса

Понял, спасибо. Вот сделали бы в rmq response (код) вместо ack, nack, reject и т. п., было бы понятней. Если есть очередь от отклонённых сообщений, то по смыслу должна быть и очередь из обработанных. Существует ли такая?

Vadim
Что значит вообще? ack подтверждает обработку и вы...

Я просто не встречал на практике использования nack required false, где нак не возвращает сообщение в очередь. Поэтому совсем не понял, не знал что у нака есть признак required

Aleksey Barabanov
Я просто не встречал на практике использования nac...

Может, просто батчи на кролике не делали. Там без nack(multiple = true, requeue = false) никак.

Vadim
Может, просто батчи на кролике не делали. Там без ...

Обычно накать батчами не приходится, достаточно поштучного нака на батчевый ак

Vadim
Может, просто батчи на кролике не делали. Там без ...

И он получается также откидывается в dlx?

Aleksey Barabanov
Обычно накать батчами не приходится, достаточно по...

От логики зависит, да. У нас просто была система, которая тоже умела батчами транзакционно принимать, поэтому нам подходило.

Юрий- Автор вопроса

Для регистрации отклонённых сообщений тоже должен быть лог в приложении, однако сделали же дополнительную очередь. Поэтому, как по мне, если есть очередь для отклонённых сообщений, то должна быть аналогичная очередь и для обработанных. Или, наоборот, не должно быть очереди, ни для отклонённых сообщений, ни для обработанных, т. е. полагаться только на логи приложения. Это мои общие рассуждения из принципа "наименьшего удивления". В любом случае приходится полагаться на реальную реализацию, а не мои хотели и ожидания.

Юрий- Автор вопроса

Вы правы. Всегда приходится смотреть на что-то новое через призму своих знаний. Аналогичный вопрос для необработанных сообщений А зачем она? Её же тоже нужно как-то обрабатывать: акать, реджектить и т. п., как-то очищать, чтобы память и диск не занимать.

Юрий
Вы правы. Всегда приходится смотреть на что-то нов...

Если вы успешно отработали сообщение, то его содержимое вам больше не нужно (за редкими исключениями). Если неудачно - то ещё как пригодится: снова попробовать, переслать в фолбэк-очередь итп

Не нужно в одном конкретном примере ретрай-очереди. На таких свет клином не сошёлся.

Владислав Килин
Не нужно в одном конкретном примере ретрай-очереди...

Это самый частый пример использования. Зачем с этим спорить и еще больше запутывать человека — непонятно.

Vadim
Это самый частый пример использования. Зачем с эти...

В моем опыте работы с кролем и dlq это не самый частый пример использования.

Юрий- Автор вопроса
Владислав Килин
Если вы успешно отработали сообщение, то его содер...

Для удачных - что-то типа лога для отладки и анализа инцидентов. Для неудачных есть же reject(requeue=True). Зачем ещё одна дополнительная очередь?

Юрий
Для удачных - что-то типа лога для отладки и анали...

Кролик не лог и не бд. Не надо его юзать в этом назначении.

Юрий- Автор вопроса

Это понятно, речь же шла о ретрай.

Юрий
Это понятно, речь же шла о ретрай.

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

Юрий
Это понятно, речь же шла о ретрай.

Кролик не может в одной очереди хранить сообщения, которые нужно отдать сейчас, и сообщения с delay. Иначе говоря, delay — это свойство очереди, а не сообщения. Поэтому оставить сообщение в этой очереди постоять не выйдет. Его надо перенести.

Юрий- Автор вопроса
Владислав Килин
Представьте что ошибка в самом сообщении и повторн...

Можно добавить кастомный хэдер со счетчиком ретраев и т. п.

Юрий
Можно добавить кастомный хэдер со счетчиком ретрае...

Так ваш счетчик ретраев без делэя за микросекунды перешагнет порог. Какой в этом смысл? Обычно системы, с которыми ваш консьюмеры общаются, могут восстановиться не сразу, и вы просто застрянете на одном месте да еще все сообщения повыкидываете зря.

Юрий- Автор вопроса
Vadim
Так ваш счетчик ретраев без делэя за микросекунды ...

Так если консьмер умер, то некому будет и отправлять сообщение в начало очереди, не будет акать и выкидывать сообщения из очереди.

Юрий
Так если консьмер умер, то некому будет и отправля...

Если консюмер умер, то очереди будет плохо, да

Юрий- Автор вопроса
Владислав Килин
Представьте что ошибка в самом сообщении и повторн...

В идеальном мире, с высокой доступность консьмер в 2024 и т. п., не должно быть ошибок в сообщении. . Отсутствие ошибок в сообщении как по мне проще обеспечить, чем 100% аптайм.

Юрий
В идеальном мире, с высокой доступность консьмер в...

Хм. Это очень смелое и в корне неверное заявление.

Юрий- Автор вопроса
Владислав Килин
Хм. Это очень смелое и в корне неверное заявление.

Уверен, что вы знаете rabbitmq гораздо лучше меня поэтому пытаюсь разобраться и понять, что и как. Не более.

Юрий- Автор вопроса
Владислав Килин
Представьте что ошибка в самом сообщении и повторн...

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

Юрий
При этом написали, что возможны ошибки в сообщении...

Нет, я привел ошибку в сообщении как один из примеров - тривиальный достаточно.

Похожие вопросы

Обсуждают сегодня

Всем привет. Подскажите. Следующая ошибка при выполнении команды werf ci-env github --as-file - "unable to get synchronization client id: unable to get repo ghcr.io/*** tags: ...
2
pika.exceptions.ChannelClosedByBroker: (406, "PRECONDITION_FAILED - inequivalent arg 'x-message-ttl' for queue 'amo-crm.q' in vhost '/': received the value '60000' of type 'si...
Sergey
9
WERF_COMMIT_HASH если я правильно понимаю только внутри стапель сборки работает?
citius
2
Еще одну панику поймал: $ werf helm repo add --username gitlab --password ${CI_JOB_TOKEN} helm-werf ${HELM_REPO_V2_URL} "helm-werf" has been added to your repositories $wer...
citius
1
Всем привет 👋 может кто подсказать? Как мне добавить файлик без коммита в сборку stapel? С докерфайлом понятно Там allowContextAddFiles А как тоже самое сделать со stapel?
Sergeevich
5
Всем привет! Прохожу этот самоучитель. Дошел до # Настроим подключение к MinIO. mc alias set minio http://minio:9000 minioadmin minioadmin # Получим содержимое сохранённого...
Aleksandr
7
Вот такая неприятность на stable и ea версиях: werf helm --namespace s4c upgrade --install --atomic --timeout 5m --set s4c.version=839185f3 --set s4c.deployEnv=staging -f d...
citius
6
Всем доброго времени суток! Перестал запускаться сервер RabbitMQ, вижу по логам, что ругается на плагин, но по какой причине не могу понять. Можете помочь разобраться, куда ко...
Александр Семенов
2
https://habr.com/ru/companies/domclick/articles/500978/ Добрый день, подскажите, пожалуйста, насколько хорошая практика сделать вот такую структуру эксчейнджей и очередей для...
Sergey
5
Доброго дня чат, можно ли использовать для werf build локально podman?
Andrey🏔
2
Карта сайта