Quelle est la meilleure pratique pour déplacer les messages d'une file d'attente de lettres mortes vers la file d'attente d'origine dans Amazon SQS?
Serait-ce
- Obtenir un message de DLQ
- Écrire un message dans la file d'attente
- Supprimer le message du DLQ
Ou y a-t-il un moyen plus simple?
De plus, AWS aura-t-il éventuellement un outil dans la console pour déplacer les messages hors du DLQ?
amazon-web-services
amazon-sqs
Matt Dell
la source
la source
Réponses:
Voici un hack rapide. Ce n'est certainement pas la meilleure option ou l'option recommandée.
la source
Il existe quelques scripts qui le font pour vous:
la source
npx replay-aws-dlq DL_URI MAIN_URI
Vous n'avez pas besoin de déplacer le message car il comportera de nombreux autres défis tels que les messages en double, les scénarios de récupération, le message perdu, la vérification de la déduplication, etc.
Voici la solution que nous avons mise en place -
Habituellement, nous utilisons le DLQ pour les erreurs transitoires, pas pour les erreurs permanentes. Alors pris ci-dessous l'approche -
Lisez le message de DLQ comme une file d'attente normale
AvantagesSuivez ensuite le même code que la file d'attente régulière.
Plus fiable en cas d'abandon de la tâche ou lorsque le processus s'est arrêté pendant le traitement (par exemple, instance tuée ou processus arrêté)
AvantagesÉtendez la visibilité des messages afin qu'aucun autre thread ne les traite.
AvantageSupprimez le message uniquement en cas d'erreur permanente ou de réussite.
Avantagela source
Cela ressemble à votre meilleure option. Il est possible que votre processus échoue après l'étape 2. Dans ce cas, vous finirez par copier le message deux fois, mais votre application devrait de toute façon gérer la redistribution des messages (ou ne pas s'en soucier).
la source
ici:
la source
Il existe un autre moyen d'y parvenir sans écrire une seule ligne de code. Considérez votre nom de file d'attente réel est SQS_Queue et le DLQ correspondant est SQS_DLQ. Suivez maintenant ces étapes:
la source
aws sqs receive-message --queue-url <url of DLQ> --max-number-of-messages 10
. Étant donné que le maximum de messages, vous pouvez lire les majuscules à 10, je suggère d'exécuter la commande dans une boucle comme celle-ci:for i in {1..1000}; do <CMD>; done
J'ai écrit un petit script python pour ce faire, en utilisant boto3 lib:
vous pouvez obtenir ce script dans ce lien
ce script peut essentiellement déplacer des messages entre toutes les files d'attente arbitraires. et il prend en charge les files d'attente fifo ainsi que vous pouvez fournir le
message_group_id
champ.la source
Nous utilisons le script suivant pour rediriger le message de la file d'attente src vers la file d'attente tgt:
nom de fichier:
redrive.py
usage:
python redrive.py -s {source queue name} -t {target queue name}
la source
DLQ n'entre en jeu que lorsque le consommateur d'origine ne parvient pas à consommer le message avec succès après plusieurs tentatives. Nous ne voulons pas supprimer le message car nous pensons que nous pouvons toujours faire quelque chose avec lui (peut-être essayer de le traiter à nouveau, de le consigner ou de collecter des statistiques) et nous ne voulons pas continuer à rencontrer ce message encore et encore et arrêter la possibilité de traiter les autres messages derrière celui-ci.
DLQ n'est rien d'autre qu'une autre file d'attente. Ce qui signifie que nous aurions besoin d'écrire un consommateur pour DLQ qui fonctionnerait idéalement moins fréquemment (par rapport à la file d'attente d'origine) qui consommerait de DLQ et produirait le message dans la file d'attente d'origine et le supprimerait de DLQ - si c'est le comportement prévu et nous pensons le consommateur d'origine serait maintenant prêt à le traiter à nouveau. Cela devrait être OK si ce cycle se poursuit pendant un certain temps, car nous avons maintenant également la possibilité d'inspecter manuellement et d'apporter les modifications nécessaires et de déployer une autre version du consommateur d'origine sans perdre le message (dans la période de rétention du message bien sûr - qui est de 4 jours par défaut).
Ce serait bien si AWS fournissait cette capacité prête à l'emploi, mais je ne la vois pas encore - ils laissent cela à l'utilisateur final pour l'utiliser de la manière qu'il juge appropriée.
la source