Как стать автором
Обновить

Комментарии 2

возникает несколько вопросов:

  1. Получается, при redelivery не в старом сообщении обновляется счётчик, а публикуется новое сообщение с тем же телом и инкрементом счётчика, так?

  2. есть ли таймаут на обработку сообщения? Я имею в виду кейс, когда косумер взял сообщение в обработку, а потом или завис, или так упал, что и мумукнуть не успел. Что тогда будет с сообщением?

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

Я сравниваю Nats c beanstalkd

Благодарю за проявленный интерес! :)

  1. Да. У nats нет штатного механизма, который бы передавал номер попытки вместе с сообщнием и удалял сообщение при исчерпании количества попыток. Из-за этого приходится выкручиваться и крутить костыли. Также возникает нюанс, что Nats-Msg-Id используется для предотвращения дублирования сообщений, из-за чего нельзя использовать тот же ID. Но ничего не мешает использовать другой заголовок, если есть необходимость понимать, что это одно сообщение

  2. При создании консьюмера можно вызвать $consumer->getConfiguration()->setAckWait(), чтобы указать период, в который консьюмер должен дать ответ ack/nack. В противном случае случится redeliver другому консьюмеру

  3. В реализации библиотеки nats.php метод fetch() не навсегда блокирующий. Он висит в течение таймаута, указанного в клиенте и возвращает сообщение или null.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации