0Pricing
Cloud & IT Cert Prep · Lekcja

Visibility Timeout, DLQ i long polling

Ustawią czasy Visibility Timeout, aby wiadomości nie były przetwarzane dwukrotnie, skierują nieudane wiadomości do kolejki dead-letter i zmniejszą koszty dzięki long polling.

Visibility Timeout, DLQ i long polling to bezpłatna lekcja Cloud & IT Cert Prep na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cloud & IT Cert Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cloud & IT Cert Prep zawiera 4 lekcji w sumie.

Mechanizm limitu czasu widoczności

Gdy konsument odbiera komunikat z SQS, komunikat zostaje ukryty przed wszystkimi innymi konsumentami na okres nazywany limitem czasu widoczności. W tym czasie konsument przetwarza komunikat, a następnie go usuwa. Jeśli konsument ulegnie awarii albo nie zakończy przetwarzania na czas, limit czasu widoczności wygaśnie, a komunikat stanie się ponownie widoczny, dzięki czemu będzie mógł go pobrać inny konsument. To podstawowy mechanizm gwarancji dostarczania co najmniej raz w SQS.

Konfigurowanie limitu czasu widoczności

Domyślny limit czasu widoczności wynosi 30 sekund. Można go ustawić w zakresie od 0 sekund do 12 godzin. Należy ustawić go tak, aby z bezpiecznym zapasem przekraczał maksymalny przewidywany czas przetwarzania — jeśli przetwarzanie trwa do 2 minut, limit należy ustawić na co najmniej 3–4 minuty. Limit można również zmienić dla konkretnego uchwytu odbioru za pomocą change-message-visibility, co jest przydatne, gdy konsument wykryje, że potrzebuje więcej czasu na przetworzenie określonego komunikatu.

# Extend visibility timeout for a specific message
aws sqs change-message-visibility \
  --queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
  --receipt-handle 'AQEBwJnKyrHigUMZj...' \
  --visibility-timeout 300

Zbyt krótki a zbyt długi limit czasu

Ustawienie limitu czasu zbyt krótko powoduje ponowne pojawienie się komunikatów, zanim konsument zakończy przetwarzanie, co prowadzi do wielokrotnego przetwarzania. Ustawienie go zbyt długo opóźnia przejęcie komunikatu przez innego konsumenta, jeśli pierwotny konsument ulegnie cichej awarii (np. w wyniku awarii instancji EC2 bez prawidłowego sprzątania). Optymalny limit czasu powinien być nieco dłuższy niż czas przetwarzania dla 99. percentyla, ale jednocześnie na tyle krótki, aby umożliwić szybkie odzyskanie po awarii konsumenta. Należy monitorować metrykę CloudWatch ApproximateNumberOfMessagesNotVisible, aby wykrywać problemy z limitami czasu.

Wyjaśnienie kolejek obsługi komunikatów zatrutych

Dead-Letter Queue (DLQ) to osobna kolejka SQS, do której komunikaty są wysyłane po nieudanym przetworzeniu konfigurowalną liczbę razy (maxReceiveCount). Gdy liczba odebrań komunikatu przekroczy maxReceiveCount, SQS automatycznie przenosi go do DLQ. Kolejki DLQ zapobiegają blokowaniu kolejki w nieskończoność przez komunikaty zatruwające (komunikaty, których przetwarzanie zawsze kończy się niepowodzeniem). Komunikaty w DLQ można sprawdzać, debugować i ponownie odtwarzać po naprawieniu błędu przetwarzania.

Konfigurowanie kolejki DLQ

DLQ jest po prostu zwykłą kolejką SQS (Standard dla źródła Standard, FIFO dla źródła FIFO). W kolejce źródłowej należy skonfigurować zasadę ponownego kierowania (Redrive Policy), określając kolejkę DLQ oraz próg maxReceiveCount. Należy upewnić się, że okres przechowywania w DLQ jest dłuższy niż okres przechowywania w kolejce źródłowej — komunikaty trafiają do DLQ z opóźnieniem i potrzebny jest czas na ich zbadanie, zanim wygasną.

aws sqs set-queue-attributes \
  --queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
  --attributes '{
    "RedrivePolicy": "{\"deadLetterTargetArn\": \"arn:aws:sqs:us-east-1:123456789012:MyDLQ\", \"maxReceiveCount\": \"5\"}"
  }'

Monitorowanie DLQ i konfigurowanie alarmów

Należy ustawić alarm CloudWatch dla metryki ApproximateNumberOfMessagesVisible kolejki DLQ. Każdy komunikat trafiający do DLQ wskazuje na błąd przetwarzania wymagający uwagi. Alarm należy skonfigurować tak, aby wywoływał powiadomienie SNS i natychmiast powiadamiał inżyniera dyżurnego. Każdy komunikat w DLQ należy traktować jak błąd wymagający zbadania — komunikaty DLQ nie powinny gromadzić się niezauważone. Po naprawieniu błędu należy użyć funkcji DLQ Redrive, aby wysłać komunikaty z powrotem do kolejki źródłowej w celu ponownego przetworzenia.

DLQ Redrive: ponowne odtwarzanie komunikatów

Po naprawieniu błędu powodującego niepowodzenia przetwarzania należy użyć funkcji SQS DLQ Redrive, aby przenieść komunikaty z DLQ z powrotem do kolejki źródłowej w celu ponownego przetworzenia. Konsola udostępnia wbudowaną funkcję redrive. Można filtrować komunikaty według ich atrybutów, aby ponownie odtworzyć tylko wybrane komunikaty. Alternatywnie można napisać funkcję Lambda, która będzie odpytywać DLQ i przekazywać komunikaty z powrotem do kolejki źródłowej, jeśli potrzebna jest niestandardowa logika filtrowania.

# Start DLQ message move task
aws sqs start-message-move-task \
  --source-arn 'arn:aws:sqs:us-east-1:123456789012:MyDLQ' \
  --destination-arn 'arn:aws:sqs:us-east-1:123456789012:MyQueue' \
  --max-number-of-messages-per-second 5

Krótkie a długie odpytywanie

Domyślnie SQS używa krótkiego odpytywania: wywołanie receive-message sprawdza losowy podzbiór serwerów i natychmiast zwraca wynik — nawet jeśli nie ma dostępnych komunikatów. Skutkuje to dużą liczbą pustych odpowiedzi i marnowaniem wywołań API. Długie odpytywanie czeka do 20 sekund na pojawienie się komunikatu, zanim zwróci pustą odpowiedź. Długie odpytywanie znacznie obniża koszty (mniej wywołań API) i zmniejsza opóźnienia (komunikat jest odbierany natychmiast po pojawieniu się, nawet do 20 sekund wcześniej niż w następnym cyklu odpytywania).

Włączanie długiego odpytywania

Długie odpytywanie można włączyć na poziomie kolejki (dotyczy wszystkich wywołań odbierania) albo dla pojedynczego żądania. Konfiguracja na poziomie kolejki z wartością ReceiveMessageWaitTimeSeconds równą 20 jest zalecanym ustawieniem dla większości aplikacji. Gdy Lambda używa SQS jako źródła zdarzeń, automatycznie korzysta z długiego odpytywania. W przypadku konsumentów opartych na EC2 należy ustawić WaitTimeSeconds w wywołaniu receive-message.

# Enable long polling at queue level (recommended)
aws sqs set-queue-attributes \
  --queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
  --attributes '{"ReceiveMessageWaitTimeSeconds": "20"}'

# Or per-request
aws sqs receive-message \
  --queue-url 'https://...' \
  --wait-time-seconds 20 \
  --max-number-of-messages 10

Atrybuty komunikatów i filtrowanie

Komunikaty SQS mogą zawierać atrybuty komunikatów — metadane w postaci par klucz-wartość, niezależne od treści komunikatu. Atrybuty mają typ (String, Number, Binary) i wartość. Gdy SQS jest subskrybentem tematu SNS, można używać zasad filtrowania subskrypcji SNS stosowanych do atrybutów komunikatów, aby kierować do każdej kolejki tylko odpowiednie komunikaty. Bez filtrowania każdy subskrybent SQS otrzymuje każdą publikację SNS, niezależnie od jej treści.

Kolejki opóźnień i liczniki czasu komunikatów

Kolejka opóźnień sprawia, że każdy nowy komunikat staje się niewidoczny na określony czas (od 0 do 15 minut) po wysłaniu. Jest to przydatne w przepływach pracy, w których konsument nie powinien przetwarzać komunikatu natychmiast — na przykład gdy najpierw trzeba zaczekać na zakończenie zależnego procesu. Można również ustawić opóźnienie dla pojedynczego komunikatu za pomocą parametru DelaySeconds w wywołaniu wysyłania, co zastępuje opóźnienie ustawione na poziomie kolejki. Uwaga: kolejki opóźnień nie są dostępne dla kolejek FIFO.

# Create a delay queue (5 minute delay)
aws sqs create-queue \
  --queue-name 'DelayedProcessingQueue' \
  --attributes '{"DelaySeconds": "300"}'

Szybki test

Sprawdź swoją znajomość zagadnień AWS Solutions Architect (SAA-C03) omówionych w tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczyli się Państwo, że: Visibility Timeout ukrywa wiadomość przed innymi konsumentami na czas przetwarzania, umożliwiając dostarczanie co najmniej raz i automatyczne ponowne dostarczenie, jeśli konsument ulegnie awarii; Dead-Letter Queues przechowują wielokrotnie kończące się niepowodzeniem wiadomości, aby można je było debugować i ponownie odtworzyć po naprawieniu błędu; a Long Polling (czas oczekiwania do 20 sekund) zmniejsza koszty API i opóźnienia w porównaniu z krótkim odpytywaniem. W następnej części omówimy tematy SNS i architekturę fan-out.

Często zadawane pytania

Czy lekcja „Visibility Timeout, DLQ i long polling” jest bezpłatna?

Tak — pełny tekst „Visibility Timeout, DLQ i long polling” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cloud & IT Cert Prep, przejdź na CoddyKit PRO. Kurs Cloud & IT Cert Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „Visibility Timeout, DLQ i long polling”?

Ustawią czasy Visibility Timeout, aby wiadomości nie były przetwarzane dwukrotnie, skierują nieudane wiadomości do kolejki dead-letter i zmniejszą koszty dzięki long polling. Ćwiczysz Cloud & IT Cert Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Cloud & IT Cert Prep?

Nie wymagamy żadnego doświadczenia. Cloud & IT Cert Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Visibility Timeout, DLQ i long polling”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Cloud & IT Cert Prep?

Tak. Każda lekcja Cloud & IT Cert Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kolejki SQS Standard a FIFO
  2. Visibility Timeout, DLQ i long polling
  3. Tematy SNS i architektura fan-out
  4. Filtrowanie wiadomości SQS i integracja SNS + SQS
← Powrót do Cloud & IT Cert Prep