Как лучше всего переместить сообщения из очереди недоставленных сообщений обратно в исходную очередь в Amazon SQS?
Будет ли это
- Получить сообщение от DLQ
- Написать сообщение в очередь
- Удалить сообщение из DLQ
Или есть способ попроще?
Кроме того, будет ли у AWS в конечном итоге инструмент в консоли для перемещения сообщений из DLQ?
amazon-web-services
amazon-sqs
Мэтт Делл
источник
источник
Ответы:
Вот быстрый совет. Это определенно не лучший и не рекомендуемый вариант.
источник
Есть несколько скриптов, которые сделают это за вас:
источник
npx replay-aws-dlq DL_URI MAIN_URI
Не нужно перемещать сообщение, потому что оно сопряжено с множеством других проблем, таких как дублирование сообщений, сценарии восстановления, потерянное сообщение, проверка исключения дубликатов и т. Д.
Вот решение, которое мы реализовали -
Обычно мы используем DLQ для временных ошибок, а не для постоянных ошибок. Итак, подход ниже -
Прочтите сообщение из DLQ как обычную очередь
ЛьготыЗатем следуйте тому же коду, что и обычная очередь.
Более надежен в случае прерывания задания или прекращения процесса во время обработки (например, инстанс убит или процесс завершен)
ЛьготыРасширьте видимость сообщений, чтобы никакой другой поток их не обрабатывал.
ВыгодаУдаляйте сообщение только в том случае, если есть постоянная ошибка или успешно.
Выгодаисточник
Похоже, это ваш лучший вариант. Существует вероятность того, что ваш процесс завершится ошибкой после шага 2. В этом случае вы дважды скопируете сообщение, но ваше приложение все равно должно обрабатывать повторную доставку сообщений (или не заботиться).
источник
Вот:
источник
Есть другой способ добиться этого без написания единственной строчки кода. Учтите, что ваше фактическое имя очереди - SQS_Queue, а DLQ для нее - SQS_DLQ. Теперь выполните следующие действия:
источник
aws sqs receive-message --queue-url <url of DLQ> --max-number-of-messages 10
. Поскольку максимальное количество сообщений вы можете прочитать заглавными буквами на 10, я предлагаю запускать команду в таком цикле:for i in {1..1000}; do <CMD>; done
Для этого я написал небольшой скрипт на Python, используя boto3 lib:
вы можете получить этот скрипт по этой ссылке
этот скрипт в основном может перемещать сообщения между любыми произвольными очередями. и он поддерживает очереди fifo, а также вы можете указать
message_group_id
поле.источник
Мы используем следующий скрипт для перенаправления сообщения из очереди src в очередь tgt:
имя файла:
redrive.py
Применение:
python redrive.py -s {source queue name} -t {target queue name}
источник
DLQ вступает в игру только тогда, когда исходный потребитель не может успешно принять сообщение после различных попыток. Мы не хотим удалять сообщение, так как считаем, что мы все еще можем что-то с ним сделать (возможно, попытаться снова обработать или зарегистрировать его или собрать некоторую статистику), и мы не хотим снова и снова сталкиваться с этим сообщением и останавливать возможность обрабатывать другие сообщения за этим.
DLQ - это не что иное, как очередная очередь. Это означает, что нам нужно будет написать потребителя для DLQ, который в идеале работал бы реже (по сравнению с исходной очередью), который потреблял бы из DLQ и возвращал сообщение в исходную очередь и удалял его из DLQ - если это предполагаемое поведение, и мы думаем исходный потребитель теперь будет готов обработать его снова. Если этот цикл продолжится какое-то время, все должно быть в порядке, поскольку теперь у нас также есть возможность вручную проверить и внести необходимые изменения и развернуть другую версию исходного потребителя без потери сообщения (конечно, в течение периода хранения сообщения, который составляет 4 дня к по умолчанию).
Было бы неплохо, если бы AWS предоставил эту возможность из коробки, но я ее еще не вижу - они оставляют это на усмотрение конечного пользователя, чтобы использовать его так, как они считают нужным.
источник