Jaka jest najlepsza praktyka przenoszenia wiadomości z kolejki utraconych wiadomości z powrotem do oryginalnej kolejki w Amazon SQS?
Czy może być
- Uzyskaj wiadomość od DLQ
- Napisz wiadomość do kolejki
- Usuń wiadomość z DLQ
Czy jest prostszy sposób?
Ponadto, czy AWS będzie miało w końcu narzędzie w konsoli do przenoszenia wiadomości z DLQ?
amazon-web-services
amazon-sqs
Matt Dell
źródło
źródło
Odpowiedzi:
Oto szybki hack. To zdecydowanie nie jest najlepsza ani zalecana opcja.
źródło
Istnieje kilka skryptów, które robią to za Ciebie:
źródło
npx replay-aws-dlq DL_URI MAIN_URI
Nie musisz przenosić wiadomości, ponieważ wiąże się ona z wieloma innymi wyzwaniami, takimi jak zduplikowane wiadomości, scenariusze odzyskiwania, utracona wiadomość, kontrola deduplikacji itp.
Oto rozwiązanie, które wdrożyliśmy -
Zwykle używamy DLQ do przejściowych błędów, a nie do trwałych błędów. Tak więc przyjęto poniżej podejście -
Przeczytaj wiadomość z DLQ jak zwykłą kolejkę
KorzyściNastępnie postępuj zgodnie z tym samym kodem, który podąża zwykła kolejka.
Bardziej niezawodny w przypadku przerwania zadania lub przerwania procesu podczas przetwarzania (np. Zabicie instancji lub zakończenie procesu)
KorzyściZwiększ widoczność wiadomości, aby żaden inny wątek ich nie przetwarzał.
ZasiłekUsuń wiadomość tylko w przypadku trwałego błędu lub pomyślnego zakończenia.
Zasiłekźródło
To wygląda na najlepszą opcję. Istnieje możliwość, że proces zakończy się niepowodzeniem po kroku 2. W takim przypadku skopiujesz wiadomość dwukrotnie, ale aplikacja powinna obsługiwać ponowne dostarczanie wiadomości (lub nie przejmować się tym).
źródło
tutaj:
źródło
Jest inny sposób na osiągnięcie tego bez pisania jednej linii kodu. Rozważmy, że rzeczywista nazwa kolejki to SQS_Queue, a DLQ dla niej to SQS_DLQ. Teraz wykonaj następujące kroki:
źródło
aws sqs receive-message --queue-url <url of DLQ> --max-number-of-messages 10
. Ponieważ maksymalna liczba wiadomości, które można odczytać na 10, sugeruję uruchomienie polecenia w takiej pętli:for i in {1..1000}; do <CMD>; done
Napisałem mały skrypt w Pythonie, aby to zrobić, używając boto3 lib:
możesz pobrać ten skrypt w tym linku
ten skrypt w zasadzie może przenosić wiadomości między dowolnymi kolejkami. i obsługuje kolejki FIFO, jak również możesz podać
message_group_id
pole.źródło
Używamy następującego skryptu, aby przekierować wiadomość z kolejki src do kolejki tgt:
Nazwa pliku:
redrive.py
stosowanie:
python redrive.py -s {source queue name} -t {target queue name}
źródło
DLQ wchodzi w grę tylko wtedy, gdy pierwotny konsument nie może pomyślnie odebrać wiadomości po różnych próbach. Nie chcemy usuwać wiadomości, ponieważ uważamy, że nadal możemy coś z nią zrobić (może spróbować ponownie przetworzyć ją, zarejestrować lub zebrać jakieś statystyki) i nie chcemy ciągle napotykać tej wiadomości i zatrzymać możliwość przetwarzać inne wiadomości za tym.
DLQ to nic innego jak kolejka. Co oznacza, że musielibyśmy napisać konsumenta dla DLQ, który idealnie działałby rzadziej (w porównaniu z oryginalną kolejką), który zużywałby z DLQ i tworzył komunikat z powrotem do oryginalnej kolejki i usuwał go z DLQ - jeśli takie jest zamierzone zachowanie i uważamy pierwotny konsument byłby teraz gotowy do ponownego przetworzenia. Powinno być OK, jeśli ten cykl będzie trwał przez jakiś czas, ponieważ teraz mamy również możliwość ręcznego sprawdzenia i wprowadzenia niezbędnych zmian oraz wdrożenia kolejnej wersji oryginalnego konsumenta bez utraty wiadomości (oczywiście w okresie przechowywania wiadomości - czyli 4 dni do domyślna).
Byłoby miło, gdyby AWS zapewniał tę możliwość od razu po wyjęciu z pudełka, ale jeszcze tego nie widzę - pozostawiają to użytkownikowi końcowemu, aby używał go w sposób, który czuje się odpowiedni.
źródło