Was ist die beste Vorgehensweise, um Nachrichten aus einer Warteschlange für nicht zustellbare Nachrichten wieder in die ursprüngliche Warteschlange in Amazon SQS zu verschieben?
Wäre es
- Nachricht von DLQ abrufen
- Nachricht in die Warteschlange schreiben
- Nachricht aus DLQ löschen
Oder gibt es einen einfacheren Weg?
Wird AWS irgendwann ein Tool in der Konsole haben, um Nachrichten aus dem DLQ zu verschieben?
amazon-web-services
amazon-sqs
Matt Dell
quelle
quelle
Antworten:
Hier ist ein kurzer Hack. Dies ist definitiv nicht die beste oder empfohlene Option.
quelle
Es gibt einige Skripte, die dies für Sie tun:
quelle
npx replay-aws-dlq DL_URI MAIN_URI
Sie müssen die Nachricht nicht verschieben, da sie mit so vielen anderen Herausforderungen verbunden ist, wie doppelten Nachrichten, Wiederherstellungsszenarien, verlorenen Nachrichten, Deduplizierungsprüfung usw.
Hier ist die Lösung, die wir implementiert haben -
Normalerweise verwenden wir den DLQ für vorübergehende Fehler, nicht für dauerhafte Fehler. Also unten Ansatz genommen -
Lesen Sie die Nachricht von DLQ wie eine normale Warteschlange
LeistungenFolgen Sie dann demselben Code, dem die reguläre Warteschlange folgt.
Zuverlässiger im Falle eines Abbruchs des Jobs oder der Beendigung des Prozesses während der Verarbeitung (z. B. Instanz beendet oder Prozess beendet)
LeistungenErweitern Sie die Nachrichtensichtbarkeit, damit kein anderer Thread sie verarbeitet.
VorteilLöschen Sie die Nachricht nur, wenn entweder ein dauerhafter Fehler vorliegt oder erfolgreich ist.
Vorteilquelle
Das scheint Ihre beste Option zu sein. Es besteht die Möglichkeit, dass Ihr Prozess nach Schritt 2 fehlschlägt. In diesem Fall wird die Nachricht am Ende zweimal kopiert, aber Ihre Anwendung sollte die erneute Zustellung von Nachrichten trotzdem behandeln (oder sich nicht darum kümmern).
quelle
Hier:
quelle
Es gibt eine andere Möglichkeit, dies zu erreichen, ohne eine einzige Codezeile zu schreiben. Angenommen, Ihr tatsächlicher Warteschlangenname lautet SQS_Queue und der DLQ dafür ist SQS_DLQ. Befolgen Sie nun diese Schritte:
quelle
aws sqs receive-message --queue-url <url of DLQ> --max-number-of-messages 10
. Da die maximale Anzahl von Nachrichten, die Sie lesen können, bei 10 liegt, empfehle ich, den Befehl in einer Schleife wie der folgenden auszuführen:for i in {1..1000}; do <CMD>; done
Ich habe dazu ein kleines Python-Skript geschrieben, indem ich boto3 lib verwendet habe:
Sie können dieses Skript unter diesem Link erhalten
Dieses Skript kann grundsätzlich Nachrichten zwischen beliebigen Warteschlangen verschieben. und es unterstützt FIFO-Warteschlangen sowie die Bereitstellung des
message_group_id
Feldes.quelle
Wir verwenden das folgende Skript, um Nachrichten von der src-Warteschlange zur tgt-Warteschlange umzuleiten:
Dateiname:
redrive.py
Verwendung:
python redrive.py -s {source queue name} -t {target queue name}
quelle
DLQ kommt nur ins Spiel, wenn der ursprüngliche Verbraucher die Nachricht nach verschiedenen Versuchen nicht erfolgreich konsumiert. Wir möchten die Nachricht nicht löschen, da wir glauben, dass wir noch etwas damit anfangen können (möglicherweise versuchen, sie erneut zu verarbeiten oder zu protokollieren oder einige Statistiken zu sammeln), und wir möchten nicht immer wieder auf diese Nachricht stoßen und die Fähigkeit dazu stoppen andere Nachrichten dahinter verarbeiten.
DLQ ist nichts anderes als eine weitere Warteschlange. Das heißt, wir müssten einen Consumer für DLQ schreiben, der idealerweise weniger häufig ausgeführt wird (im Vergleich zur ursprünglichen Warteschlange), der von DLQ verbraucht wird und Nachrichten zurück in die ursprüngliche Warteschlange erzeugt und aus DLQ löscht - wenn dies das beabsichtigte Verhalten ist und wir denken Der ursprüngliche Verbraucher wäre jetzt bereit, es erneut zu verarbeiten. Es sollte in Ordnung sein, wenn dieser Zyklus eine Weile andauert, da wir jetzt auch die Möglichkeit haben, manuell zu prüfen und notwendige Änderungen vorzunehmen und eine andere Version des ursprünglichen Verbrauchers bereitzustellen, ohne die Nachricht zu verlieren (natürlich innerhalb der Aufbewahrungsfrist für Nachrichten - die 4 Tage beträgt) Standard).
Es wäre schön, wenn AWS diese Funktion sofort bereitstellen würde, aber ich sehe sie noch nicht - sie überlassen dies dem Endbenutzer, um sie so zu verwenden, wie sie es für angemessen halten.
quelle