Wybierz dostawę opartą na komunikatach przy użyciu kolejek
Załóżmy, że planujesz architekturę aplikacji do udostępniania muzyki. Chcesz mieć pewność, że pliki muzyczne są niezawodnie przekazywane do internetowego interfejsu API z aplikacji mobilnej. Następnie chcesz dostarczyć szczegółowe informacje o nowych piosenkach bezpośrednio do aplikacji, gdy artysta dodaje nową muzykę do swojej kolekcji. Ten scenariusz jest idealnym zastosowaniem systemu opartego na komunikatach, a platforma Azure oferuje dwa rozwiązania tego problemu:
- Azure Queue Storage
- Azure Service Bus
Co to jest usługa Azure Queue Storage?
Queue Storage to usługa, która używa usługi Azure Storage do przechowywania dużej liczby komunikatów, do których można bezpiecznie uzyskiwać dostęp z dowolnego miejsca na świecie przy użyciu prostego interfejsu opartego na protokole REST. Kolejki mogą zawierać miliony komunikatów, ograniczone tylko przez pojemność konta magazynu, które jest jego właścicielem.
Co to są kolejki usługi Azure Service Bus?
Service Bus to system brokera komunikatów przeznaczony dla aplikacji dla przedsiębiorstw. Te aplikacje często korzystają z wielu protokołów komunikacyjnych, mają różne kontrakty danych i wyższe wymagania dotyczące zabezpieczeń oraz mogą obejmować zarówno usługi w chmurze, jak i lokalne. Usługa Service Bus jest oparta na dedykowanej infrastrukturze obsługi komunikatów zaprojektowanej pod kątem dokładnie tych scenariuszy.
Obie te usługi są oparte na idei kolejki, która przechowuje wysyłane wiadomości, dopóki adresat nie będzie gotowy do ich odbierania.
Co to są tematy usługi Azure Service Bus?
Tematy usługi Azure Service Bus są podobne do kolejek, ale mogą mieć wielu subskrybentów. Po wysłaniu wiadomości do tematu zamiast kolejki można uruchomić wiele komponentów, aby wykonały swoją pracę. Wyobraź sobie, że użytkownik słucha piosenki w aplikacji do udostępniania muzyki. Aplikacja mobilna może wysłać wiadomość do tematu Listened
. Ten temat będzie miał subskrypcję dla UpdateUserListenHistory
i inną subskrypcję dla UpdateArtistsFanList
. Każda z tych funkcji jest obsługiwana przez inny składnik, który odbiera własną kopię komunikatu.
Wewnętrznie tematy używają kolejek. Po opublikowaniu w temacie komunikat zostanie skopiowany i umieszczony w kolejce dla każdej subskrypcji. Kolejka oznacza, że kopia komunikatu pozostaje, aby mogła być przetworzona przez każdą gałąź subskrypcji, nawet wtedy, gdy składnik przetwarzający tę subskrypcję jest zbyt zajęty, aby nadążyć z przetwarzaniem.
Zalety kolejek
Infrastruktura kolejek może obsługiwać wiele zaawansowanych funkcji, które sprawiają, że są przydatne w następujący sposób:
Zwiększona niezawodność
Kolejki są używane przez aplikacje rozproszone jako tymczasową lokalizację przechowywania komunikatów oczekujących na dostarczenie do składnika docelowego. Składnik źródłowy może dodać komunikat do kolejki, a składnik docelowy może pobrać komunikat z przodu kolejki do przetwarzania. Kolejki zwiększają niezawodność wymiany komunikatów, ponieważ w czasach wysokiego zapotrzebowania komunikaty mogą czekać, aż składnik docelowy będzie gotowy do ich przetworzenia.
Gwarancje dostarczania komunikatów
Systemy kolejkowania zwykle gwarantują dostarczanie każdego komunikatu w kolejce do składnika docelowego. Jednak te gwarancje mogą mieć różne podejścia:
at-Least-Once Delivery: W tym podejściu każda wiadomość ma gwarancję dostarczenia do co najmniej jednego z komponentów pobierających wiadomości z kolejki. Należy jednak pamiętać, że w pewnych okolicznościach jest możliwe, że ten sam komunikat jest dostarczany więcej niż raz. Na przykład, jeśli istnieją dwie instancje aplikacji internetowej, które pobierają komunikaty z kolejki, zwykle każdy komunikat trafia tylko do jednej z tych instancji. Jeśli jednak przetworzenie komunikatu przez jedno wystąpienie trwa długo, a limit czasu zostanie przekroczony, komunikat może zostać wysłany również do drugiego wystąpienia. Kod aplikacji internetowej powinien być zaprojektowany z tą możliwością.
at-Most-Once Delivery: W tym podejściu każda wiadomość nie ma gwarantowanego dostarczenia, jednak istnieje pewna szansa, że nie dotrze. Jednak w przeciwieństwie do dostarczania metodą At-Least-Once, nie ma możliwości, aby wiadomość została dostarczona dwa razy. Czasami jest to nazywane automatycznym wykrywaniem duplikatów.
First-Out (FIFO): W większości systemów obsługi komunikatów wiadomości zwykle opuszczają kolejkę w takiej samej kolejności, w jakiej zostały dodane, ale warto rozważyć, czy gwarantowane jest utrzymanie tej kolejności dostarczania. Jeśli aplikacja rozproszona wymaga, aby komunikaty zostały przetworzone dokładnie w odpowiedniej kolejności, należy wybrać system kolejki, który zawiera gwarancję FIFO.
Obsługa transakcyjna
Niektóre ściśle powiązane grupy komunikatów mogą powodować problemy, gdy dostarczanie zakończy się niepowodzeniem dla jednego komunikatu w grupie.
Rozważmy na przykład aplikację do handlu elektronicznego. Gdy użytkownik wybierze przycisk Kup, może zostać wygenerowana seria komunikatów i wysłana do różnych miejsc docelowych przetwarzania:
- Wiadomość ze szczegółami zamówienia jest wysyłana do centrum realizacji
- Wiadomość z sumą i szczegółami płatności jest wysyłana do procesora kart kredytowych
- Wiadomość z informacjami o potwierdzeniu jest wysyłana do bazy danych w celu wygenerowania faktury dla klienta
W tym przypadku chcemy mieć pewność, że wszystkie komunikaty są przetwarzane lub żaden z nich nie jest przetwarzany. Nie będziemy długo w firmie, jeśli wiadomość o karcie kredytowej nie zostanie dostarczona, a wszystkie nasze zamówienia zostaną zrealizowane bez płatności. Tego rodzaju problemy można uniknąć, grupując dwa komunikaty w transakcję. Transakcje komunikatów kończą się powodzeniem lub niepowodzeniem jako całość, podobnie jak w świecie baz danych. Jeśli dostarczenie komunikatu ze szczegółami karty kredytowej zakończy się niepowodzeniem, to samo stanie się z komunikatem ze szczegółami zamówienia.
Którą usługę należy wybrać?
Po zrozumieniu, że strategia komunikacji dla tej architektury powinna być komunikatem, należy wybrać, czy używać kolejek usługi Azure Storage, czy usługi Azure Service Bus. Obie technologie umożliwiają przechowywanie i dostarczanie komunikatów między składnikami. Każdy z nich ma nieco inny zestaw funkcji, co oznacza, że możesz wybrać jeden lub drugi albo użyć obu, w zależności od rozwiązywanego problemu.
Użyj kolejek usługi Service Bus, jeśli:
- Potrzebujesz gwarancji dostawy o oznaczeniuMost-Once.
- Potrzebujesz gwarancji FIFO.
- Należy pogrupować komunikaty w transakcje.
- Chcesz odbierać komunikaty bez sondowania kolejki.
- Należy udostępnić model dostępu opartego na rolach do kolejek.
- Należy obsługiwać komunikaty większe niż 64 KB, ale mniej niż 100 MB. Maksymalny rozmiar komunikatu obsługiwany przez warstwę Standardowa to 256 KB, a warstwa Premium to 100 MB.
- Rozmiar kolejki nie będzie większy niż 1 TB. Maksymalny rozmiar kolejki dla warstwy Standardowa wynosi 80 GB, a warstwa Premium wynosi 1 TB.
- Chcesz publikować i korzystać ze zbiorów komunikatów.
Użyj tematów z usługi Service Bus, jeśli:
- "Potrzebujemy wszystkich funkcji udostępnianych przez kolejki usługi Service Bus, a ponadto zaimplementujcie wzorzec pub-sub, w którym komunikaty mogą być kierowane do jednej z wielu subskrypcji, z których każda ma własne niezależne odbiorniki."
Usługa Queue Storage nie jest tak bogata w funkcje, ale jeśli nie potrzebujesz żadnej z tych funkcji, może to być prostszy wybór. Ponadto jest to najlepsze rozwiązanie, jeśli aplikacja ma jakiekolwiek z poniższych wymagań.
Użyj usługi Queue Storage, jeśli:
- Potrzebujesz ścieżki audytu wszystkich komunikatów przechodzących przez kolejkę.
- Spodziewaj się, że rozmiar kolejki przekroczy 1 TB.
- Chcesz śledzić postęp przetwarzania komunikatu wewnątrz kolejki.
Kolejka to prosta tymczasowa lokalizacja przechowywania komunikatów wysyłanych między składnikami aplikacji rozproszonej. Użyj kolejki, aby zorganizować komunikaty i bezpiecznie obsługiwać nieprzewidywalne wzrosty zapotrzebowania.
Użyj kolejek usługi Storage, jeśli potrzebujesz prostego systemu kolejek, który jest łatwy do zakodowania. Aby spełnić bardziej zaawansowane potrzeby, użyj kolejek usługi Service Bus. Jeśli masz wiele miejsc docelowych dla jednego komunikatu, ale potrzebujesz zachowania przypominającego kolejkę, użyj tematów usługi Service Bus.