Рабочая очередь, обеспечивающая повторы с увеличивающимися задержками и максимальным количеством попыток. Возможно ли чистое решение RabbitMQ? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть повторяющиеся задачи, которые я хочу выполнять с рядом работников (т. Е. Модель конкурирующих потребителей). Вероятность неудачи во время выполнения задачи довольно низкая, поэтому в случае таких редких событий я хотел бы повторить попытку через короткий промежуток времени, скажем, за 1 секунду.

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

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

Допустим, что желаемое распределение задержек выглядит следующим образом:

first appearance in the queue - no delay
retry 1 - 1 second
retry 2 - 1 second
retry 3 - 1 second
retry 4 - 5 second
retry 5 - 10 seconds
retry 6 - 20 seconds
retry 7 - 40 seconds
retry 8 - 80 seconds
retry 9 - 160 seconds
retry 10 - 320 seconds
another retry - drop the message

Я нашел много информации о DLX. (Обмен мертвыми буквами), которые могут частично решить проблему. По-видимому, легко достичь бесконечного числа попыток с одинаковой задержкой. В то же время я не нашел способа увеличить задержку или остановить ее после определенного числа попыток.

Я ищу самое чистое из возможных решений RabbitMQ. Однако меня интересует все, что работает.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Используя комбинацию DLX и времени истечения / TTL, вы можете выполнить это , за исключением для случая, когда вы хотите изменить время повторной доставки, например, путем экспоненциального отката.

Единственный способ заставить его работать, используя чистый подход RabbitMQ, - установить время истечения на наименьшее необходимое время, а затем использовать массив x-death , чтобы выяснить, сколько разсообщение было убито, а затем отклонено (т. е. снова DLX) или соответствующим образом подтверждено сообщением.

Допустим, вы установили время истечения на 1 минуту, и вам необходимо откатить сначала 1 минуту, затем 5 минут ипотом 30 минут. Это преобразуется в x-death.count = 1, затем 5, а затем 30. В любое другое время вы просто отклоняете сообщение.

Обратите внимание, что это может создать большой отток, если у вас много повторных сообщений. Но если повторные попытки редки, сделайте это.

1 голос
/ 30 октября 2019

Для этого есть плагин. Я думаю, что вы можете использовать его для достижения того, что вам нужно. Я использовал его для чего-то похожим образом для обработки пользовательских попыток с динамическими задержками.

Плагин отложенных сообщений RabbitMQ

...