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:
- Czy wystarczy uznać usługę za zdrową, jeśli system koordynacji zgłasza, że zadanie jest uruchomione?
- A może powinniśmy ręcznie pingować każdą usługę?
- 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ą?
- 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?
- 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?
testing
web-services
user-experience
microservices
Phil Winder
źródło
źródło
Odpowiedzi:
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ń:
Nie, tylko dlatego, że proces jest uruchomiony, nie oznacza, że nie jest zawieszony, całkowicie niefunkcjonalny lub wiele innych możliwości.
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.
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?).
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).
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.
źródło
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!
źródło
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.
źródło