Комментарии 2
возникает несколько вопросов:
Получается, при redelivery не в старом сообщении обновляется счётчик, а публикуется новое сообщение с тем же телом и инкрементом счётчика, так?
есть ли таймаут на обработку сообщения? Я имею в виду кейс, когда косумер взял сообщение в обработку, а потом или завис, или так упал, что и мумукнуть не успел. Что тогда будет с сообщением?
Сигнал позволяет остановить консумера в промежутке между "обработал сообщение" и "пошёл брать новое сообщение в обработку". Таким образом, если очередь пустая, то на вызове fetch() консумер зависнет (в хорошем смысле) и будет ждать сообщение. Есть ли способ остановить его в таком случае?
Я сравниваю Nats c beanstalkd
Благодарю за проявленный интерес! :)
Да. У nats нет штатного механизма, который бы передавал номер попытки вместе с сообщнием и удалял сообщение при исчерпании количества попыток. Из-за этого приходится выкручиваться и крутить костыли. Также возникает нюанс, что
Nats-Msg-Id
используется для предотвращения дублирования сообщений, из-за чего нельзя использовать тот же ID. Но ничего не мешает использовать другой заголовок, если есть необходимость понимать, что это одно сообщениеПри создании консьюмера можно вызвать
$consumer->getConfiguration()->setAckWait()
, чтобы указать период, в который консьюмер должен дать ответ ack/nack. В противном случае случится redeliver другому консьюмеруВ реализации библиотеки
nats.php
методfetch()
не навсегда блокирующий. Он висит в течение таймаута, указанного в клиенте и возвращает сообщение или null.
Работаем с Nats в PHP