Управляющая блокировка на массаж в кролике
Я пытаюсь использовать RabbitMq более нетрадиционным способом (хотя в этот момент я могу выбрать любую другую реализацию очереди сообщений, если это необходимо)
мое приложение работает так, у меня есть одна очередь (я могу иметь больше, если нужно), что клиенты mant выбирают N сообщений асинхронно. После того, как они выполняют свою работу, я отправляю результаты от клиента в БД.
У меня две проблемы: во-первых, я не хочу, чтобы они работали над одним и тем же сообщением, во-вторых, я хочу, чтобы я не потерял сообщения в случае, если мой клиент закроет браузер или просто перестанет работать.
Я посмотрел на документацию и увидел TTL, который идеально подошел для меня, если бы я мог изменить то сообщение, для которого истек тайм-аут, оно не будет удалено, а будет перемещено в другую очередь. не могу найти способ изменить это.
Более того, я посмотрел на опцию подтверждения, которая на первый взгляд выглядела так, как я хотел, этот механизм работает следующим образом: когда потребитель получает сообщение, он отправляет подтверждение в очередь, я думал, что могу отложить это подтверждение и отправить его, когда работа сделано на стороне клиента. моя проблема заключалась в том, что я не могу запрограммировать очередь, чтобы, если какое-либо сообщение не получило подтверждения, вернуло его в очередь (или в другое).
Я также нахожу, как сделать запланированное сообщение, но это тоже не помогло, потому что я не хочу, чтобы сообщение было вставлено в очередь через пять минут, я хочу, чтобы, когда клиент получит сообщение, оно было заблокировано в очередь на 5 минут, пока не будет подтверждено удаление, в противном случае верните ее в очередь.
я могу сделать временную очередь, которая включает мой механизм?
Если кто-то может помочь с одной из проблем или предложить другую архитектуру или вариант сделать это в другом mq, было бы здорово.
Ресурсы:
подтверждение: http://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms/
пост о блокировках, но его проблема заключалась в компоненте дозатора: блокировки и пакетная загрузка сообщений с RabbitMq
TTL: https://www.rabbitmq.com/ttl.html
Запланируйте сообщение: https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq/
1 ответ
моя проблема заключалась в том, что я не могу запрограммировать очередь, чтобы, если какое-либо сообщение не получило подтверждения, вернуло его в очередь (или в другое).
В любом случае RabbitMQ делает это, так что все, что вам нужно сделать, это отключить флаг автоматического подтверждения, вы поняли это
Я думал, что смогу отложить это подтверждение и отправить его, когда работа будет выполнена на стороне клиента.
поэтому просто отправьте ACK, когда закончите обработку сообщения. Все неподтвержденные сообщения остаются в очереди и повторно доставляются следующему потребителю (или тому же самому, когда он снова работает, в зависимости от вашей настройки)