castomFLOW
Otwórz castomFLOW

Niezawodność

Nikt nie zauważa automatyzacji,dopóki nie wyśle czegoś dwa razy.

Wtedy zauważają wszyscy. Cztery mechanizmy z tej strony istnieją, bo awarie tego rodzaju oprogramowania to zawsze te same cztery awarie — i wszystkich czterech da się uniknąć konstrukcją, a nie starannością.

Symuluj przed publikacją

Przepuść prawdziwy rekord przez wyłączony proces i odczytaj dokładnie to, co by się stało: obraną ścieżkę, każdą wartość w każdym kroku, treść każdej wiadomości i żądanie, które poszłoby do każdego zewnętrznego systemu.

Nic nie opuszcza budynku. Żaden e-mail nie zostanie wysłany, żadna faktura wystawiona, żadna opłata pobrana, żaden wiersz zapisany. Wywołania zewnętrzne są zapisywane jako zamiary, razem z ładunkiem, który by poszedł, więc widzisz, czy mapowanie jest poprawne, zanim stanie się czyimś problemem.

Symulacje odpowiadają na pytanie, które powstrzymuje ludzi przed włączeniem automatyzacji: co to właściwie zrobi?

Symulacja · zamówienie 88 214Nic nie wysłano
  • 1Sprawdzenie adresuDopasowany. Zapisałby 6 pól.
  • ?WarunekZamówienie powyżej 1000 zł? Nie — 289,00 zł. Krótsza ścieżka.
  • 3FakturaWysłałby POST do systemu fakturowego. Ładunek pokazany w całości.
  • !Złapane tutajStawka VAT wzięta z niewłaściwego pola. Znalezione w symulacji, a nie w skrzynce księgowej.

Wysłano: nicPobrano: nic

Przebieg idzie wersją, na której wszedł

Opublikowanie zmiany nie rusza przebiegów, które są już w środku. Każdy przebieg jest przypięty do wersji, na której wystartował, i tę wersję dokańcza — niezależnie od tego, jak długo to trwa i ile w międzyczasie przepiszesz.

Możesz więc przebudować proces, gdy dziesięć tysięcy osób jest w połowie drogi, a każda z nich skończy przepływ, który jej obiecano. Alternatywa — konstrukcja materializująca całą dalszą ścieżkę już na wejściu — jest powodem, dla którego edytowanie działającej automatyzacji w większości narzędzi wydaje się ryzykowne. Tutaj jest zwyczajne.

Nowe przebiegi dostają nową wersję od momentu publikacji. Numer wersji jest zapisany na przebiegu, więc pytanie o zachowanie w marcu ma odpowiedź we wrześniu.

Edycja na żywov4 → v5
  • 1Przed2918 przebiegów w locie, wszystkie na v4. Część w dwudniowym oczekiwaniu.
  • 2Publikacja v5Dwa kroki przestawione, jedna wiadomość przepisana.
  • 3PoTe 2918 kończą v4. Wszystko od 11:40 idzie v5.
  • §Niktnie dostał połowy jednego procesu i połowy drugiego.

Wersja zapisana na każdym przebieguStare wersje zachowane

Ponowienia, które nie mogą wysłać dwa razy

Krok jest funkcją czystą swoich danych wejściowych, a jego skutki zapisują się razem z przesunięciem przebiegu na kolejny krok. Nie ma okna, w którym wiadomość już poszła, a przebieg jeszcze o tym nie wie.

Na tym polega cała sztuczka i jest to własność konstrukcji, a nie obietnica. Proces roboczy zabity w połowie kroku — wdrożenie, awaria, znikająca maszyna — zostawia przebieg dokładnie tam, gdzie był. Inny proces go podnosi i powtarza krok. Ponieważ skutek i przesunięcie zapisują się razem, albo zdarzyło się jedno i drugie, albo nic.

Wywołania do systemów obsługujących klucze idempotencji niosą taki klucz, wyprowadzony z przebiegu i kroku, żeby druga strona też rozpoznała powtórzenie.

Proces zabity w trakcie wysyłkiOdzyskany
  • 1Krok 5 startujeWyślij powiadomienie o wysyłce.
  • ✕Worker ginieWdrożenie. Nic nie zdążyło się zapisać.
  • 2PodjętyInny worker znajduje przebieg wciąż na kroku 5.
  • ✓Wysłane razKlient dostał jeden e-mail, nie dwa.

Skutki zapisują się z przesunięciemKlucz idempotencji na przebieg i krok

Dziennik napisany dla człowieka

Każdy przebieg, każdy krok, obrane rozgałęzienie i wartość, która o nim zdecydowała. Czasy na krok. Żądanie i odpowiedź każdego wywołania zewnętrznego, z zamaskowanymi danymi dostępowymi. Wersja, na której szedł przebieg. Miejsce, w którym czeka, i do kiedy.

Gdy ktoś pyta, co stało się z zamówieniem złożonym czternastego, jest odpowiedź, a znalezienie jej zajmuje minutę, a nie popołudnie zestawiania dzienników z trzech systemów.

Nieudane przebiegi zbierają się w jednym miejscu z pogrupowaną przyczyną, więc „czterdzieści jeden błędów w nocy” zamienia się w „jeden dostawca zwracał 503 przez dziewięć minut”, a nie w czterdzieści jeden osobnych śledztw.

Noc, pogrupowana41 błędów
  • 1Jedna przyczynaAPI dostawcy zwracało 503 między 02:41 a 02:50.
  • 2Co się stałoWszystkie 41 ponowione; 39 przeszło za drugim razem.
  • 3ZostałoDwa zatrzymane, czekają na człowieka. Oba z wierszem, który zawiódł.
  • §Nie czterdzieści jedenśledztw. Jedno — i decyzja o dwóch rekordach.

Dane dostępowe zamaskowaneWersja zapisana

Czego nie deklarujemy.

Nie publikujemy liczby dostępności na stronie marketingowej, bo liczba bez okna pomiaru i definicji „działa” jest ozdobą. Jeśli potrzebujesz jej w umowie, napisz — porozmawiamy o tym, do czego faktycznie możemy się zobowiązać.

Nie potrafimy też sprawić, żeby cudze API było niezawodne. Gdy dostawca nie działa, zależny od niego proces czeka, ponawia i w końcu zatrzymuje się z czytelnym powodem. Możemy obiecać, że awaria będzie widoczna, że niczego nie uszkodzi i że wznowienie nie wyśle wiadomości po raz drugi.

O oczekiwaniach: przebieg czekający dwa dni to wake_at na przebiegu, a nie zadanie stojące w kolejce. Dlatego proces może trzymać sto tysięcy przebiegów w trzytygodniowym oczekiwaniu bez żadnego kosztu i dlatego liczba aktualnie czekających przebiegów nie jest czymś, o czym musisz myśleć.

Nie myślisz o przebiegu?
Znaczy, że zadziałał.

Ilustracje: GetIllustrations.com (pakiet Blues).