Co sprawia, że ​​aplikacja jest skalowalna?

37

W ofertach pracy ciągle widzę, że kandydat musi mieć doświadczenie w pisaniu „skalowalnych” aplikacji. Co sprawia, że ​​aplikacja jest skalowalna i skąd mam wiedzieć, że mój kod można skalować do milionów użytkowników?


Wydaje mi się, że lepszym sposobem sformułowania tego pytania jest: Jak napisać kod z myślą o skalowalności? Aby kod był skalowalny od samego początku, a nie po namyśle. Czy istnieją pewne metodologie projektowania? A może chodzi tylko o wybranie odpowiednich algorytmów dla zadania?

Jnevelson
źródło

Odpowiedzi:

24

Istnieją dwa kierunki skalowalności:

  • pionowo (inaczej skalowanie w górę): szybszy procesor, więcej pamięci RAM, więcej miejsca na dysku;
  • pozioma (inaczej skalowanie): więcej rdzeni procesora, więcej procesorów, więcej serwerów;

Po pierwsze, musisz zadbać o to, aby nie mieć żadnych arbitralnych ograniczeń. Są to albo z powodu zbyt małych liczb całkowitych, albo struktur o stałej / ograniczonej długości. Struktury te mogą być powiązane z podstawowym systemem operacyjnym. Na przykład, jeśli spróbujesz zwiększyć skalę za pomocą większej liczby wątków lub procesów, w pewnym momencie osiągniesz ograniczenia systemu operacyjnego. Dlatego obecnie serwery budowane pod kątem wysokiej skalowalności wykonują współbieżność w oparciu o zdarzenia asynchroniczne. Ten problem opisano w słynnym dokumencie C10K .

Drugi jest trudniejszy. Wymaga programowania z dwiema rzeczami: dane będą przetwarzane równolegle, a dane mogą być fizycznie dystrybuowane. Komunikacja między węzłami powinna być ograniczona. W praktyce zwykle oznacza to poświęcenie niektórych części ACID (udowodniono, że nie można mieć pełnego ACID i możliwości skalowania w tym samym czasie). Najbardziej znanym rozwiązaniem do przechowywania danych w tym paradygmacie są rozwiązania NoSQL . Obejmują one od bardzo prostych magazynów klucz-wartość po systemy podobne do RDBMS, pozbawione jedynie możliwości wykonywania połączeń. W sklepach klucz-wartość są bardzo skalowalne, ale że przychodzi jako cenę. Możesz w zasadzie zapytać tylko o klucz podstawowy. Istnieje jednak rozwiązanie tego problemu - zmniejszenie mapy. To może wydawać się bardzo nieoptymalne, jeśli spojrzysz na punkt widzenia skumulowanej złożoności, ale musisz pamiętać, że działa on masowo równolegle.

Jeśli chcesz przeczytać więcej o skalowalności na przykładach z życia, zajrzyj na blog HighScalability.com .

vartec
źródło
+1 za wzmiankę o zmniejszeniu skali. Dodanie większej ilości zasobów jest bardzo szybkie i atrakcyjne dla decydentów (kup trochę rdzeni sześciokątnych i podwój pamięć!). Ale jeśli aplikacja nie może wywrzeć na nich presji, masz większy problem.
jqa
14

Skalowalność mierzy się w kategoriach przepustowości w oparciu o pewną zmienną. Na przykład liczba żądań na sekundę dla użytkowników X. Najprostszym sposobem opisania skalowalności jest:

Miara wydajności wraz ze wzrostem obciążenia.

Pierwszą rzeczą, którą musisz zrozumieć, projektując skalowalność, jest to, jaki pomiar jest najważniejszy dla Twojej aplikacji? Istnieje kilka sposobów pomiaru wydajności, która jest kluczowym elementem skalowalności:

  • Współbieżne żądania na sekundę
  • Średni czas odpowiedzi na zapytanie
  • Liczba przetworzonych rekordów na sekundę / minutę

Istnieje więcej pomiarów wydajności, które można zastosować, ale są one powszechne w systemach sieciowych lub systemach przetwarzania wsadowego.

Kolejnym aspektem skalowalności jest pomiar tego, co dzieje się z wydajnością w miarę wzrostu obciążenia. Typowe sposoby zwiększania obciążenia to:

  • Więcej użytkowników trafiających na serwer (tj. Większy ruch w sieci)
  • Więcej danych w bazie danych (tzn. Zapytania trwają dłużej lub przetwarzanie trwa dłużej)
  • Awaria dysku twardego w macierzy RAID (wpływ na wydajność / niezawodność pamięci masowej)
  • Nasycenie sieci

Celem skalowalnej aplikacji jest utrzymanie lub poprawa wydajności, gdy mamy do czynienia z problemem obciążenia. Krótko mówiąc, jeśli czas reakcji trwa zbyt długo, czy możemy dodać kolejny serwer, aby równomiernie rozłożyć obciążenie? Takie podejście zmniejsza nakład pracy jednego serwera i utrzymuje serwery w tym „najlepszym miejscu” pod względem wydajności.

Twoja aplikacja będzie musiała zostać zaprojektowana specjalnie do skalowania. Oznacza to, że musisz uważać na dane sesji, kierując żądania do właściwego serwera, zmniejszając wąskie gardła ograniczające możliwości skalowania aplikacji.

Berin Loritsch
źródło
5

Zasadniczo chcesz uniknąć wąskich gardeł wydajności, gdy zwiększasz liczbę użytkowników i / lub przetwarzasz większy zestaw danych i / lub oferujesz swój interfejs w większej liczbie języków itp.

Zasadniczo patrzysz na schemat bazy danych, algorytmy i proces tworzenia oprogramowania i próbujesz przewidzieć przyszłe problemy. Chcesz również skonfigurować monitorowanie wydajności, aby identyfikować problemy, gdy zaczną się gromadzić.

Podniosłem te wskazówki, czytając Budowanie skalowalnych stron internetowych (link do Amazon).

Mam nadzieję że to pomoże!

louisgab
źródło
3

Jedynym sposobem, w jaki aplikacje mogą być naprawdę skalowalne, jest brak ograniczeń, których nie można przejść (lub tylko bardzo drogo).

Typowym przykładem jest to, co dzieje się, gdy zabraknie dostępnych cykli procesora? Jeśli twój program ma wiele stopni, możesz uruchomić na pudełku z wieloma rdzeniami, ale co się stanie, gdy nie będziesz już mógł kupić większego pudełka? Twoja aplikacja po prostu nie może już rosnąć i dlatego nie jest skalowalna.

Każda prawdziwie skalowalna aplikacja musi być w stanie przenosić się na wiele komputerów w przejrzysty sposób i robić to bez zauważalnych nierówności. To nie jest łatwe i jest to jeden z powodów, dla których Google odnosi tak wielkie sukcesy.


źródło
1

Istnieją wyjątkowe problemy związane z obsługą aplikacji o dużej skali. Oferty pracy szukają kandydatów, którzy pracowali w tym środowisku i musieli rozwiązać takie problemy.

Aplikacje wysokiego poziomu są skalowalne poprzez ciągłe zadawanie pytania, co by się stało, gdyby żądano, aby ten fragment kodu został uruchomiony tysiące razy w bardzo krótkim czasie. Oznacza to zarządzanie śladami pamięci, korzystanie z buforowania sum i danych, korzystanie ze skalowalnych źródeł danych itp.

jzd
źródło
1

Jeśli budujesz funkcję wyszukiwania, która działa dobrze, gdy ma 100 wierszy w bazie danych do wyszukiwania i 10 użytkowników korzysta z niej jednocześnie. Jak dobrze by to działało, gdy 100 użytkowników korzystało z niego w tym samym czasie i istnieje 100 000 wierszy do wyszukiwania.

Jeśli działa tak samo bez względu na to, co jest bardzo dobre. jeśli działa proporcjonalnie do ilości użytkowników / danych (co oznacza 10 razy więcej danych == 10 razy dłużej do przetworzenia), to dobrze. Jeśli działa znacznie niżej, tym więcej danych ma (dane w trybie 10x == 10x ^ 10 dłużej do przetworzenia), wówczas nie skaluje się dobrze.

Moje przykłady powinny być naprawdę pokazane w notacji Big O, ale obecnie nie znam go wystarczająco dobrze, aby napisać przykłady w Big O.

Możesz symulować więcej danych, zrzucając fikcyjne dane do swojej bazy danych, a istnieją narzędzia do symulacji większej liczby użytkowników, takie jak Apache AB.

JD Isaacks
źródło