Co sprawia, że aplikacja jest skalowalna?

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 ze skalowalnością na myśli? Aby kod był skalowalny od samego początku, a nie po namyśle. Czy istnieją pewne metodologie projektowania? A może jest to po prostu kwestia doboru odpowiednich algorytmów do pracy?

Odpowiedź

Istnieją dwa kierunki skalowalności:

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

W przypadku pierwszego z nich musisz tylko uważać, aby nie mieć żadnych arbitralnych ograniczeń. Są to albo ze względu na zbyt małe rozmiary liczb całkowitych, albo struktury o stałej / ograniczonej długości. Struktury te mogą być powiązane z podstawowym systemem operacyjnym. Na przykład, jeśli spróbujesz skalować w górę przy użyciu większej liczby wątków lub procesów, w pewnym momencie „osiągniesz ograniczenia systemu operacyjnego”. Dlatego obecnie serwery zbudowane pod kątem wysokiej skalowalności wykonują współbieżność w oparciu o zdarzenia asynchroniczne. Ten problem jest opisany w słynnym C10K dokument .

Drugi jest trudniejszy. Wymaga programowania z uwzględnieniem dwóch rzeczy: dane będą przetwarzane równolegle, a dane mogą być fizycznie rozproszone. 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 znane rozwiązanie dla danych w tym paradygmacie są rozwiązaniami NoSQL . Obejmują one zarówno bardzo proste magazyny klucz-wartość, jak i systemy podobne do RDBMS, tylko pozbawione możliwości łączenia. div id = „73fab16cf2”>

sklepy klucz-wartość są niezwykle skalowalne, ale to jest cena. Zasadniczo zapytania można wykonywać tylko na podstawie klucza podstawowego. Jest jednak rozwiązanie że jest to „s redukcja mapy . Może się to wydawać bardzo nieoptymalne, jeśli spojrzysz na kumulatywną złożoność, ale musisz pamiętać, że działa ona równolegle.

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

Komentarze

  • +1 za wzmiankę o skalowaniu w poziomie. Dodawanie większej ilości zasobów jest bardzo szybkie i atrakcyjne dla decydentów (kup kilka rdzeni hex i podwoj pamięć! ). Ale jeśli aplikacja nie może ' wywierać na nią presji, masz większy problem.

Odpowiedź

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

Miara wydajności w miarę wzrostu obciążenia.

Pierwszą rzeczą, którą musisz zrozumieć podczas projektowania pod kątem skalowalności, jest to, który pomiar jest najważniejszy dla Twojej aplikacji? Istnieje kilka sposobów mierzenia wydajności , która jest kluczowym elementem skalowalności:

  • Jednoczesne żądania na sekundę
  • Średni czas odpowiedzi na żądanie
  • Liczba rekordów przetwarzanych na sekundę / minutę

Istnieje więcej pomiarów wydajności, których można użyć, ale są one typowe dla systemów internetowych lub systemów przetwarzania wsadowego.

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

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

Celem skalowalnej aplikacji jest aby utrzymać lub poprawić wydajność, gdy zajmujemy się problemem obciążenia. Krótko mówiąc, jeśli czas odpowiedzi trwa zbyt długo, czy możemy dodać kolejny serwer, aby równomiernie rozłożyć obciążenie? Takie podejście zmniejsza ilość pracy wykonywanej przez jeden serwer i sprawia, że serwery działają w tym „idealnym miejscu” pod względem wydajności.

Twoja aplikacja będzie musiała być zaprojektowana specjalnie pod kątem skalowania. Oznacza to, że trzeba uważać na dane sesji, kierować żądania do właściwego serwera, zmniejszając wąskie gardła, które ograniczają możliwość skalowania aplikacji.

Odpowiedź

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

Po prostu przyglądasz się schematowi bazy danych, algorytmom i procesowi tworzenia oprogramowania i próbujesz przewidzieć przyszłe problemy. Chcesz także skonfigurować monitorowanie wydajności, aby zidentyfikować problemy, gdy zaczną się narastać.

Korzystałem z tych wskazówek, czytając Tworzenie skalowalnych witryn internetowych (link do amazon).

Mam nadzieję, że to pomoże!

Odpowiedź

Jedyny sposób, w jaki aplikacje może być naprawdę skalowalne, poprzez brak ograniczeń, których nie można przekazać (lub tylko bardzo drogie).

Typowym przykładem jest to, co się dzieje, gdy skończą się dostępne cykle procesora? Jeśli Twój program jest wielościeżkowy, możesz uruchomić go na pudełku z wieloma rdzeniami, ale co się stanie, gdy nie możesz już kupić większego pudełka? Twoja aplikacja po prostu nie może już się rozwijać i dlatego nie jest skalowalna.

Każda prawdziwie skalowalna aplikacja musi być w stanie rozłożyć się na wielu komputerach w przejrzysty sposób i robić to bez zauważalnych nierówności. Nie jest to łatwe i jest to jeden z powodów, dla których firma Google odniosła taki sukces.

Odpowiedź

Występują wyjątkowe problemy z obsługą aplikacji o dużej skali. Oferta pracy szuka kandydatów, którzy pracowali w takim środowisku i musieli rozwiązać takie problemy.

Aplikacje wysokiego poziomu stają się skalowalne poprzez ciągłe zadawanie pytania, co by się stało, gdyby ten fragment kodu został uruchomiony tysiące razy w bardzo krótkim okresie. Oznacza to zarządzanie śladami pamięci , korzystając z buforowania sum i danych, używając źródeł danych, które same się skalują, itp.

Odpowiedź

Gdybyś budowanie funkcji wyszukiwania, która działa dobrze, gdy ma 100 wierszy w bazie danych do wyszukiwania i 10 użytkowników korzystających z niej jednocześnie. Jak dobrze by działała, gdyby korzystało z niej 100 użytkowników w tym samym czasie i jest 100 000 wierszy do wyszukania.

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

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

Możesz zasymulować 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *