Filtrowanie wiadomości SQS i integracja SNS + SQS
Zastosują zasady filtrowania subskrypcji SNS, aby każdy konsument SQS otrzymywał tylko interesujące go wiadomości, ograniczając zbędne przetwarzanie.
Filtrowanie wiadomości SQS i integracja SNS + SQS to bezpłatna lekcja Cloud & IT Cert Prep na CoddyKit. To lekcja 4 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.
Problem przy braku filtrowania
W architekturze fan-out bez filtrowania każdy subskrybent SQS otrzymuje każdą wiadomość SNS. Jeśli temat publikuje zdarzenia dotyczące zamówień z 10 różnych kategorii produktów, a dany subskrybent obsługuje tylko zamówienia elektroniki, nadal otrzymuje wiadomości dotyczące żywności i odzieży, które musi odrzucić. Powoduje to marnowanie zasobów obliczeniowych, wzrost kosztów i niepotrzebne obciążenie konsumentów. Zasady filtrowania subskrypcji SNS rozwiązują ten problem, ponieważ to samo SNS kieruje wiadomości wyłącznie do odpowiednich subskrybentów.
Jak działają zasady filtrowania SNS
Zasada filtrowania to obiekt JSON stosowany do subskrypcji SQS lub Lambda. SNS ocenia tę zasadę względem atrybutów wiadomości przed jej dostarczeniem. Jeśli atrybuty wiadomości pasują do zasady filtrowania, wiadomość zostaje dostarczona; w przeciwnym razie SNS po cichu pomija danego subskrybenta. Zasady filtrowania obsługują dopasowanie ciągów znaków, zakresy liczbowe, dopasowanie prefiksów oraz operator exists sprawdzający obecność lub brak atrybutu.
# Filter policy: only deliver ELECTRONICS orders from US or EU
{
'category': ['ELECTRONICS'],
'region': ['US', 'EU'],
'amount': [{'numeric': ['>=', 100]}]
}Zakres zasady filtrowania: atrybuty wiadomości a treść
Domyślnie zasady filtrowania dopasowują wartości na podstawie atrybutów wiadomości (metadanych). Od 2023 roku SNS obsługuje również filtrowanie na podstawie danych (treści) przez ustawienie zakresu zasady filtrowania na MessageBody. Umożliwia to filtrowanie bezpośrednio w treści wiadomości za pomocą ścieżki JSON, bez konieczności dodawania atrybutów przez wydawców. Filtrowanie treści jest bardziej elastyczne, ale wymaga, aby treść wiadomości była prawidłowym kodem JSON. Należy zawsze potwierdzić, który zakres odpowiada formatowi danych generowanych przez wydawcę.
# Set filter scope to MessageBody
aws sns set-subscription-attributes \
--subscription-arn 'arn:aws:sns:...' \
--attribute-name FilterPolicyScope \
--attribute-value MessageBody
aws sns set-subscription-attributes \
--subscription-arn 'arn:aws:sns:...' \
--attribute-name FilterPolicy \
--attribute-value '{"category": ["ELECTRONICS"]}'Warunki filtrowania liczb i prefiksów
Zasady filtrowania obsługują wiele operatorów dopasowania wykraczających poza proste porównanie ciągów znaków:
- Numeric:
{"numeric": ["=", 100]},{"numeric": [">", 50, "<=", 200]} - Prefix:
{"prefix": "order-"}dopasowuje każdy ciąg znaków zaczynający się od tego prefiksu - Anything-but:
{"anything-but": ["CANCELLED"]}dopasowuje każdą wartość poza wymienionymi - Exists:
{"exists": true}dopasowuje, jeśli atrybut jest obecny; wartośćfalseoznacza jego brak
Publikowanie wiadomości z atrybutami do filtrowania
Aby filtrowanie działało, wydawca musi dołączyć atrybuty wiadomości podczas publikowania w SNS. Atrybuty to pary klucz-wartość z określonym typem danych (String, Number, Binary). Wydawca nie musi wiedzieć, którzy subskrybenci mają poszczególne zasady filtrowania — wystarczy, że wzbogaci wiadomość o atrybuty opisujące zdarzenie. SNS automatycznie zajmie się routingiem. Dzięki temu wydawcy pozostają całkowicie niezależni od logiki właściwej dla poszczególnych subskrybentów.
aws sns publish \
--topic-arn 'arn:aws:sns:us-east-1:123456789012:OrderTopic' \
--message '{"orderId": "789", "total": 250.00}' \
--message-attributes '{
"category": {"DataType": "String", "StringValue": "ELECTRONICS"},
"region": {"DataType": "String", "StringValue": "US"},
"amount": {"DataType": "Number", "StringValue": "250"}
}'Wielopoziomowy fan-out: SNS + wiele kolejek SQS
Zaawansowana topologia fan-out może obejmować kierowanie przez SNS wiadomości do kolejek SQS o różnym poziomie szczegółowości: jedna kolejka otrzymuje wszystkie zamówienia (bez filtra) na potrzeby audytu, druga otrzymuje tylko zamówienia HIGH_VALUE (kwota >= 1000) na potrzeby analizy oszustw, a trzecia otrzymuje wyłącznie zamówienia ELECTRONICS dla magazynu elektroniki. Każda kolejka SQS ma własnego konsumenta Lambda. Ten wzorzec umożliwia niezależne skalowanie poszczególnych poziomów przetwarzania oraz dodawanie nowych konsumentów bez modyfikowania istniejących elementów ani wydawcy.
Dostarczanie z SNS do SQS między kontami
SNS może dostarczać wiadomości do kolejek SQS znajdujących się na innym koncie AWS. Zasada oparta na zasobach kolejki SQS musi zezwalać podmiotowi usługi SNS na wywołanie sqs:SendMessage z ARN-em tematu SNS z konta wydawcy. Umożliwia to centralne publikowanie zdarzeń (jedno konto publikuje, a zespoły z wielu kont subskrybują temat) bez udostępniania poświadczeń. Fan-out między kontami jest często stosowany w konfiguracjach AWS Organizations obejmujących wiele kont.
# SQS queue policy to allow cross-account SNS delivery
{
'Version': '2012-10-17',
'Statement': [{
'Effect': 'Allow',
'Principal': {'Service': 'sns.amazonaws.com'},
'Action': 'sqs:SendMessage',
'Resource': 'arn:aws:sqs:us-east-1:CONSUMER_ACCOUNT:MyQueue',
'Condition': {
'ArnEquals': {'aws:SourceArn': 'arn:aws:sns:us-east-1:PUBLISHER_ACCOUNT:MyTopic'}
}
}]
}SQS jako bufor przed Lambda
Gdy natężenie zdarzeń gwałtownie rośnie, bezpośrednie wywołania SNS-to-Lambda natychmiast skalują Lambda, co może przeciążyć podrzędne bazy danych lub interfejsy API. Dodanie SQS między SNS i Lambda tworzy bufor: SNS dostarcza wiadomości do SQS, a Lambda odpytuje SQS z kontrolowanym rozmiarem partii. Pozwala to funkcji Lambda przetwarzać wiadomości w tempie możliwym do utrzymania, podczas gdy SQS absorbuje skoki ruchu. Głębokość kolejki działa jako mechanizm kontroli przeciążenia — można ją monitorować i generować alerty, gdy przekroczy próg wskazujący na opóźnienia konsumenta.
Porównanie bezpośredniego Lambda z fan-out z buforowaniem SQS
SNS → Lambda (bezpośrednio): najniższe opóźnienie, brak buforowania, natychmiastowe skalowanie Lambda. Najlepsze rozwiązanie w przypadku alertów w czasie rzeczywistym lub pilnych powiadomień, gdy istotne jest opóźnienie poniżej sekundy. SNS → SQS → Lambda: zapewnia obsługę DLQ, kontrolowaną przepustowość, ponowienia z visibility timeout oraz monitorowanie głębokości kolejki. Najlepsze rozwiązanie w przypadku przetwarzania transakcji, aktualizacji zapasów i wszelkich scenariuszy, w których należy respektować ograniczenia systemów podrzędnych. W pytaniach egzaminacyjnych należy wybrać buforowanie SQS, gdy wspomniano o trwałości i kontroli tempa.
Testowanie zasad filtrowania
Użyj edytora zasad filtrowania w konsoli SNS, aby przed wdrożeniem sprawdzić, czy przykładowa wiadomość pasowałaby do zasady filtrowania. Możesz także użyć SNSSandbox, aby symulować dostarczanie wiadomości i zweryfikować routing. W kodzie sprawdzaj zasady filtrowania, publikując testowe wiadomości ze znanymi atrybutami i monitorując metryki CloudWatch dla każdej subskrypcji: metryka NumberOfMessagesFiltered pokazuje, ile wiadomości zostało zablokowanych przez filtr, co pomaga dostrajać zasady bez czekania na zdarzenia produkcyjne.
Podsumowanie integracji end-to-end
Kompletna integracja SNS + SQS wygląda następująco: (1) aplikacja publikuje zdarzenie w standardowym temacie SNS wraz z atrybutami wiadomości; (2) SNS ocenia zasadę filtrowania każdej subskrypcji i dostarcza do każdej kolejki SQS tylko pasujące wiadomości; (3) Lambda odpytuje każdą kolejkę SQS ze skonfigurowanym rozmiarem partii i przetwarza wiadomości; (4) wiadomości, których nie udało się przetworzyć, trafiają do DLQ kolejki po osiągnięciu wartości maxReceiveCount; (5) alarm CloudWatch monitorujący liczbę wiadomości w DLQ powiadamia zespół. Ten w pełni rozdzielony i odporny na błędy wzorzec stanowi modelową architekturę SAA-C03.
Szybkie sprawdzenie
Sprawdź swoją znajomość zagadnień AWS Solutions Architect (SAA-C03) omówionych w tej lekcji.
Podsumowanie lekcji
W tej lekcji poznali Państwo następujące zagadnienia: zasady filtrowania SNS kierują wiadomości na poziomie SNS na podstawie atrybutów wiadomości lub jej treści, eliminując zbędne przetwarzanie po stronie konsumentów; wzorzec SNS→SQS→Lambda dodaje trwałe buforowanie i kontrolę tempa między rozgłaszaniem do wielu odbiorców a przetwarzaniem; natomiast dostarczanie SQS między kontami umożliwia scentralizowany model pub/sub w środowiskach obejmujących wiele kont dzięki zasadom zasobów kolejek. W następnej części omówimy interfejsy REST, HTTP i WebSocket usługi Amazon API Gateway.
Często zadawane pytania
Czy lekcja „Filtrowanie wiadomości SQS i integracja SNS + SQS” jest bezpłatna?
Tak — pełny tekst „Filtrowanie wiadomości SQS i integracja SNS + SQS” 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 „Filtrowanie wiadomości SQS i integracja SNS + SQS”?
Zastosują zasady filtrowania subskrypcji SNS, aby każdy konsument SQS otrzymywał tylko interesujące go wiadomości, ograniczając zbędne przetwarzanie. Ć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 4 z 4.
Ile czasu zajmuje lekcja „Filtrowanie wiadomości SQS i integracja SNS + SQS”?
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
- Kolejki SQS Standard a FIFO
- Visibility Timeout, DLQ i long polling
- Tematy SNS i architektura fan-out
- Filtrowanie wiadomości SQS i integracja SNS + SQS