/ 18.11.2024
Każdy CTO (Chief Technology Officer) jest świadomy tego, że oprogramowanie powinno być napisane w sposób łatwy do skalowania. Zadbanie o ten aspekt w procesie rozwoju oprogramowania pozwala na wykorzystanie w pełni dostępnych zasobów oraz wysoką wydajność. Jak w takim razie szacować koszty skalowania tak by nie tylko osiągnęło swój cel, ale również nie pochłonęło budżetu organizacji?
Ponieważ budżety IT są ograniczone, a firmy stają przed presją cięcia kosztów , utrzymanie i zarządzanie skalowanymi aplikacjami staje się prawdziwym wyzwaniem. Według danych Pluralsight koszty administracji systemów, monitorowania, tworzenia kopi zapasowych i aktualizacji mogą stanowić nawet 20-30% całkowitego budżetu IT.
Czy to oznacza, że trzeba od razu wdrażać drogie strategie skalowania? Wcale nie, wielu doświadczonych liderów przekonało się, że oszczędne skalowanie aplikacji jest kluczem do sukcesu.
Spis treści
Czym jest skalowanie aplikacji?
Strategia skalowania odnosi się do zdolności aplikacji do obsługi rosnącego obciążenia, użytkowników, danych lub innych zasobów bez znaczącego spadku wydajności lub niezawodności W świecie aplikacji warunki te zależą od ilości danych lub liczby operacji, które muszą zostać przetworzone w danym momencie. Chodzi o przygotowanie w taki sposób infrastruktury, na której uruchamiamy aplikację, aby mogła obsłużyć całe to obciążenie.
Dlatego od początku budowy aplikacji trzeba ją tak zaprojektować by mogła obsługiwać większą liczbę użytkowników przy zachowaniu stałej wydajności. Na dłuższą metę pozwoli to zaoszczędzić pieniądze, zmniejszając potrzebę większych zmian i aktualizacji.
Konieczne jest korzystanie ze skalowalnych technologii i infrastruktury, takich jak rozwiązania oparte na chmurze lub architektura mikrousług, tak, aby nasza aplikacja w miarę upływu czasu się rozwijała.
Przejdźmy zatem do 5 czynników mających wpływ na skuteczne skalowanie systemu.
1. Poznaj potrzeby swojego systemu
Pierwszym krokiem do oszacowania i kontrolowania kosztów skalowania aplikacji w chmurze jest zrozumienie potrzeb w zakresie skalowania.
Tutaj również warto zadawać sobie pytania:
- Jakie są cele projektu – typ, rozmiar i złożoność aplikacji np. Jaki czas reakcji jest akceptowalny? Ile jestem skłonny wydać, aby skrócić czas reakcji o połowę? Czy aplikacja jest zaprojektowana w taki sposób, że jest to w ogóle możliwe?
- Czy wszystkie części mojego systemu oraz wszystkie funkcje muszą być tak samo wydajne, czy może tylko część funkcjonalności wymaga większej wydajności. Jeśli tyko część wymaga większej wydajności to warto je wyznaczyć już na tym poziomie. Pozwoli to zaoszczędzić koszty w fazie implementacji.
- Czy znam swoje czynniki generujące największe koszty? Nie tylko serwery, ale również dane i wzorce użytkowania.
- Czy mamy zdefiniowane metryki skalowania, takie jak wykorzystanie procesora CPU, użycie pamięci, czas odpowiedzi lub przepustowość.
Ten pierwszy etap analizy jest niezwykle istotny. Wiele CTO’s podkreśla że można wydać zbyt duże zasoby na badania i rozwój MVP poprzez „wstępne skalowanie” lecz nie osiągniecie celu.
Dzieje się tak, gdy inwestujemy w skalowanie funkcji, których nie potrzebujemy lub też zbyt wcześnie, zanim nie uzyskamy rzeczywistego dochodu.
Z drugiej strony, trzeba przewidywać wzrost natężenia ruchu bo brak planu może skutkować odejściem niezadowolonych użytkowników aplikacji.
2. Znajdź “wąskie gardła” aplikacji
Zanim zbudujemy strategie skalowania potrzebujemy zidentyfikować punkty, które mogą ograniczać wydajność aplikacji. Istnieją trzy podstawowe wąskie gardła dla każdej strony internetowej:
- Brak wystarczającej mocy procesora, aby obsłużyć liczbę użytkowników,
- Brak wystarczającej ilości pamięci, aby wykonać operacje z potrzebnymi do tego danymi
- Brak wystarczającej ilości wejścia / wyjścia – aby móc przesyłać dane do nich wystarczająco szybko.
Jeśli zwiększysz jeden z tych trzech elementów, w pewnym momencie napotkasz sytuację, w której nie masz wystarczającej ilości jednego z pozostałych, aby obsłużyć większe natężenie ruchu. Aby pokonać te wyzwania można zastosować skalowanie pionowe lub poziome.
Skalowanie poziome vs skalowanie pionowe
Skalowanie pionowe znane również jako skalowanie w górę lub w dół, oznacza zwiększenie możliwości istniejącego serwera poprzez dodanie większej mocy. Jest to szybkie rozwiązanie, ale ma swoje ograniczenia.
Podobnie jak w przypadku komputerów stacjonarnych, dodanie lepszego procesora, większej ilości pamięci lub dysku SSD przyspiesza ich działanie, zwiększenie procesora, pamięci i operacji generalnie zwiększy liczbę użytkowników, których możesz obsłużyć.
Ale w pewnym momencie powstaje problem, polegający na tym, że stworzenie większego serwera jest coraz trudniejsze i bardziej kosztowne. Zatrudnianie ludzi próbujących znaleźć i naprawić problemy z wydajnością w kodzie jest generalnie bardzo czasochłonnym zajęciem i jest to czas, którego nie poświęcają na dodawanie nowych funkcji lub innych rzeczy, które mogłyby przyciągnąć nowych użytkowników.
Dlatego też w większości przypadków stosuje się skalowanie poziome, które sprowadza się to do dodania większej liczby serwerów . To podejście jest bardziej elastyczne i opłacalne, ale wymaga starannej architektury do zarządzania złożonością.
Najczęściej usługi automatyzujące skalowanie, wykorzystują skalowanie poziome. Usługi chmurowe, takie jak Heroku, AWS Auto Scaling itp. dynamicznie dodają nowe serwery w miarę zwiększania ruchu, a następnie proporcjonalnie je zmniejszają.
Wybór między skalowaniem poziomym i pionowym zależy od złożoności aplikacji: skalowanie pionowe pasuje do prostszych, mniej zintegrowanych aplikacji, podczas gdy skalowanie poziome jest lepsze dla złożonych aplikacji z wieloma mikrousługami lub połączonymi systemami.
3. Wybierz odpowiednią strategię skalowania
Skalowanie aplikacji powinno być wystarczająco elastyczne, aby automatycznie skalować w górę i w dół w zależności od obciążenia, co zapewni wysoką dostępność aplikacji i jednocześnie obniży koszty.
Teraz omówimy kilka technik skalowania, które warto wziąć pod uwagę przy optymalizacji aplikacji.
1. Równoważenie obciążenia
Równoważenie obciążenia rozkłada ruch przychodzący na wiele serwerów, aby zapewnić, że żaden pojedynczy serwer nie jest przeciążony. Zwiększa to wykorzystanie zasobów, maksymalizuje przepustowość i minimalizuje czas odpowiedzi. Popularne strategie obejmują:
- Round Robin: Sekwencyjna dystrybucja żądań do każdego serwera.
- Least Connections: Kierowanie żądań do serwera z najmniejszą liczbą połączeń.
- IP Hash: Kierowanie żądań z tego samego adresu IP do tego samego serwera, zapewniając trwałość sesji.
2. Sharding bazy danych
Sharding bazy danych polega na dystrybucji pojedynczego zbioru danych na wiele baz danych (shardów). Rozdziela to żądania odczytu między kilka baz danych, zmniejszając obciążenie każdej z nich poprzez dystrybucję operacji odczytu i zapisu.
3. Wprowadzenie cache
Buforowanie przechowuje kopie często używanych danych w szybkiej pamięci masowej w celu ich szybkiego wyszukiwania. Rodzaje buforowania obejmują
- Redukcję zbędnych operacji na danych.
- Buforowanie całych stron HTML, aby uniknąć powtarzającego się renderowania.
4. Architektura mikrousług
Mikrousługi dzielą aplikacje na niezależne komponenty, z których każdy koncentruje się na określonej funkcji. Jeżeli mówimy o takim przykładzie mikro serwisów, to skalowalność polega na uruchomieniu kilku instancji tego samego oprogramowania i rozkładanie ruchu pomiędzy nimi. Z racji dużego ruchu muszą być bardzo niezawodne, ale też cały czas dostępne i responywne żeby nie wpływać negatywnie na performance.
Przykładowymi mikroserwisami, które znajdują się w wielu popularnych aplikacjach to:
- wyszukiwarki
- mikroserwisy do generowania dokumentów.
- mikroserwisy do autoryzacji i autentykacji
Do korzyści ze stosowania mikrousług należy m.in większa wydajność systemu, łatwiejsze zarządzanie architekturą oprogramowania, skalowanie na poziomie danej usługi, a nie całego systemu a także zmniejszenie ryzyka błędów w innych modułach. To wszystko przekłada się na niższe koszty rozwoju.
5 Przetwarzanie asynchroniczne
Przetwarzanie asynchroniczne pozwala na obsługę zadań niezależnie od głównego wątku aplikacji. Zwalnia to zasoby dla zadań czasu rzeczywistego poprzez odciążenie ciężkich operacji, takich jak przesyłanie obrazów, do procesów działających w tle.
6. Autoskalowanie
Autoskalowanie dynamicznie dostosowuje zasoby w oparciu o potrzeby w czasie rzeczywistym. Usługi dostępne w ramach platform chmurowych AWS i Google Cloud. takie jak AWS Auto Scaling lub Google Cloud’s Compute Engine oferują rozwiązania do automatycznego skalowania zasobów w górę lub w dół, zapewniając optymalną wydajność co może przyczynić się do optymalizacji kosztów za usługi uruchamiane w chmurze..
7. Obliczenia w pamięci typu open source
Rozwiązania open source do obliczeń w pamięci, takie jak Apache Ignite, zapewniają opłacalny sposób na szybkie skalowanie systemu przy jednoczesnym skróceniu opóźnień.
Wynika to z faktu, że Apache Ignite łączy dostępne procesory i pamięć RAM w klaster, dystrybuując dane i obliczenia do poszczególnych węzłów. Znacznie zwiększa to wydajność poprzez przechowywanie danych w pamięci RAM i wykorzystanie masowego przetwarzania równoległego.
8. Content Display Network (CDN)
Sieci CDN dystrybuują treści na wielu rozproszonych geograficznie serwerach, skracając czas ładowania i poprawiając wrażenia użytkowników na całym świecie. wykorzystuje dużą liczbę serwerów rozmieszczonych na całym świecie w celu dostarczania treści użytkownikom witryny.
Serwery takie jak np. Cloudflare czy Akamai te przechowują w pamięci podręcznej kopię informacji o witrynie, a użytkownicy uzyskujący do niej dostęp będą korzystać z serwera CDN, a nie z naszego serwera, dzięki czemu będzie można obsłużyć dowolny poziom ruchu.
4. Korzystaj z narzędzi do automatyzacji i monitorowania
Narzędzia do automatyzacji pomagają wdrożyć strategię skalowania, automatycznie dostosowując zasoby przydzielone do aplikacji w oparciu o wstępnie zdefiniowane metryki i progi.
Popularne narzędzia, stosujemy między innymi do:
- Monitorowania wydajności: New Relic lub Grafana zapewniają wgląd w czasie rzeczywistym w kwestie związane z wydajnością.
- Kolejkowania wiadomości: RabbitMQ, pomaga zarządzać wąskimi gardłami przetwarzania danych w czasie rzeczywistym.
- Testowania obciążenia: Apache JMeter lub LoadRunner symulują duży ruch w celu ujawnienia słabych punktów.
- Profilowania kodu: JProfiler dla Java lub Py-Spy dla Python analizują wykonanie kodu w celu sprawdzenia nieefektywności.
Ciągłe monitorowanie i analiza zapewniają wgląd w wydajność i zachowanie użytkowników. Narzędzia takie jak Splunk lub Grafana Stack pomagają zrozumieć i przewidzieć wzorce ruchu, umożliwiając podejmowanie istotnych decyzji dotyczących skalowania.
5. Wdrażaj techniki optymalizacji kosztów
Techniki optymalizacji kosztów pomagają zmniejszyć lub uniknąć niepotrzebnych lub nadmiernych kosztów związanych ze skalowaniem aplikacji w chmurze. Można na przykład:
- wybrać odpowiedniego dostawcę usług w chmurze i model cenowy dla swojej aplikacji, wykorzystać natywne dla chmury usługi i funkcje, które oferują skalowalność, wydajność i bezpieczeństwo przy niższych kosztach,
- zastosować zasady projektowania i najlepsze praktyki, które zwiększają wydajność, modułowość i łatwość konserwacji aplikacji,
- przyjąć kulturę i metodologię DevOps, która umożliwia ciągłą integrację, dostarczanie i przekazywanie informacji zwrotnych,
- regularnie przeglądać i audytować rachunki w chmurze i raporty dotyczące użytkowania w celu podejmowania działań naprawczych.
6. Testowanie i ocena rozwiązań skalowania
Testowanie i ocena rozwiązań skalowania może również pomóc w pomiarze wpływu decyzji dotyczących skalowania na wydajność, dostępność i koszt aplikacji. Należy przeprowadzać różnego rodzaju testy, takie jak np. testy obciążenia, testy warunków skrajnych, testy odporności lub testy chaosu, aby symulować różne scenariusze i warunki wpływające na skalowanie aplikacji.
Należy również gromadzić i analizować wyniki i informacje zwrotne z testów oraz wykorzystywać je do ulepszania rozwiązań skalowania.
Skaluj z myślą o przyszłości
Mamy nadzieję, że powyższe wskazówki pomogą Ci zarządzać rozwojem aplikacji, niezależnie od tego, czy obecnie radzisz sobie z gwałtownym wzrostem popytu, czy planujesz takie wzrosty w przyszłości.
Warto pamiętać, że skalowalność to proces mający kluczowe znaczenie z perspektywy biznesowej. Pracując nad zaspokojeniem potrzeb związanych z rozwojem aplikacji ważne jest, aby już teraz zastanowić się, jak utrzymać wzrost w dłuższej perspektywie. Jeśli potrzebujesz pomocy w architekturze rozwiązań, skonsultuj się z naszymi inżynierami. Chętnie pomożemy Ci w zaplanowaniu i zrealizowaniu strategii skalowania aplikacji.