Amazon SNS FIFO – wzorzec wiadomości Publikuj/Subskrybuj
Podczas projektowania oprogramowania o rozproszonej architekturze bardzo ważne jest, aby zdefiniować to, w jaki sposób serwisy wymieniają informacje. Dla przykładu użycie komunikacji asynchronicznej oddziela komponenty, upraszcza skalowanie, zmniejszając wpływ zmian i ułatwiając opublikowanie nowych funkcji.
Dwoma najbardziej popularnymi formami komunikacji asynchronicznej service-to-service są kolejki komunikatów i wzorzec wiadomości Publisher/Subscriber.
- W przypadku kolejki komunikatów wiadomości są przechowywane w kolejce do momentu, w którym zostaną przetworzone i usunięte przez konsumenta. W AWS Amazon Simple Queue Service (SQS) zapewnia w pełni zarządzaną usługę kolejkowania wiadomości bez kosztów administracyjnych.
- W przypadku wzorca wiadomości pub/sub wiadomość opublikowana do tematu zostaje dostarczona do wszystkich subskrybentów danego tematu. W AWS Amazon Simple Notification Service (SNS) jest w pełni zarządzaną usługą wzorca wiadomości pub/sub, która umożliwia dostarczenie wiadomości do dużej liczby subskrybentów. Każdy subskrybujący może również ustanowić zasady filtrowania, aby otrzymywać tylko te wiadomości, na których mu zależy.
Możesz korzystać z tematów, jeśli chcesz rozesłać wiadomości do wielorakich aplikacji, a kolejki komunikatów, kiedy chcesz wysłać wiadomości do jednej aplikacji. Używając tematów i kolejek razem, możesz rozłączać mikrousługi, systemy rozproszone i bezserwerowe aplikacje.
Z SQS możesz korzystać z kolejki FIFO (pierwsze wchodzi-pierwsze wychodzi), aby zachować kolejność, w której wiadomości są wysyłane i otrzymywane, a także w celu uniknięcia sytuacji, w której wiadomość zostaje przetworzona więcej niż raz.
Tematy SNS FIFO
Dzisiaj dodajemy podobne możliwości dla komunikatów pub/sub wraz z prezentacją tematów SNS FIFO, zapewniających ścisłą kolejność wiadomości oraz dostarczenie zdeduplikowanej wiadomości do jednego lub więcej subskrybentów.
Tematy FIFO zarządzają porządkowaniem i deduplikacją podobnymi do kolejek FIFO.
- Porządkowanie – możesz skonfigurować grupę komunikatów, włączając ID grupy komunikatów w momencie publikowania wiadomości do tematu FIFO. Do każdego ID grupy komunikatów wszystkie wiadomości są wysyłane i dostarczane w kolejności ich nadejścia. Na przykład, aby zapewnić dostarczenie wiadomości związanych z tym samym klientem we właściwej kolejności, możesz opublikować te komunikaty w temacie, używając numeru konta konsumenta jako grupy komunikatów ID. Nie istnieje limit w liczbie grup komunikatów w tematach i kolejkach FIFO, dlatego nie musisz deklarować z wyprzedzeniem ID grupy komunikatów, każda wartość będzie odpowiednia. Jeśli nie posiadasz logicznego rozróżnienia pomiędzy komunikatami, możesz po prostu użyć tego samego ID grupy komunikatów dla wszystkich i mieć pojedynczą grupę uporządkowanych wiadomości. ID grupy komunikatów zostaje podane do każdej subskrybowanej kolejki FIFO.
- Deduplikacja – systemy rozproszone (jak SNS) i aplikacje klientów czasami generują zduplikowane wiadomości. Możesz uniknąć otrzymywania zduplikowanych komunikatów z tematu na dwa sposoby: poprzez uaktywnienie deduplikacji opartych na treści tematu lub poprzez dodanie ID deduplikacji do komunikatów, które publikujesz. Z deduplikacją opartą na treści komunikatu SNS używa hashu SHA-256 w celu wygenerowania deduplikacji ID komunikatów, używając do tego korpusu wiadomości. Po tym, jak komunikat z konkretnym ID deduplikacji zostaje pomyślnie opublikowany, pojawia się 5-minutowy interwał, w czasie którego każda wiadomość z takim samym ID deduplikacji zostaje zaakceptowana, ale nie dostarczona. Jeśli subskrybujesz kolejkę FIFO do tematu FIFO, ID deduplikacji zostaje przesłane do kolejki i użyte przez SQS w celu uniknięcia otrzymywania zduplikowanych wiadomości.
Możemy korzystać z tematów i kolejek FIFO jednocześnie w celu ułatwienia implementacji aplikacji, w których kolejność działań i zdarzeń jest kluczowa lub kiedy nie możemy znieść duplikatów. Na przykład w celu przetworzenia operacji finansowych i aktualizacji inwentarza lub asynchronicznego zastosowania komend, które otrzymujemy z urządzenia klienta. Kolejki FIFO mogą korzystać z filtrowania komunikatów w tematach FIFO, aby wybiórczo otrzymywać jedynie podzbiór wiadomości zamiast każdej wiadomości opublikowanej do tematu.
W jaki sposób korzystać z tematów SNS FIFO?
Typowy scenariusz, w którym tematy FIFO mogą okazać się pomocne, ma miejsce wtedy, kiedy otrzymujemy aktualizacje, które powinny zostać przetworzone w odpowiedniej kolejności. Na przykład możemy użyć tematu FIFO, aby otrzymywać aktualizacje z aplikacji, w której klienci edytują profile swoich kont. Następnie subskrybujemy kolejkę SQS FIFO do tematu FIFO i używamy jej jako bodźca dla funkcji Lambdy, która zatwierdza aktualizacje konta do tabeli Amazon DynamoDB używanej przez system zarządzania klienta, który powinien być zsynchronizowany.
Rozłączanie (decoupling) przedstawione przez temat FIFO ułatwia dodanie nowych funkcyjności z minimalnym wpływem na istniejące aplikacje. Na przykład, aby nagrodzić moich lojalnych klientów dodatkowymi promocjami, dodaję nową aplikację lojalnościową, która przechowuje informacje w pokrewnej bazie danych zarządzanej przez Amazon Aurora. Aby zachować informacje o kliencie przechowywane w lojalnościowej bazie danych w synchronizacji z moimi innymi aplikacjami, możemy subskrybować nową kolejkę FIFO do tego samego tematu FIFO i dodać nową funkcję Lambdy, która otrzymuje aktualizacje konsumenta w takiej samej kolejności, w jakiej zostały wygenerowane, a następnie dodaje je do lojalnościowej bazy danych. W ten sposób nie musimy zmieniać kodu i konfiguracji innych aplikacji, aby zintegrować nową aplikację lojalnościową.
Na początek tworzymy dwie kolejki FIFO w konsoli SQS, pozostawiając wszystkie opcje domyślne:
- Kolejka customer.fifo do przetworzenia aktualizacji w moim systemie zarządzania klienta;
- Kolejka loyalty.fifo, aby pomóc mi zebrać i przechowywać aktualizacje klientów z aplikacji lojalnościowej.
W konsoli SNS tworzymy temat updates.fifo. Wybieramy FIFO jako typ i aktywuję deduplikację wiadomości opartą na treści.
Następnie subskrybujemy kolejki customer.fifo i loyalty.fifo do tematu.
Aby móc otrzymywać wiadomości, dodajemy oświadczenie do polityki dostępu dwóch kolejek, udzielając pozwolenia tematom updates.fifo w celu wysyłania komunikatów do kolejek. Dla przykładu oświadczenie dla kolejki customer.fifo wygląda następująco:
Następnie używamy konsoli SNS do opublikowania 4 wiadomości w sekwencji. Dla wszystkich wiadomości używamy tego samego ID. W ten sposób wszystkie znajdą się w tej samej grupie komunikatów. Jedyną częścią, która się różni, jest korpus wiadomości, gdzie używamy w kolejności:
- Aktualizacja 1
- Aktualizacja 2
- Aktualizacja 3
- Aktualizacja 1
W tej konsoli widzimy tylko 3 wiadomości, które zostały dostarczone do kolejki FIFO:
Dlaczego tak się dzieje? Kiedy stworzyliśmy tematy FIFO, umożliwiliśmy deduplikację opartą na treści. 4 wiadomości zostały wysłane w ciągu 5-minutowego okna deduplikacji. Ostatnia wiadomość została rozpoznana jako duplikat pierwszej i nie została dostarczona do subskrybowanej kolejki.
Sprawdźmy aktualne komunikaty w kolejce. Korzystamy z AWS Command Line Interface (CLI), aby móc otrzymywać wiadomość z SQS oraz jq command-line JSON processor do formatowania wyniku i otrzymywania jedynie komunikatu w korpusie.
Tutaj znajdują się komunikaty w kolejce customer.fifo:
A tutaj znajdują się komunikaty w kolejce loyalty.fifo:
Tak jak przewidywano, 3 komunikaty z unikalną treścią zostały dostarczone do obu kolejek w takiej samej kolejności, w jakiej zostały wysłane.
Dostępne już teraz
Możesz używać tematów SNS FIFO we wszystkich obszarach handlowych. Możesz przetwarzać nawet do 300 transakcji na sekundę (TPS) na temat FIFO lub kolejkę FIFO. Z SNS płacisz tylko za to, czego używasz. Więcej informacji znajdziesz w cenniku opłat.
Aby dowiedzieć się więcej, odsyłamy do dokumentacji.
Źródło: https://aws.amazon.com/