Projektuj pod kątem skalowania w poziomie

Projekt aplikacji powinien umożliwiać jej skalowanie w poziomie

Główną zaletą chmury jest elastyczne skalowanie — możliwość używania jak najwięcej pojemności, skalowania w górę w miarę wzrostu obciążenia i skalowania w przypadku, gdy dodatkowa pojemność nie jest potrzebna. Zaprojektuj aplikację, aby mogła skalować ją w poziomie, dodawać lub usuwać wystąpienia, dopasowując podaż do zapotrzebowania.

Skalowalność jest mierzona według współczynnika przyrostu przepływności do zwiększenia zasobów. W idealnym przypadku w dobrze zaprojektowanym systemie obie liczby są proporcjonalne: dwukrotna alokacja zasobów podwoi przepływność. Skalowalność jest zwykle ograniczona przez wprowadzenie wąskich gardeł lub punktów synchronizacji w systemie.

Zalecenia

Unikaj lepkości wystąpień. Lepkość, nazywana też koligacją sesji, występuje wtedy, gdy żądania danego klienta są zawsze kierowane do tego samego serwera. Stickiness ogranicza możliwość skalowania aplikacji w poziomie. Na przykład ruch z użytkownika o dużej ilości nie będzie dystrybuowany między wystąpieniami. Przyczyny lepkości obejmują przechowywanie stanu sesji w pamięci i używanie kluczy szyfrowania charakterystycznych dla danego komputera. Zadbaj o to, aby każde wystąpienie mogło obsłużyć dowolne żądanie.

Zidentyfikuj wąskie gardła. Skalowanie w poziomie nie umożliwia rozwiązania wszystkich problemów z wydajnością. Na przykład jeśli wąskim gardłem jest baza danych zaplecza, nie pomoże dodawanie kolejnych serwerów internetowych. Najpierw zidentyfikuj i usuń przeszkody związane z wąskimi gardłami w systemie, a następnie spróbuj rozwiązać problem, dodając kolejne wystąpienia. Stanowe części systemu są najbardziej prawdopodobną przyczyną wąskich gardeł.

Rozłóż obciążenia według wymagań w zakresie skalowalności. Aplikacje często składają się z wielu obciążeń o różnych wymaganiach dotyczących skalowania. Na przykład aplikacja może mieć witrynę publiczną i oddzielną witrynę administracyjną. W witrynie publicznej mogą występować nagłe wzrosty ruchu. Z kolei obciążenie witryny administracyjnej jest mniejsze i bardziej przewidywalne.

Projektowanie autonomicznych i odłączonych składników komunikujących się za pośrednictwem protokołów komunikacji asynchronicznej. W idealnym przypadku składniki powinny mieć własny, niezależny stan i używać zdarzeń do przekazywania wszelkich zmian lub działań do składników zewnętrznych. Pomaga to niezależnie skalować tylko przeciążony składnik. Zaimplementuj mechanizmy sterowania przepływem, aby zarządzać ruchem i bezpiecznie obniżać jego wydajność. Konsumenci powinni kontrolować własną stawkę zużycia. Producenci powinni kontrolować własną szybkość transmisji, w tym wstrzymanie. Kolejki komunikatów są dobrymi opcjami, aby pochłaniać dodatkowe obciążenie i umożliwić konsumentom opróżnianie pracy w czasie wolnym.

Unikaj niepotrzebnej komunikacji, koordynacji i oczekiwania.

Odciążaj naturalnie zadania asynchroniczne. Zadania takie jak wysyłanie wiadomości e-mail, akcje, w których użytkownik nie potrzebuje natychmiastowej odpowiedzi, a integracja z innymi systemami to dobre miejsca do korzystania z asynchronicznych wzorców obsługi komunikatów.

Przenieś zadania intensywnie korzystające z zasobów. W miarę możliwości zadania wymagające dużej ilości zasobów procesora CPU lub zasobów we/wy powinny być wykonywane w tle, aby zminimalizować obciążenie frontonu, który obsługuje żądania użytkowników.

Autoskalowanie oparte na metrykach użycia na żywo i korzystanie z wbudowanych funkcji skalowania automatycznego. Wiele usług obliczeniowych platformy Azure ma wbudowaną obsługę skalowania automatycznego. Jeśli obciążenie aplikacji jest przewidywalne i regularne, warto ustawić harmonogram skalowania w poziomie. Można na przykład skalować w godzinach pracy. Z kolei jeśli obciążenie nie jest przewidywalne, skalowanie automatyczne można wyzwalać za pomocą metryk wydajności, takich jak procesor CPU lub długość kolejki żądań. Obserwuj aplikacje i ich komunikację, aby zidentyfikować wąskie gardła i uzyskać dokładniejsze decyzje. Aby zapoznać się z najlepszymi rozwiązaniami skalowania automatycznego, zobacz Skalowanie automatyczne.

Rozważ użycie agresywnego skalowania automatycznego dla obciążeń o znaczeniu krytycznym. W przypadku obciążeń o znaczeniu krytycznym warto przygotować się na wzrost zapotrzebowania. Lepiej jest szybko dodać nowe wystąpienia, obsługujące dodatkowy ruch związany z dużym obciążeniem, a później stopniowo zmniejszać skalę.

Podczas projektowania uwzględnij skalowanie w pionie. Pamiętaj o tym, że skalowanie ma być elastyczne. Czasami aplikacja będzie wymagać skalowania w pionie, gdy wystąpienia będą usuwane. Aplikacja musi bezpiecznie obsługiwać usuwanie wystąpień. Oto wybrane metody zapewniania takiej obsługi:

  • Nasłuchuj zdarzeń zamknięcia (jeśli są dostępne) i prawidłowo zamykaj wystąpienia.
  • Klienci/użytkownicy usługi powinni obsługiwać błędy przejściowe i ponawianie prób.
  • W przypadku długotrwałych zadań weź pod uwagę przerwanie pracy przy użyciu punktów kontrolnych lub wzorca Potoki i filtry.
  • Umieść elementy robocze w kolejce, aby inne wystąpienie mogło wznowić pracę, jeśli dane wystąpienie zostanie usunięte w trakcie przetwarzania danych.

Rozważ skalowanie pod kątem nadmiarowości. Skalowanie w górę może zwiększyć niezawodność aplikacji. Rozważmy na przykład skalowanie w górę w wielu strefach dostępności, na przykład przy użyciu usług strefowo nadmiarowych. Takie podejście może poprawić przepływność aplikacji, a także zapewnić odporność, jeśli jedna strefa ulegnie awarii.

Modelowanie i optymalizowanie skalowalności systemu. Możesz użyć modelu systemu przy użyciu podejścia takiego jak prawo Amdahla. Kwantyfikuj skalowalność na podstawie parametrów, takich jak rywalizacja i współistnienie. Rywalizacja odnosi się do opóźnienia z powodu oczekiwania lub kolejkowania zasobów udostępnionych. Spójność odnosi się do opóźnienia, aby dane stały się spójne. Na przykład posiadanie wysokiej rywalizacji oznacza przetwarzanie sekwencyjne, które może być równoległe, podczas gdy wysoka współherencja sugeruje nadmierne zależności między procesami, co monituje o zminimalizowanie interakcji. Podczas projektowania obciążenia można obliczyć maksymalną efektywną pojemność systemu, aby uniknąć zwiększenia podaży niż zapotrzebowania, co prowadzi do strat.