Wzorzec konsolidacji zasobów obliczeniowych

Azure App Service
Azure Kubernetes Service (AKS)

Skonsoliduj wiele zadań lub operacji w pojedynczą jednostkę obliczeniową. Może to zwiększyć wykorzystanie zasobów obliczeniowych oraz zmniejszyć nakład pracy i koszty zarządzania związane z wykonywaniem obliczeń w aplikacjach hostowanych w chmurze.

Kontekst i problem

Aplikacja w chmurze często implementuje wiele operacji. W niektórych rozwiązaniach warto najpierw postępować zgodnie z zasadą projektowania separacji problemów i podzielić te operacje na oddzielne jednostki obliczeniowe, które są hostowane i wdrażane indywidualnie (na przykład jako oddzielne aplikacje internetowe usługi App Service lub oddzielne maszyny wirtualne). Jednak mimo że ta strategia może uprościć projekt logiczny rozwiązania, wdrażanie wielu jednostek obliczeniowych w ramach tej samej aplikacji może zwiększyć koszty hostingu środowiska uruchomieniowego i skomplikować zarządzanie systemem.

Przykładowa ilustracja przedstawia uproszczoną strukturę rozwiązania hostowanego w chmurze, które jest implementowane z użyciem więcej niż jednej jednostki obliczeniowej. Każda jednostka obliczeniowa działa we własnym środowisku wirtualnym. Poszczególne funkcje zaimplementowano jako osobne zadania (oznaczone jako zadania od A do E) działające we własnych jednostkach obliczeniowych.

Uruchamianie zadań w środowisku chmury przy użyciu zestawu dedykowanych jednostek obliczeniowych

Każda jednostka obliczeniowa używa płatnych zasobów, nawet gdy jest bezczynna lub używana w niewielkim stopniu. Dlatego nie zawsze jest to najbardziej ekonomiczne rozwiązanie.

Na platformie Azure dotyczy to usług App Services, Container Apps i Virtual Machines. Te elementy są uruchamiane we własnym środowisku. Uruchamianie kolekcji oddzielnych witryn internetowych, mikrousług lub maszyn wirtualnych przeznaczonych do wykonywania zestawu dobrze zdefiniowanych operacji, ale konieczność komunikowania się i współpracy w ramach jednego rozwiązania może być nieefektywnym wykorzystaniem zasobów.

Rozwiązanie

Aby zmniejszyć koszty, zwiększyć wykorzystanie, poprawić szybkość komunikacji i ograniczyć zarządzanie, można skonsolidować wiele zadań lub operacji w pojedynczą jednostkę obliczeniową.

Zadania można grupować według kryteriów opartych na funkcjach oferowanych przez środowisko i kosztach związanych z tymi funkcjami. Typowym podejściem jest ustalenie zadań mających podobny profil pod względem skalowalności, okresu istnienia i wymagań dotyczących przetwarzania. Po ich zgrupowaniu można je skalować jako jednostkę. Dzięki elastyczności wielu środowisk chmury można uruchamiać i zatrzymywać dodatkowe wystąpienia jednostki obliczeniowej, zależnie od obciążenia. Na przykład platforma Azure udostępnia skalowanie automatyczne, które można zastosować do usług App Services i zestawów skalowania maszyn wirtualnych. Aby uzyskać więcej informacji, zobacz Autoscaling Guidance (Wskazówki dotyczące skalowania automatycznego).

Jako kontrprzykład przedstawiający, jak na podstawie skalowalności można określić, które operacje nie powinny być grupowane, rozważ poniższe dwa zadania:

  • Zadanie 1 sonduje rzadkie, niewrażliwe na opóźnienia czasowe komunikaty wysyłane do kolejki.
  • Zadanie 2 obsługuje duże wzrosty ruchu sieciowego.

Drugie zadanie wymaga elastyczności, co może obejmować uruchamianie i zatrzymywanie wielu wystąpień jednostki obliczeniowej. Zastosowanie takiej samej skalowalności do pierwszego zadania zwiększy tylko liczbę zadań nasłuchujących rzadkich komunikatów w tej samej kolejce, co prowadzi do marnowania zasobów.

W wielu środowiskach chmury można określać zasoby dostępne dla jednostki obliczeniowej pod względem liczby rdzeni procesora CPU, pamięci, miejsca na dysku itp. Ogólnie rzecz biorąc, im więcej zostanie określonych zasobów, tym wyższy koszt. Aby zapewnić oszczędności, ważne jest maksymalizowanie pracy wykonywanej przez drogą jednostkę obliczeniową i zapobieganie jej nieaktywności w dłuższych okresach.

Jeśli istnieją zadania wymagające dużej wydajności procesora CPU w krótkich okresach, rozważ skonsolidowanie ich w pojedynczą jednostkę obliczeniową, która zapewni niezbędną wydajność. Jednak ważna jest równowaga — należy zapewnić stałe wykorzystanie drogich zasobów, ale w przypadku ich przeciążenia może wystąpić rywalizacja. Na przykład długotrwałe zadania wymagające intensywnych obliczeń nie powinny korzystać z tej samej jednostki obliczeniowej.

Problemy i kwestie do rozważenia

Implementując ten wzorzec, rozważ następujące kwestie:

Skalowalność i elastyczność. Wiele rozwiązań w chmurze implementuje skalowalność i elastyczność na poziomie jednostki obliczeniowej przez uruchamianie i zatrzymywanie wystąpień jednostek. Unikaj grupowania zadań mających sprzeczne wymagania w zakresie skalowalności w tej samej jednostce obliczeniowej.

Okres istnienia. Infrastruktura w chmurze okresowo odtwarza środowisko wirtualne, które hostuje jednostkę obliczeniową. Jeśli jednostka obliczeniowa zawiera wiele długotrwałych zadań, może być konieczne skonfigurowanie jej tak, aby zapobiec odtwarzaniu do czasu zakończenia tych zadań. Inna możliwość to zaprojektowanie zadań przy użyciu punktów kontrolnych, co umożliwi ich prawidłowe zatrzymywanie i kontynuowanie od punktu, w którym zostały przerwane przy ponownym uruchomieniu jednostki obliczeniowej.

Cykl wersji. Jeśli implementacja lub konfiguracja zadania zmienia się często, może być konieczne zatrzymywanie jednostki obliczeniowej hostującej aktualizowany kod, ponowne konfigurowanie i wdrażanie jednostki oraz ponowne uruchamianie jej. Ten proces wymaga też zatrzymywania, ponownego wdrażania i ponownego uruchamiania wszystkich innych zadań w tej samej jednostce obliczeniowej.

Zabezpieczenia. Zadania w tej samej jednostce obliczeniowej mogą współużytkować ten sam kontekst zabezpieczeń i mieć dostęp do tych samych zasobów. Wymagany jest wysoki stopień zaufania między zadaniami oraz pewność, że jedno zadanie nie uszkodzi innego zadania i nie będzie mieć niekorzystnego wpływu. Ponadto zwiększenie liczby zadań uruchomionych w jednostce obliczeniowej zwiększa jej podatność na ataki. Każde zadanie jest bezpieczne tylko w takim stopniu jak zadanie z największą liczbą luk w zabezpieczeniach.

Odporność na uszkodzenia. Jeśli jedno zadanie w jednostce obliczeniowej ulegnie awarii lub będzie działać nieprawidłowo, może to wpłynąć na inne zadania uruchomione w tej samej jednostce. Jeśli na przykład nie powiedzie się poprawne uruchomienie jednego zadania, może to spowodować błąd całej logiki uruchamiania jednostki obliczeniowej oraz uniemożliwić uruchomienie innych zadań w tej samej jednostce.

Rywalizacja. Unikaj wprowadzania rywalizacji między zadaniami, które konkurują o zasoby w tej samej jednostce obliczeniowej. W idealnym przypadku zadania współużytkujące tę samą jednostkę obliczeniową powinny mieć inne charakterystyki korzystania z zasobów. Na przykład dwa zadania wymagające intensywnych obliczeń prawdopodobnie nie powinny znajdować się w tej samej jednostce obliczeniowej, podobnie jak dwa zadania używające dużej ilości pamięci. Jednak mieszanie zadania intensywnie korzystającego z obliczeń z zadaniem, które wymaga dużej ilości pamięci, jest kombinacją wykonalną.

Uwaga

Rozważ skonsolidowanie zasobów obliczeniowych tylko dla systemu, który był w środowisku produkcyjnym przez pewien czas, aby operatorzy i deweloperzy mogli monitorować system i tworzyć mapę cieplną, która identyfikuje sposób, w jaki każde zadanie korzysta z różnych zasobów. Taka mapa pozwala określić, które zadania dobrze nadają się do współużytkowania zasobów obliczeniowych.

Złożoność. Łączenie wielu zadań w pojedynczą jednostkę obliczeniową zwiększa komplikację kodu w jednostce, co może utrudnić testowanie, debugowanie i konserwację.

Stabilna architektura logiczna. Zaprojektuj i zaimplementuj kod poszczególnych zadań w taki sposób, aby nie wymagał zmian, nawet w przypadku zmiany środowiska fizycznego, w którym działa zadanie.

Inne strategie. Konsolidacja zasobów obliczeniowych to tylko jedna z metod zmniejszania kosztów związanych ze współbieżnym uruchamianiem wielu zadań. Takie podejście wymaga starannego planowania i monitorowania, aby zapewnić jego stałą efektywność. Bardziej odpowiednie mogą być inne strategie, zależnie od tego, jaki jest charakter operacji i gdzie znajdują się użytkownicy, dla których są uruchamiane te zadania. Na przykład rozkład funkcjonalności obciążenia (według opisu w temacie Compute Partitioning Guidance — Wskazówki dotyczące partycjonowania obliczeń) może być lepszą opcją.

Kiedy używać tego wzorca

Używaj tego wzorca dla zadań, które nie są ekonomiczne w przypadku uruchamiania we własnych jednostkach obliczeniowych. Jeśli zadanie spędza większość czasu bezczynnie, uruchamianie go w dedykowanej jednostce może być kosztowne.

Ten wzorzec może być nieodpowiedni dla zadań wykonujących krytyczne operacje odporne na uszkodzenia oraz dla zadań przetwarzających wysoce poufne lub prywatne dane i wymagających własnego kontekstu zabezpieczeń. Takie zadania powinny być uruchamiane we własnym izolowanym środowisku, w osobnej jednostce obliczeniowej.

Projekt obciążenia

Architekt powinien ocenić, w jaki sposób wzorzec konsolidacji zasobów obliczeniowych może być używany w projekcie obciążenia, aby sprostać celom i zasadom opisanym w filarach platformy Azure Well-Architected Framework. Na przykład:

Filar Jak ten wzorzec obsługuje cele filaru
Optymalizacja kosztów koncentruje się na utrzymaniu i poprawie zwrotu obciążenia z inwestycji. Ten wzorzec maksymalizuje wykorzystanie zasobów obliczeniowych, unikając nieużywanej aprowizowanej pojemności za pośrednictwem agregacji składników, a nawet całych obciążeń w infrastrukturze w puli.

- CO:14 Konsolidacja
Doskonałość operacyjna pomaga zapewnić jakość obciążeń dzięki ustandaryzowanym procesom i spójności zespołu. Konsolidacja może prowadzić do bardziej jednorodnej platformy obliczeniowej, która może uprościć zarządzanie i zauważalność, zmniejszyć różne podejścia do zadań operacyjnych i zmniejszyć wymaganą ilość narzędzi.

- System monitorowania OE:07
- Projekt automatyzacji OE:10
Wydajność pomaga wydajnie sprostać zapotrzebowaniu dzięki optymalizacjom skalowania, danych, kodu. Konsolidacja maksymalizuje wykorzystanie zasobów obliczeniowych przy użyciu pojemności węzła zapasowego i zmniejsza potrzebę nadmiernej aprowizacji. Duże (skalowane w pionie) wystąpienia obliczeniowe są często używane w puli zasobów dla tych infrastruktury.

- PE:02 Planowanie pojemności
- PE:03 Wybieranie usług

Podobnie jak w przypadku każdej decyzji projektowej, należy rozważyć wszelkie kompromisy w stosunku do celów innych filarów, które mogą zostać wprowadzone przy użyciu tego wzorca.

Opcje platformy aplikacji

Ten wzorzec można osiągnąć na różne sposoby, w zależności od używanej usługi obliczeniowej. Zobacz następujące przykładowe usługi:

  • aplikacja systemu Azure Service i Azure Functions: wdrażanie udostępnionych planów usługi App Service reprezentujących infrastrukturę serwera hostingu. Co najmniej jedną aplikację można skonfigurować do uruchamiania na tych samych zasobach obliczeniowych (lub w tym samym planie usługi App Service).
  • Azure Container Apps: wdróż aplikacje kontenerów w tych samych środowiskach udostępnionych, zwłaszcza w sytuacjach, gdy konieczne jest zarządzanie powiązanymi usługami lub wdrożenie różnych aplikacji w tej samej sieci wirtualnej.
  • Azure Kubernetes Service (AKS): usługa AKS to oparta na kontenerach infrastruktura hostingu, w której można skonfigurować wiele aplikacji lub składników aplikacji do uruchamiania współlokowanych na tych samych zasobach obliczeniowych (węzłach), pogrupowanych według wymagań obliczeniowych, takich jak zapotrzebowanie na procesor CPU lub pamięć (pule węzłów).
  • Maszyny wirtualne: wdróż jeden zestaw maszyn wirtualnych dla wszystkich dzierżaw do użycia, dzięki czemu koszty zarządzania są współużytkowane przez dzierżawców. Zestawy skalowania maszyn wirtualnych to funkcja, która obsługuje współużytkowane zarządzanie zasobami, równoważenie obciążenia i skalowanie w poziomie maszyn wirtualnych.

Podczas implementowania tego wzorca mogą być istotne następujące wzorce i wskazówki: