To klasyczne pytanie, które zadano mi niedawno podczas wywiadu. Jak zadzwonić do wielu serwisów internetowych i jednocześnie zachować pewną obsługę błędów w środku zadania. Dzisiaj w obliczeniach o wysokiej wydajności unikamy zatwierdzeń dwufazowych. Wiele lat temu czytałem artykuł o tak zwanym „modelu Starbuck” dla transakcji: Pomyśl o procesie zamawiania, płacenia, przygotowywania i odbierania kawy, którą zamawiasz w Starbuck ... Upraszczam rzeczy, ale model zatwierdzania dwufazowego sugerują, że cały proces byłby pojedynczą transakcją owijania wszystkich etapów do momentu otrzymania kawy. Jednak w tym modelu wszyscy pracownicy będą czekać i przestać pracować, aż dostaniesz kawę. Widzisz zdjęcie?
Zamiast tego „model Starbuck” jest bardziej produktywny dzięki przestrzeganiu modelu „najlepszego wysiłku” i kompensacji błędów w procesie. Po pierwsze, upewniają się, że zapłacisz! Następnie są kolejki wiadomości z zamówieniem dołączonym do kubka. Jeśli coś pójdzie nie tak, jak na przykład, że nie dostałeś kawy, to nie jest to, co zamówiłeś itp., Przystępujemy do procesu kompensacji i upewniamy się, że dostaniesz to, czego chcesz lub zwrócimy ci pieniądze. dla zwiększenia wydajności.
Czasami Starbuck marnuje kawę, ale cały proces jest wydajny. Istnieją inne sztuczki do przemyślenia podczas tworzenia usług internetowych, takie jak projektowanie ich w taki sposób, aby można je było wywołać dowolną liczbę razy i nadal zapewniać ten sam efekt końcowy. Więc moje zalecenie to:
Nie bądź zbyt precyzyjny w definiowaniu swoich usług internetowych (nie jestem przekonany o szumie w mikrosługach, który ma miejsce w dzisiejszych czasach: zbyt duże ryzyko posunięcia się za daleko);
Asynchronizacja zwiększa wydajność, więc wolisz być asynchronicznym, w miarę możliwości wysyłaj powiadomienia pocztą elektroniczną.
Zbuduj bardziej inteligentne usługi, aby umożliwić ich „wielokrotne” odwoływanie dowolną liczbę razy, przetwarzając za pomocą UID lub Taskid, które będą postępować zgodnie z zamówieniem od dołu do końca, sprawdzając reguły biznesowe na każdym etapie;
Używaj kolejek komunikatów (JMS lub innych) i przekierowuj do procesorów obsługi błędów, które zastosują operacje do „wycofania” poprzez zastosowanie przeciwnych operacji, nawiasem mówiąc, praca z kolejnością asynchroniczną będzie wymagała jakiejś kolejki do sprawdzenia aktualnego stanu procesu, więc zastanów się nad tym;
W ostateczności (ponieważ może się to nie zdarzać często) umieść go w kolejce do ręcznego przetwarzania błędów.
Wróćmy do pierwotnego problemu, który został opublikowany. Utwórz konto, utwórz portfel i upewnij się, że wszystko zostało zrobione.
Załóżmy, że usługa internetowa jest wywoływana w celu koordynowania całej operacji.
Pseudo-kod usługi internetowej wyglądałby następująco:
Zadzwoń do mikroserwisu tworzenia konta, przekaż mu trochę informacji i wyjątkowy identyfikator zadania 1.1 Mikrousługa tworzenia konta najpierw sprawdzi, czy to konto zostało już utworzone. Identyfikator zadania jest powiązany z rekordem konta. Mikrousługa wykrywa, że konto nie istnieje, więc tworzy je i przechowuje identyfikator zadania. UWAGA: tę usługę można wywołać 2000 razy, zawsze będzie ona działać tak samo. Usługa odpowiada „paragonem zawierającym minimalne informacje do wykonania operacji cofania, jeśli jest to wymagane”.
Zadzwoń do tworzenia portfela, podając identyfikator konta i identyfikator zadania. Załóżmy, że warunek jest nieprawidłowy i nie można wykonać tworzenia portfela. Wywołanie zwraca błąd, ale nic nie zostało utworzone.
Orkiestrator jest informowany o błędzie. Wie, że musi przerwać tworzenie konta, ale nie zrobi tego sam. Poprosi o to usługę portfela, przekazując „minimalne potwierdzenie cofnięcia” otrzymane na końcu kroku 1.
Usługa Konto odczytuje potwierdzenie cofnięcia i wie, jak cofnąć operację; potwierdzenie cofnięcia może nawet zawierać informacje o innej mikrousługie, którą mógłby nazwać wykonaniem części zadania. W tej sytuacji potwierdzenie cofnięcia może zawierać identyfikator konta i ewentualnie dodatkowe informacje wymagane do wykonania odwrotnej operacji. W naszym przypadku, dla uproszczenia, powiedzmy, że wystarczy usunąć konto, używając jego identyfikatora.
Załóżmy teraz, że usługa internetowa nigdy nie otrzymała sukcesu ani niepowodzenia (w tym przypadku), że cofnięcie utworzenia konta zostało wykonane. Po prostu ponownie wywoła usługę cofania konta. I ta usługa zwykle nie powinna nigdy zawieść, ponieważ jej celem jest, aby konto już nie istniało. Sprawdza więc, czy istnieje i widzi, że nic nie można zrobić, aby go cofnąć. Zwraca więc, że operacja się powiodła.
Usługa internetowa zwraca użytkownikowi, że nie można utworzyć konta.
To jest przykład synchroniczny. Moglibyśmy to zrobić w inny sposób i umieścić skrzynkę w kolejce wiadomości skierowanej do działu pomocy technicznej, jeśli nie chcemy, aby system całkowicie odzyskał błąd ". Widziałem, jak dzieje się to w firmie, w której jest za mało do systemu zaplecza można było podłączyć haki, aby poprawić sytuację. Dział pomocy technicznej otrzymał wiadomości zawierające informacje o tym, co zostało wykonane pomyślnie i miał wystarczającą ilość informacji, aby naprawić rzeczy, podobnie jak nasze potwierdzenie cofnięcia może być wykorzystane w pełni zautomatyzowany sposób.
Przeprowadziłem wyszukiwanie, a strona internetowa Microsoft zawiera opis wzorca dla tego podejścia. Nazywa się to wzorcem transakcji kompensacyjnej:
Kompensacyjny wzorzec transakcji