на Spring Boot и там асинхронно перекладываются в другую очередь, если сообщение успешно переложилось, то в раббит посылается ack, если за определённый таймаут не обработалось, то посылается nack и сообщение возвращается в раббит и тут же пересылается обратно в приложение.
Из-за того, что сообщения перекладываются асинхронно, то возникают дубликаты. Можно как-нибудь провести дедупликацию таких сообщений на уровне настроек раббита? Например транзитивность или что-то такое?
А откуда рэббиту знать какое сообщение обработалось, а какое нет. Он свой nack получил - обязан доставить ещё раз
Это верно, видимо придётся уходить от асинхронности к монопоточности... Хотелось всё же убедиться что других вариантов нет
Не поможет. Можно анализировать redelivery флаг, это уже будет ближе к решению
а как поможет redelivery флаг? если у нас сообщение в одном потоке обрабатывается (потеряно соединение и вызываются ретраи), приходит это же сообщение с redelivery флаг=true и отправляется в другой поток - как итог когда соединение восстанавливается - оба сообщения уходит в другую очередь
Флаг поможет понять, что уже однажды сообщение пытались обработать и вероятно его вообще не нужно обрабатывать и/или нужно проверить на дубликат, возможно в том числе вручную. Всё зависит от конкретной реализации
> из-за того, что сообщения перекладываются асинхронно, возникают дубликаты А какая связь? Асинхронность не равно параллельность. В любом случае почему не взять shovel?
Тут связь в следующем: мы асинхронно кладём сообщение в отдельный поток, и если оно на определённый таймаут не отправляется в другую очередь, мы выбрасываем исключение в главном потоке и через nack возвращаем сообщение в раббит, которое потом снова приходит в главный поток. Кажется, у нас асинхронность нужна только для таймаута по которому возвращать сообщение в раббит. За shovel спасибо - почитаю о нём
Для таймаута лучше использовать паттерн очереди повторных попыток в вашем случае кмк
Спасибо, а где можно почитать про этот паттерн? Это аналог BCQ очереди в IBM MQ?
В закрепе ссылка на курс, там в типовом использовании вроде я описывал как настроить такую очередь
Да, оно, суть таже, только рэббит не умеет считать количество попыток (или поправили уже? Давно не следил)
https://gitlab.com/kilexst/rabbitmq-docs/-/tree/main/3%20-%20%D0%A2%D0%B8%D0%BF%D0%BE%D0%B2%D0%BE%D0%B5%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C-%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D1%85-%D0%BF%D0%BE%D0%BF%D1%8B%D1%82%D0%BE%D0%BA
Реджекты не считает, но dlx считает
Обсуждают сегодня