Jaki powinien być zakres sprawdzania poprawności systemu, który wdraża aplikację internetową?


13

Dzisiaj miałem zadanie „napisać test kondycji” dla długo działającej usługi, która jest systemem koordynacyjnym do wdrażania aplikacji internetowej.

Próbuję ustalić, jaki byłby zakres takiej kontroli zdrowia, i wymyśliłem następujące pytania związane z zakresem kontroli zdrowia:

  1. Czy wystarczy uznać usługę za zdrową, jeśli system koordynacji zgłasza, że ​​zadanie jest uruchomione?
  2. A może powinniśmy ręcznie pingować każdą usługę?
  3. A może powinien pójść dalej i spróbować upewnić się, że aplikacja internetowa robi to, co powinna, na przykład wyświetlać stronę internetową?
  4. Czy kontrola zdrowia musi również sprawdzać, czy niektóre usługi zależne również działają? Jak baza danych lub sam system orkiestracji. Czy jest to odpowiedzialność za kolejną kontrolę stanu zdrowia?
  5. I na koniec, jeśli jedna z usług zależnych nie działa, a aplikacja internetowa następnie ulegnie awarii, to czy powinna ona zgłosić zły stan zdrowia, czy też jest dobry, ponieważ nie jest to wina aplikacji internetowych?

Wiem, że jest to 5 osobnych pytań, ale wszystkie dotyczą zakresu sprawdzania kondycji długoterminowej usługi, która wdraża aplikację internetową, więc pomyślałem, że sensowniej byłoby trzymać je zgrupowane w jednym pytaniu.

Jest to dla mnie trudne do wdrożenia, ponieważ nie jestem pewien definicji tego, co jest zdrowe, ani jak powinna wyglądać standardowa kontrola stanu dla czegoś takiego.

Co powinna zawierać kontrola stanu tej konkretnej usługi?


2
Nigdy nie ufaj automatycznym raportom o stanie. Zawsze sprawdź sam status. Ciekawostki: Jedną z przyczyn incydentu w Tree Mile Island był wskaźnik „zamknięty zawór”, który w rzeczywistości wskazywał tylko, że wydano polecenie „zamknij zawór” , a nie to, że zawór był faktycznie zamknięty .
Kilian Foth

@KilianFoth: na podobny temat: znam firmę, która religijnie i gruntownie przetestowała, czy ich kopie zapasowe działają. Pewnego dnia mieli katastrofalną awarię dysku i dowiedzieli się: ich przywrócenie nie.
Jörg W Mittag

7
Myślę, że to jest praca osoby, która poprosiła cię o „napisanie kontroli stanu zdrowia”, aby zdefiniować, co rozumieją przez „zdrowie”. W przeciwnym razie to tylko zgadywanie.
Jörg W Mittag

1
Zgadzam się z komentarzem @ JörgWMittag, ale zrobiłbym nawet krok dalej. Powinieneś otrzymać swoje wymagania nie tylko od osoby, która powiedziała ci, że musisz zaprojektować „kontrolę stanu zdrowia”, ale także dowiedzieć się, kim są ludzie lub systemy, którzy wykorzystują dane będące częścią kontroli stanu zdrowia i dowiedzieć się, co oni potrzebują lub jak tego potrzebują. To są twoje wymagania, które będą napędzać twój projekt.
Thomas Owens

1
Wyjaśniłem to nieco i głosowałem za ponownym otwarciem, ponieważ myślę, że główne pytanie dotyczy tematu. Zrozumienie, jak rozpoznać, co powinno zostać uwzględnione w sprawdzeniu kondycji, jest całkowicie normalną rzeczą przy projektowaniu oprogramowania, nawet jeśli prawdziwą odpowiedzią jest „zapytaj o wymagania” (lub jego odmiana).
enderland

Odpowiedzi:


15

Jest to trudne do wdrożenia ze względu na definicję tego, co jest zdrowe

Odpowiedziałeś tutaj na swoje pytanie. Definicja kontroli zdrowia będzie się różnić, ponieważ to, co jest zdrowe, jest różne. Zależy to również od tego, co wydaje kontrolę zdrowia.

Dobrym pytaniem, jakie należy sobie zadać, jest „z perspektywy pytającego, czy sprawdzona usługa działa zgodnie z oczekiwaniami?” Jeśli to ty, musisz to zdefiniować. Jeśli jest to inny zespół / usługa, musisz określić, jaki jest standard / specyfikacja kontroli zdrowia.

Prawdopodobnie w dużej organizacji będziesz miał jakiś standard tego, co powinna zrobić kontrola zdrowia. Rozwiąż to.

W szczególności tutaj przykład twojej aplikacji internetowej oznacza, że ​​nie powinna ona być zdrowa, ponieważ aplikacja internetowa nie jest zdrowa. Ale być może twoja definicja „zdrowego” zawierałaby to jako „ok”. Jest to część powyższej dyskusji na temat wymagań (ponownie, nawet jeśli jest to tylko twój własny kod).

Moim zaleceniem, zakładając, że nie jest ono określone gdzie indziej, byłoby skojarzenie jakiegoś kodu statusu z różnymi awariami. Podczas zapytania do aplikacji internetowej może zostać zwrócony błąd z informacją, że „usługa zależna nie działa”, dzięki czemu klient (lub cokolwiek, co wykonuje sprawdzanie kondycji) może poznać przyczynę śmierci klienta.

W przypadku edytowanych pytań:

Czy wystarczy uznać usługę za zdrową, jeśli system koordynacji zgłasza, że ​​zadanie jest uruchomione?

Nie, tylko dlatego, że proces jest uruchomiony, nie oznacza, że ​​nie jest zawieszony, całkowicie niefunkcjonalny lub wiele innych możliwości.

A może powinniśmy ręcznie pingować każdą usługę?

Może to działać, w zależności od zakresu funkcjonalności aplikacji. Jeśli weryfikacja usługi odpowiada „Czy żyjesz?” ping, to może być wszystko, co jest wymagane. Ale jeśli usługa może być „żywa i responsywna, ale faktycznie nie działa”, być może trzeba też sprawdzić inne rzeczy.

A może powinien pójść dalej i spróbować upewnić się, że aplikacja internetowa robi to, co powinna, na przykład wyświetlać stronę internetową?

Kontrola zdrowia musi zapewnić, że oczekiwana wymagana funkcjonalność działa zgodnie z oczekiwaniami.

Jeśli przywracany APP „zdrowy” i nie można zrobić to, co trzeba zrobić, równie dobrze można pozbyć się całego Healthcheck jak to daje fałszywe alarmy (nie wspominając mylić cholery z ludzi próbujących debugować problem - „hey nasz serwer pokazuje, dlaczego strona nie jest widoczna?).

Czy kontrola zdrowia musi również sprawdzać, czy niektóre usługi zależne również działają? Jak baza danych lub sam system orkiestracji. Czy jest to odpowiedzialność za kolejną kontrolę stanu zdrowia?

To trochę zależy. Jeśli Twoja usługa zależy od innej usługi, charakter tej interakcji powinien zostać odzwierciedlony w połączeniach API / połączeniach sieciowych wysyłanych do niej w Twojej aplikacji i włączanych do kontroli poprawności.

Na przykład serwer WWW odczytujący z bazy danych musi mieć wbudowane w nią informacje o stanie - w przeciwnym razie aplikacja internetowa ulegnie awarii, jeśli wywołania interfejsu API zakończą się niepowodzeniem. Możesz w trywialny sposób modyfikować te połączenia, aby włączyć je do kontroli zdrowia.

Jeśli jednak Twoja usługa wysyła zdarzenia do konsumentów, którzy nasłuchują, bez jakiejkolwiek weryfikacji, to dla funkcjonalności aplikacji nie ma większego znaczenia, że konsumenci żyją. „Zdrowe” do Twojej aplikacji to wysyłanie wiadomości, a nie ich odbieranie.

Zasadniczo, jeśli twoja usługa musi i tak rozmawiać z innymi usługami i zweryfikować ich kondycję, sensownie jest mieć przynajmniej podstawowy poziom kontroli w tym celu dla kontroli kondycji twojej usługi. Powinno to mieć sens koncepcyjny, biorąc pod uwagę to, co właśnie powiedziałem, ponieważ twoja aplikacja już sobie z tym poradzi (lub, jak sądzę, przypadkowa awaria).

I na koniec, jeśli jedna z usług zależnych nie działa, a aplikacja internetowa następnie ulegnie awarii, to czy powinna ona zgłosić zły stan zdrowia, czy też jest dobry, ponieważ nie jest to wina aplikacji internetowych?

Odpowiedzi na to w zasadzie powyżej. Radzę, aby sprawdzanie stanu zdrowia zwróciło kod / wiadomość / cokolwiek, co daje te informacje. Obie informacje są ważne: że usługa zależna, której potrzebuje twoja usługa, jest martwa i że twoja usługa nie będzie działać zgodnie z oczekiwaniami.


2

Ogólnie kontrola stanu zdrowia oznacza po prostu „czy żyje i czy reaguje”. Dalsze kontrole są wysoce wyspecjalizowane i zależą wyłącznie od użytkowania systemu. Niezależnie od tego, czy dokładasz wszelkich starań, aby sprawdzić, czy system poprawnie przetwarza żądania, musisz najpierw zapoznać się z podstawami - sprawdź, czy tam jest, czy może odbierać żądania i zwróci odpowiedź.

Najłatwiejszym sposobem zaimplementowania kontroli poprawności jest napisanie polecenia, które usługa przetwarza za pomocą tego samego mechanizmu, którego używają inne polecenia, co nie robi nic poza zwrotem potwierdzenia. To pokaże żywotność, a system odbiera i przetwarza odpowiedzi.

Sprawdzanie systemów zależnych nie jest częścią kontroli poprawności, musisz zachować prostotę i niezależność. Dodaj po kolei kontrolę stanu do każdej usługi zależnej. W ten sposób możesz uzyskać listę działających, zdrowych systemów i łatwo stwierdzić, kiedy coś pójdzie źle, który to jest!


W systemie, który piszę, po prostu odpytuję każdą usługę zależną o informacje o jej wersji. Jeśli odpowiada w odpowiednim czasie (w moim przypadku 2500 ms), jest to uważane za „aktywne”. Odpytuję je wszystkie równolegle, więc mój najgorszy czas odpowiedzi jest ograniczony.
TMN

1

Z mojego doświadczenia wynika, że ​​usługi krytyczne mają zwykle następujące funkcje:

Bicie serca

Jeśli usługa działa regularnie, to po prostu zapisuje wiersz do pliku dziennika lub podobnego wraz ze znacznikiem czasu, aby wskazać, że usługa uruchomiła się w danym momencie.

Bułka tarta

Podobnie do powyższego, bułka tarta jest zwykle tylko zrzutem nazwy metody (i czasami parametrów), aby pokazać, że usługa przetwarza treść usługi zgodnie z oczekiwaniami i gdzie jest w przepływie. Ponieważ mogą generować więcej danych wyjściowych, są one zwykle kontrolowane przez pliki konfiguracyjne lub podobne, dzięki czemu można je wyłączyć po włożeniu usługi.


Dodanie wielu innych informacji, takich jak stan różnych serwerów, usług i baz danych itp., Może być kuszące. Chociaż jest to bez wątpienia cenne, odradzam pisanie czegokolwiek zbyt obszernego. Mogą to być przydatne dla twojego spokoju ducha, ale takie zabezpieczenia są często nadużywane, gdy strony odpowiedzialne za różne punkty kontaktowe wiedzą, że tam są. Zanim się zorientujesz, możesz napisać aplikację diagnostyczną dla całej firmy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.