Zalecenia dotyczące samonaprawiania i samozachowawczego

Dotyczy tego zalecenia dotyczącego listy kontrolnej niezawodności platformy Azure Well-Architected Framework:

RE:07 Wzmocnienie odporności i możliwości odzyskiwania obciążenia przez zaimplementowanie środków samozachowawczych i samonaprawiania. Twórz możliwości w rozwiązaniu przy użyciu wzorców niezawodności opartych na infrastrukturze i wzorców projektowych opartych na oprogramowaniu w celu obsługi błędów składników i błędów przejściowych. Twórz możliwości w systemie w celu wykrywania awarii składników rozwiązania i automatycznego inicjowania akcji naprawczej, gdy obciążenie nadal działa w pełnej lub ograniczonej funkcjonalności.

Powiązane przewodniki:Błędy przejściowe zadań | w tle

W tym przewodniku opisano zalecenia dotyczące tworzenia funkcji samonaprawiania i samodzielnego zachowywania w architekturze aplikacji w celu zoptymalizowania niezawodności.

Funkcje samozachowawcze zapewniają odporność na obciążenie. Zmniejszają prawdopodobieństwo całkowitej awarii i umożliwiają działanie obciążenia w stanie obniżonej wydajności podczas odzyskiwania składników, które uległy awarii. Możliwości samonaprawiania pomagają uniknąć przestojów dzięki tworzeniu w wykrywaniu awarii i automatycznych akcjach naprawczych w celu reagowania na różne typy awarii.

W tym przewodniku opisano wzorce projektowe, które koncentrują się na samozachowawczym i samonaprawieniu. Uwzględnij je w obciążeniu, aby zwiększyć odporność i możliwość odzyskiwania. Jeśli nie implementujesz wzorców, aplikacje są narażone na awarie, gdy wystąpią nieuniknione problemy.

Definicje

Okres Definicja
Samonaprawianie Możliwość automatycznego rozwiązywania problemów przez odzyskiwanie składników, których dotyczy problem, i w razie potrzeby przechodzenie w tryb failover do nadmiarowej infrastruktury.
Samozachowawczego Możliwość odporności obciążenia na potencjalne problemy.

Kluczowe strategie projektowania

Wskazówki dotyczące samodzielnego zachowywania

Aby zaprojektować obciążenie na potrzeby samodzielnego zachowywania, postępuj zgodnie z wzorcami projektowymi architektury infrastruktury i aplikacji, aby zoptymalizować odporność obciążenia. Aby zminimalizować prawdopodobieństwo wystąpienia pełnej awarii aplikacji, zwiększ odporność rozwiązania, eliminując pojedyncze punkty awarii i minimalizując promień wybuchu awarii. Podejścia projektowe w tym artykule zawierają kilka opcji zwiększenia odporności obciążenia i spełnienia zdefiniowanych celów niezawodności obciążenia.

Wskazówki i wzorce dotyczące projektowania infrastruktury

Na poziomie infrastruktury projekt architektury nadmiarowej powinien obsługiwać krytyczne przepływy z zasobami wdrożonym w różnych strefach dostępności lub regionach. W miarę możliwości zaimplementuj skalowanie automatyczne . Autoskalowanie pomaga chronić obciążenie przed nieoczekiwanymi wzrostami aktywności, co jeszcze bardziej wzmacnia infrastrukturę.

Użyj wzorca sygnatur wdrożenia lub wzorca grodzi, aby zminimalizować promień wybuchu w przypadku wystąpienia problemów. Te wzorce pomagają zachować dostępność obciążenia, jeśli pojedynczy składnik jest niedostępny. Użyj następujących wzorców projektowych aplikacji w połączeniu ze strategią skalowania automatycznego.

  • Wzorzec sygnatur wdrażania: aprowizuj i monitoruj zróżnicowaną grupę zasobów oraz zarządzaj nimi, aby hostować i obsługiwać wiele obciążeń lub dzierżaw. Każda pojedyncza kopia jest nazywana sygnaturą, a czasami jednostką usługi, jednostką skalowania lub komórką.

  • Wzorzec grodziowy: partycjonowanie wystąpień usługi w różnych grupach, znanych jako pule, na podstawie wymagań dotyczących obciążenia i dostępności użytkownika. Ten projekt pomaga wyizolować awarie i umożliwia utrzymanie funkcjonalności usługi dla niektórych użytkowników, nawet podczas awarii.

Wskazówki i wzorce dotyczące projektowania aplikacji

Unikaj kompilowania aplikacji monolitycznych w projekcie aplikacji. Używaj luźno powiązanych usług lub mikrousług, które komunikują się ze sobą za pośrednictwem dobrze zdefiniowanych standardów, aby zmniejszyć ryzyko rozległych problemów, gdy awarie występują w jednym składniku. Można na przykład standarizować użycie magistrali usług do obsługi całej komunikacji asynchronicznej. Standaryzacja protokołów komunikacyjnych zapewnia spójność i uproszczenie projektu aplikacji, co sprawia, że obciążenie jest bardziej niezawodne i łatwiejsze do rozwiązywania problemów w przypadku wystąpienia awarii. W praktyce preferuj asynchroniczną komunikację między składnikami za pośrednictwem komunikacji synchronicznej, aby zminimalizować problemy z przekroczeniem limitu czasu, takie jak utracony komunikat. Poniższe wzorce projektowe ułatwiają organizowanie obciążenia i definiowanie komunikacji między składnikami w sposób, który najlepiej spełnia wymagania biznesowe.

  • Wzorzec ambasadora: oddziel logikę biznesową od kodu sieciowego i logiki odporności. Tworzenie usług pomocnika, które wysyłają żądania sieci w imieniu usługi lub aplikacji klienta. Ten wzorzec służy do implementowania mechanizmów ponawiania prób lub przerwania obwodu.

  • Wzorzec Request-Reply asynchronicznego: oddzielenie przetwarzania zaplecza od hosta frontonu, jeśli przetwarzanie zaplecza musi być asynchroniczne, ale fronton wymaga jasnej odpowiedzi.

  • Wzorzec z odkładania do pamięci podręcznej: ładowanie danych na żądanie z magazynu danych do pamięci podręcznej. Ten wzorzec może poprawić wydajność i zapewnić spójność danych przechowywanych w pamięci podręcznej i danych przechowywanych w bazowym magazynie danych.

  • Wzorzec wyłącznika: użyj wyłączników, aby aktywnie określić, czy zezwolić na kontynuowanie operacji, czy zwrócić wyjątek na podstawie liczby ostatnich awarii.

  • Wzorzec sprawdzania oświadczeń: podziel duży komunikat na sprawdzanie oświadczeń i ładunek. Wyślij kontrolę oświadczenia do platformy obsługi komunikatów i zapisz ładunek w usłudze zewnętrznej. Ten wzorzec umożliwia przetwarzanie dużych komunikatów przy jednoczesnej ochronie magistrali komunikatów i uniemożliwianie przeciążenia lub spowolnienia działania klienta.

  • Wzorzec konkurujących odbiorców: umożliwia wielu współbieżnych odbiorców przetwarzanie komunikatów odbieranych w tym samym kanale obsługi komunikatów. System może przetwarzać wiele komunikatów jednocześnie, co optymalizuje przepływność, zwiększa skalowalność i dostępność oraz równoważy obciążenie.

  • Konfigurowanie limitów czasu żądania: skonfiguruj limity czasu żądania dla wywołań do usług lub baz danych. Limity czasu połączenia z bazą danych są zwykle ustawiane na 30 sekund.

  • Wzorzec strażnika: ochrona aplikacji i usług przy użyciu dedykowanego wystąpienia hosta w celu brokera żądań między klientami a aplikacją lub usługą. Broker weryfikuje i oczyszcza żądania i może zapewnić dodatkową warstwę zabezpieczeń, aby ograniczyć obszar ataków systemu.

  • Wzorzec bilansowania obciążenia opartego na kolejce: rozdziel zadania z usługi w rozwiązaniu przy użyciu kolejki między nimi, aby można było je uruchamiać asynchronicznie. Użyj kolejki jako bufora między zadaniem a usługą, którą wywołuje, aby ułatwić płynne sporadyczne duże obciążenia, które mogą spowodować niepowodzenie usługi lub przekroczenie limitu czasu zadania. Ten wzorzec może pomóc zminimalizować wpływ szczytów zapotrzebowania na dostępność i czas odpowiedzi dla zadania i usługi.

  • Wzorzec ograniczania przepustowości: kontrolowanie zużycia zasobów używanych przez wystąpienie aplikacji, pojedynczej dzierżawy lub całej usługi. Ten wzorzec umożliwia systemowi dalsze działanie i spełnianie umów dotyczących poziomu usług (SLA), nawet wtedy, gdy wzrost zapotrzebowania powoduje ekstremalne obciążenie zasobów.

  • Wzorzec obsługi błędów przejściowych i wzorzec ponawiania prób: zaimplementuj strategię obsługi błędów przejściowych w celu zapewnienia odporności obciążenia. Błędy przejściowe są normalnymi i oczekiwanymi wystąpieniami w środowiskach chmury. Typowe przyczyny przejściowych błędów obejmują chwilową utratę łączności sieciowej, porzucone połączenie z bazą danych lub przekroczenie limitu czasu, gdy usługa jest zajęta. Aby uzyskać więcej informacji na temat opracowywania strategii ponawiania prób, zobacz przewodnik obsługi błędów przejściowych w tej serii.

Zadania w tle

Zadania w tle to skuteczny sposób zwiększania niezawodności systemu przez oddzielenie zadań od interfejsu użytkownika. Zaimplementuj zadanie jako zadanie w tle, jeśli nie wymaga danych wejściowych ani opinii użytkownika, a jeśli nie ma wpływu na czas odpowiedzi interfejsu użytkownika.

Typowe przykłady zadań w tle to:

  • Zadania intensywnie korzystające z procesora CPU, takie jak wykonywanie złożonych obliczeń lub analizowanie modeli strukturalnych.
  • Zadania intensywnie korzystające z operacji we/wy, takie jak uruchamianie wielu operacji magazynu lub indeksowanie dużych plików.
  • Zadania wsadowe, takie jak regularne aktualizowanie danych lub przetwarzanie zadań w określonym czasie.
  • Długotrwałe przepływy pracy, takie jak kończenie zamówienia lub aprowizowanie usług i systemów.

Aby uzyskać więcej informacji, zobacz Zalecenia dotyczące zadań w tle.

Wskazówki dotyczące samonaprawiania

Aby zaprojektować obciążenie do samodzielnego naprawiania, zaimplementuj wykrywanie błędów, aby automatyczne odpowiedzi zostały wyzwolone i bezpiecznie odzyskane przepływy krytyczne. Włącz rejestrowanie, aby zapewnić szczegółowe informacje operacyjne dotyczące charakteru niepowodzenia i powodzenia odzyskiwania. Podejścia, które należy wykonać w celu uzyskania samonaprawiania dla krytycznego przepływu, zależą od celów niezawodności zdefiniowanych dla tego przepływu oraz składników i zależności przepływu.

Wskazówki dotyczące projektowania infrastruktury

Na poziomie infrastruktury krytyczne przepływy powinny być obsługiwane przez nadmiarowy projekt architektury z włączonym automatycznym trybem failover dla składników, które je obsługują. Automatyczne przechodzenie w tryb failover można włączyć dla następujących typów usług:

  • Zasoby obliczeniowe: usługi Azure Virtual Machine Scale Sets i większość usług obliczeniowych platformy jako usługi (PaaS) można skonfigurować do automatycznego przejścia w tryb failover.

  • Bazy danych: Relacyjne bazy danych można skonfigurować do automatycznego przejścia w tryb failover przy użyciu rozwiązań, takich jak klastry trybu failover Azure SQL, zawsze włączone grupy dostępności lub wbudowane funkcje z usługami PaaS. Bazy danych NoSQL mają podobne możliwości klastrowania i wbudowane funkcje dla usług PaaS.

  • Magazyn: użyj opcji magazynu nadmiarowego z automatycznym trybem failover.

Wskazówki i wzorce dotyczące projektowania aplikacji

  • Blokuj złe aktorzy: jeśli ograniczasz klienta, nie oznacza to, że klient działał złośliwie. Może to oznaczać, że klient przekroczył limit przydziału usług. Jeśli jednak klient stale przekracza limit przydziału lub w inny sposób zachowuje się źle, możesz je zablokować. Zdefiniuj proces poza pasmem, aby klient zażądał odblokowania.

  • Wzorzec wyłącznika: jeśli awaria będzie się powtarzać po zainicjowaniu mechanizmu ponawiania prób, ryzyko wystąpienia kaskadowych awarii wynikających z rosnącej listy prac wywołań. Wyłącznik zaprojektowany do pracy z mechanizmem ponawiania ogranicza ryzyko awarii kaskadowych, uniemożliwiając aplikacji wielokrotne uruchamianie operacji, która może zakończyć się niepowodzeniem.

  • Wzorzec transakcji wyrównywujących: jeśli używasz ostatecznie spójnej operacji składającej się z serii kroków, zaimplementuj wzorzec transakcji wyrównywujących. Jeśli co najmniej jeden krok nie powiedzie się, możesz użyć tego wzorca do cofnięcia wykonanej pracy.

  • Sprawność działa bezpiecznie: czasami nie można obejść problemu, ale można zapewnić ograniczoną funkcjonalność. Rozważmy aplikację, która wyświetla katalog książek. Jeśli aplikacja nie może pobrać miniatury okładki, może wyświetlać obraz zastępczy. Niekiedy całe podsystemy nie są niezbędne do działania aplikacji. Na przykład w przypadku witryny internetowej handlu elektronicznego wyświetlanie zaleceń dotyczących produktów jest prawdopodobnie mniej krytyczne niż przetwarzanie zamówień. Ładna degradacja może również obejmować automatyczne operacje trybu failover. Gdy baza danych automatycznie przechodzi w tryb failover do repliki z powodu problemu z wystąpieniem podstawowym, wydajność jest obniżona przez krótki czas.

  • Wzorzec wyborów lidera: jeśli musisz koordynować zadanie, użyj wyborów lidera, aby wybrać koordynatora, aby jeden koordynator nie był jednym punktem niepowodzenia. Jeśli koordynator ulegnie awarii, zostanie wybrany nowy. Zamiast implementować algorytm wyboru lidera od podstaw, rozważ rozwiązanie gotowe, takie jak ZooKeeper.

  • Wzorce testów: obejmują testowanie wzorców implementowanych w ramach standardowych procedur testowania.

  • Użyj punktów kontrolnych dla długotrwałych transakcji: punkty kontrolne mogą zapewnić odporność, jeśli długotrwała operacja zakończy się niepowodzeniem. Gdy operacja zostanie uruchomiona ponownie, na przykład jeśli zostanie odebrana przez inną maszynę wirtualną, może wznowić działanie z ostatniego punktu kontrolnego. Rozważ zaimplementowanie mechanizmu, który rejestruje informacje o stanie zadania w regularnych odstępach czasu. Zapisz ten stan w trwałym magazynie, do którego można uzyskać dostęp przez dowolne wystąpienie procesu uruchamiającego zadanie. Jeśli proces zostanie zamknięty, można wznowić pracę wykonaną z ostatniego punktu kontrolnego przy użyciu innego wystąpienia. Istnieją biblioteki, które zapewniają tę funkcję, takie jak NServiceBus i MassTransit. Są one w przezroczysty sposób utrwalane, gdzie interwały są wyrównane do przetwarzania komunikatów z kolejek w Azure Service Bus.

Zautomatyzowane akcje samonaprawiania

Innym podejściem do samonaprawiania jest użycie zautomatyzowanych akcji wyzwalanych przez rozwiązanie do monitorowania po wykryciu wstępnie określonych zmian stanu kondycji. Jeśli na przykład monitorowanie wykryje, że aplikacja internetowa nie odpowiada na żądania, możesz utworzyć automatyzację za pomocą skryptu programu PowerShell w celu ponownego uruchomienia usługi app Service. W zależności od zestawu umiejętności zespołu i preferowanych technologii programistycznych użyj elementu webhook lub funkcji, aby utworzyć bardziej złożone akcje automatyzacji. Zobacz architekturę referencyjną automatyzacji chmury opartej na zdarzeniach , aby zapoznać się z przykładem używania funkcji do reagowania na ograniczanie przepustowości bazy danych. Korzystanie z automatycznych akcji może pomóc w szybkim odzyskiwaniu i zminimalizować konieczność interwencji człowieka.

Ułatwienia platformy Azure

Większość usług platformy Azure i zestawów SDK klienta zawiera mechanizm ponawiania prób. Różnią się one jednak, ponieważ każda usługa ma różne cechy i wymagania, więc każdy mechanizm ponawiania prób jest dostrojony do określonej usługi. Aby uzyskać więcej informacji, zobacz Zalecenia dotyczące obsługi błędów przejściowych.

Użyj grup akcji usługi Azure Monitor , aby otrzymywać powiadomienia, takie jak poczta e-mail, głos lub wiadomość SMS oraz wyzwalać akcje automatyczne. Gdy otrzymasz powiadomienie o niepowodzeniu, wyzwól element Runbook Azure Automation, Azure Event Hubs, funkcję platformy Azure, aplikację logiki lub element webhook w celu wykonania zautomatyzowanej akcji naprawiania.

Zagadnienia do rozważenia

Zapoznaj się z zagadnieniami dotyczącymi każdego wzorca. Przed wdrożeniem upewnij się, że wzorzec jest odpowiedni dla wymagań biznesowych i obciążeń.

Przykład

Przykładowe przypadki użycia niektórych wzorców można znaleźć w temacie Niezawodny wzorzec aplikacji internetowej dla platformy .NET. Wykonaj następujące kroki, aby wdrożyć implementację referencyjną.

Lista kontrolna dotycząca niezawodności

Zapoznaj się z pełnym zestawem zaleceń.