Ekspertyza · Złożone architektury
Więcej systemów, które muszą działać razem, także wtedy, gdy jeden z nich pada.
Projektujemy i obsługujemy platformy z wielu usług, z magistralą wiadomości, ograniczonymi ponowieniami, kluczami idempotencji, wyłącznikami obwodu i publikacją z automatycznym powrotem. Każdy z poniższych wzorców działa we własnym systemie, a nie na diagramie.
Już zbudowaneObsługujemy cztery własne platformy o różnych architekturach i możemy otworzyć je wszystkie. Liczby są mierzone dziś poleceniami, a nie pobrane z dokumentacji: aichat ma 28 katalogów usług, 235 modeli danych na czterech schematach i magistralę wiadomości z 297 kolejkami i 17.525 połączeniami; Kallina ma 472 funkcje edge, 559 migracji i 28 zaplanowanych zadań w bazie; MEGA CRM ma backend o długości 9.516 linii z 99 trasami i 179 politykami dostępu na wiersz; Taskin uruchamia 21 zaplanowanych zadań bez żadnego Dockera. Zastrzeżenie, które podajemy: w dwóch miejscach własna dokumentacja została w tyle za kodem — stwierdzenie o liczbie linii było przestarzałe o 16%, a diagram infrastruktury opisywał serwer, na którym już nic nie uruchamiamy. Użyliśmy pomiaru, nie dokumentu.
„Złożona architektura” nie oznacza wielu pudełek na rysunku. Oznacza, że wiesz, co się dzieje, gdy jedno z nich nie odpowiada. System z trzema usługami wywołującymi się synchronicznie, bez limitu ponowień i bez idempotencji, jest bardziej kruchy niż monolit — bo każde nowe połączenie to nowy sposób awarii, a sposobów awarii przybywa szybciej niż funkcjonalności.
Nasza praca wychodzi od podziału odpowiedzialności i kończy się na tym, co widać, gdy coś się psuje. Na jednej z własnych platform wiadomości nie przechodzą bezpośrednio między usługami, lecz przez magistralę z 297 kolejkami, 9 wymianami i 17.525 połączeniami, z których 278 kolejek jest generowanych per klient, a nie pisanych ręcznie. Osiem kolejek ma wymianę dead letter i osiem ma czas życia wiadomości pięć minut — czyli wiadomość, której nie można przetworzyć, trafia gdzieś, gdzie można ją zobaczyć, a nie znika.
Wzorce, które stosujemy, są nieliczne i powtarzalne: ponowienia z limitem zapisanym w kodzie, klucze idempotencji sprawiające, że druga dostawa tego samego zdarzenia jest nieszkodliwa, przełącznik, który zatrzymuje wywołania do usługi padającej powtarzalnie, bramka konsumpcji przed czynnościami kosztującymi pieniądze oraz alerty z progiem powtórzeń, aby usterka przerywana nie pogrzebała reszty.
Ostatnia część, ta, której nie widać: publikacja. Jedna z platform jest publikowana przez synchronizację plików, bez Docker, z weryfikacją, że serwowana strona zawiera dokładnie identyfikator pakietu właśnie opublikowanego — nie tylko że serwer odpowiada 200 — oraz z automatycznym powrotem do poprzedniej wersji, jeśli weryfikacja nie przejdzie. Reguła powstała po realnym incydencie, w którym powierzchowna kontrola anulowała dobrą publikację.