The Importance of Scalability In Software Design
Skalowalność jest niezbędnym elementem oprogramowania dla przedsiębiorstw. Nadanie jej priorytetu od samego początku prowadzi do niższych kosztów utrzymania, lepszych doświadczeń użytkownika i większej zwinności.
Projektowanie oprogramowania jest aktem równowagi, w którym programiści pracują nad stworzeniem najlepszego produktu w ramach ograniczeń czasowych i budżetowych klienta.
Nie da się uniknąć konieczności kompromisu. Kompromisy muszą być dokonywane w celu spełnienia wymagań projektu, czy to technicznych, czy finansowych.
Zbyt często jednak firmy przedkładają koszty nad skalowalność lub nawet całkowicie odrzucają jej znaczenie. Jest to niestety częste w inicjatywach związanych z dużymi danymi, gdzie problemy ze skalowalnością mogą zatopić obiecujący projekt.
Skalowalność nie jest „cechą dodatkową”. To jakość, która określa wartość życiową oprogramowania, a budowanie z myślą o skalowalności pozwala zaoszczędzić czas i pieniądze w dłuższej perspektywie.
Co to jest skalowalność?
System jest uważany za skalowalny, gdy nie wymaga przeprojektowania w celu utrzymania efektywnej wydajności podczas lub po gwałtownym wzroście obciążenia.
„Obciążenie pracą” może odnosić się do jednoczesnych użytkowników, pojemności pamięci masowej, maksymalnej liczby obsługiwanych transakcji lub czegokolwiek innego, co wypycha system poza jego pierwotną pojemność.
Skalowalność nie jest podstawowym wymaganiem programu, ponieważ nieskalowalne oprogramowanie może działać dobrze z ograniczoną pojemnością.
Jednakże odzwierciedla ona zdolność oprogramowania do wzrostu lub zmiany wraz z wymaganiami użytkownika.
Każde oprogramowanie, które może rozszerzyć się poza swoje podstawowe funkcje – zwłaszcza jeśli model biznesowy zależy od jego wzrostu – powinno być skonfigurowane do skalowalności.
Korzyści ze skalowalnego oprogramowania
Skalowalność ma zarówno długo-, jak i krótkoterminowe korzyści.
Na początku pozwala firmie kupić tylko to, czego natychmiast potrzebują, a nie każdą funkcję, która może być przydatna w przyszłości.
Na przykład firma rozpoczynająca program pilotażowy w zakresie inteligencji danych może wybrać masywny pakiet analityczny dla przedsiębiorstw lub może zacząć od rozwiązania, które obsługuje tylko funkcje, których potrzebuje na początku.
Popularnym wyborem jest tablica rozdzielcza, która pobiera wyniki z podstawowych źródeł danych i istniejącego oprogramowania dla przedsiębiorstw.
Gdy urosną na tyle, aby korzystać z większej liczby programów analitycznych, te strumienie danych można dodać do pulpitu nawigacyjnego zamiast zmuszać firmę do żonglowania wieloma programami wizualizacyjnymi lub budowania zupełnie nowego systemu.
Budowanie w ten sposób przygotowuje do przyszłego wzrostu, jednocześnie tworząc produkt, który odpowiada bieżącym potrzebom bez dodatkowej złożoności.
Wymaga to również niższych nakładów finansowych, co jest ważnym czynnikiem dla kadry kierowniczej zaniepokojonej wielkością inwestycji w big data.
Skalowalność pozostawia również miejsce na zmieniające się priorytety. Ten gotowy pakiet analityczny może stracić na znaczeniu, gdy firma zmienia się, aby sprostać wymaganiom rozwijającego się rynku.
Wybieranie skalowalnych rozwiązań chroni początkową inwestycję w technologię. Firmy mogą dłużej korzystać z tego samego oprogramowania, ponieważ zostało ono zaprojektowane tak, aby rosło razem z nimi.
Gdy przychodzi czas na zmiany, budowanie na solidnym, skalowalnym oprogramowaniu jest znacznie mniej kosztowne niż próby adaptacji mniej zwinnych programów.
Jest również krótszy czas „rozruchu”, aby wprowadzić nowe funkcje online, niż wdrażanie całkowicie nowego oprogramowania.
Jako korzyść uboczna, pracownicy nie będą potrzebowali wielu szkoleń lub perswazji, aby przyjąć ten zmodernizowany system. Są już zaznajomieni z interfejsem, więc praca z dodatkowymi funkcjami jest postrzegana jako bonus, a nie przykry obowiązek.
Wpadka z niepowodzeniami skalowania
Więc, co się dzieje, gdy oprogramowanie nie jest skalowalne?
Na początku, słabość jest trudna do zauważenia. We wczesnych etapach działania aplikacji obciążenie jest niewielkie. Przy stosunkowo niewielu jednoczesnych użytkownikach nie ma dużego zapotrzebowania na architekturę.
Gdy obciążenie wzrasta, pojawiają się problemy. Im więcej przechowywanych danych lub jednoczesnych użytkowników gromadzi oprogramowanie, tym większe jest obciążenie architektury oprogramowania.
Ograniczenia, które nie wydawały się ważne na początku, stają się barierą dla produktywności. Poprawki mogą złagodzić niektóre z wczesnych problemów, ale poprawki zwiększają złożoność.
Złożoność sprawia, że diagnozowanie problemów na bieżąco jest bardziej żmudne (tłumaczenie: droższe i mniej skuteczne).
Jak obciążenie pracą wzrasta poza zdolność oprogramowania do skalowania, wydajność spada.
Użytkownicy doświadczają powolnych czasów ładowania, ponieważ serwer zbyt długo odpowiada na żądania. Inne potencjalne problemy obejmują zmniejszoną dostępność lub nawet utratę danych.
Wszystko to zniechęca do przyszłego użytkowania. Pracownicy znajdą obejścia dla zawodnego oprogramowania, aby wykonać swoje własne zadania.
To naraża firmę na ryzyko naruszenia danych lub gorzej.
Gdy oprogramowanie jest skierowane do klienta, zawodność zwiększa potencjał rezygnacji.
Google odkryło, że 61% użytkowników nie da aplikacji drugiej szansy, jeśli mieli złe pierwsze doświadczenie. 40% pójdzie prosto do produktu konkurencji zamiast.
Problemy ze skalowalnością nie są tylko błędem debiutanta popełnianym przez małe firmy, albo. Nawet Disney wpadł w kłopoty z oryginalnym uruchomieniu ich Applause app, który miał dać widzom dodatkowy sposób na interakcję z ulubionych programów Disneya. Aplikacja nie mogła obsłużyć powodzi jednoczesnych użytkowników wideo streaming.
Sfrustrowani fani zostawili negatywne recenzje, aż aplikacja miała jedną gwiazdkę w sklepie Google Play. Urzędnicy Disneya musieli zdjąć aplikację, aby naprawić szkody, a negatywny rozgłos był tak intensywny, że nigdy nie wróciła do sieci.
Ustalanie priorytetów
Niektóre firmy nie ustalają priorytetów skalowalności, ponieważ nie widzą jej natychmiastowej użyteczności.
Skalowalność zostaje odsunięta na bok na rzecz szybkości, krótszych cykli rozwoju lub niższych kosztów.
Właściwie istnieją pewne przypadki, w których skalowalność nie jest wiodącym priorytetem.
Oprogramowanie, które ma być prototypem lub niskonakładowym proof of concept nie stanie się na tyle duże, aby powodować problemy.
Podobnie, wewnętrzne oprogramowanie dla małych firm z niskim stałym limitem potencjalnych użytkowników może ustawić inne priorytety.
Wreszcie, gdy zgodność z ACID jest absolutnie obowiązkowa, skalowalność schodzi na dalszy plan w stosunku do niezawodności.
Jako ogólna zasada, skalowalność jest jednak łatwiejsza i mniej zasobochłonna, gdy jest rozważana od początku.
Po pierwsze, wybór bazy danych ma ogromny wpływ na skalowalność. Migracja do nowej bazy danych jest kosztowna i czasochłonna. To nie jest coś, co można łatwo zrobić później.
Zasady skalowalności
Kilka czynników wpływa na ogólną skalowalność oprogramowania:
Użytkowanie
Użytkowanie mierzy liczbę jednoczesnych użytkowników lub możliwych połączeń. Nie powinno być żadnych sztucznych ograniczeń w użytkowaniu.
Powiększenie go powinno być tak proste, jak udostępnienie oprogramowaniu większej ilości zasobów.
Maksymalna ilość przechowywanych danych
Jest to szczególnie istotne w przypadku witryn zawierających wiele nieustrukturyzowanych danych: treści przesyłane przez użytkowników, raporty witryny i niektóre rodzaje danych marketingowych.
Projekty z zakresu nauk o danych również należą do tej kategorii. Ilość danych przechowywanych przez tego rodzaju treści może wzrosnąć dramatycznie i niespodziewanie.
To, czy maksymalnie przechowywane dane mogą się szybko skalować, zależy w dużej mierze od stylu bazy danych (serwery SQL vs NoSQL), ale krytyczne jest również zwrócenie uwagi na odpowiednie indeksowanie.
Kod
Niedoświadczeni programiści mają tendencję do pomijania kwestii związanych z kodem podczas planowania skalowalności.
Kod powinien być napisany tak, aby można go było dodawać lub modyfikować bez refaktoryzacji starego kodu. Dobrzy programiści dążą do uniknięcia powielania wysiłków, zmniejszając ogólny rozmiar i złożoność bazy kodowej.
Aplikacje rosną w rozmiarze, gdy ewoluują, ale utrzymywanie kodu w czystości zminimalizuje ten efekt i zapobiegnie powstawaniu „kodu spaghetti”.
Scaling Out Vs Scaling Up
Scaling up (lub „skalowanie pionowe”) polega na wzroście poprzez użycie bardziej zaawansowanego lub mocniejszego sprzętu. Przestrzeń dyskowa lub szybsza jednostka centralna (CPU) jest używana do obsługi zwiększonego obciążenia.
Skalowanie w górę oferuje lepszą wydajność niż skalowanie na zewnątrz. Wszystko jest zawarte w jednym miejscu, pozwalając na szybsze zwroty i mniej podatności.
Problem ze skalowaniem w górę jest to, że nie ma tylko tyle miejsca, aby rosnąć. Sprzęt staje się droższy, gdy staje się bardziej zaawansowany. W pewnym momencie firmy napotykają na prawo malejących zwrotów z zakupu zaawansowanych systemów.
Wymaga to również czasu na wdrożenie nowego sprzętu.
Z powodu tych ograniczeń skalowanie pionowe nie jest najlepszym rozwiązaniem dla oprogramowania, które musi rosnąć szybko i z niewielkim wyprzedzeniem.
Skalowanie w górę (lub „skalowanie poziome”) jest znacznie szerzej stosowane do celów korporacyjnych.
Przy skalowaniu na zewnątrz, oprogramowanie rośnie poprzez użycie większej ilości – nie bardziej zaawansowanego – sprzętu i rozłożenie zwiększonego obciążenia na nową infrastrukturę.
Koszty są niższe, ponieważ dodatkowe serwery lub procesory mogą być tego samego typu, który jest obecnie używany (lub dowolnego kompatybilnego rodzaju).
Skalowanie odbywa się również szybciej, ponieważ nic nie musi być importowane lub przebudowywane.
Jednakże istnieje niewielki kompromis w szybkości. Skalowane poziomo oprogramowanie jest ograniczone przez szybkość, z jaką serwery mogą się komunikować.
Różnica nie jest na tyle duża, aby została zauważona przez większość użytkowników, a istnieją narzędzia, które pomagają programistom zminimalizować ten efekt. W rezultacie, skalowanie na zewnątrz jest uważane za lepsze rozwiązanie podczas budowania skalowalnych aplikacji.
Guidelines for Building Highly Scalable Systems
Rozważenie skalowalności w fazie planowania jest zarówno tańsze, jak i łatwiejsze. Oto kilka najlepszych praktyk dotyczących włączania skalowalności od samego początku:
Używaj oprogramowania do równoważenia obciążenia
Oprogramowanie do równoważenia obciążenia jest krytyczne dla systemów z rozproszoną infrastrukturą (jak aplikacje skalowane poziomo).
To oprogramowanie używa algorytmu do rozłożenia obciążenia na serwery, aby zapewnić, że żaden pojedynczy serwer nie zostanie przeciążony. Jest to absolutna konieczność, aby uniknąć problemów z wydajnością.
Lokalizacja ma znaczenie
Skalowalne oprogramowanie robi jak najwięcej w pobliżu klienta (w warstwie aplikacji). Zmniejszenie liczby razy, kiedy aplikacje muszą nawigować po większym ruchu w pobliżu zasobów rdzeniowych prowadzi do szybszych prędkości i mniejszego obciążenia serwerów.
Edge computing jest czymś innym do rozważenia. Przy większej liczbie aplikacji wymagających zasobochłonnych aplikacji, utrzymywanie jak największej ilości pracy na urządzeniu zmniejsza wpływ obszarów o niskim sygnale i opóźnień sieciowych.
Cache gdzie to możliwe
Bądź świadomy obaw o bezpieczeństwo, ale buforowanie jest dobrym sposobem na uniknięcie konieczności wykonywania tego samego zadania w kółko.
Prowadź z API
Użytkownicy łączą się za pomocą różnych klientów, więc prowadzenie z API, które nie zakładają określonego typu klienta, może służyć im wszystkim.
Przetwarzanie asynchroniczne
Odnosi się do procesów, które są podzielone na dyskretne kroki, które nie muszą czekać na zakończenie poprzedniego przed przetworzeniem.
Na przykład, użytkownikowi może zostać pokazane powiadomienie „wysłane!”, podczas gdy wiadomość e-mail jest nadal technicznie przetwarzana.
Przetwarzanie asynchroniczne usuwa niektóre z wąskich gardeł, które wpływają na wydajność oprogramowania na dużą skalę.
Ograniczyć współbieżny dostęp do ograniczonych zasobów
Nie powielaj wysiłków. Jeśli więcej niż jedno żądanie prosi o to samo obliczenie z tego samego zasobu, pozwól pierwszemu skończyć i po prostu użyj tego wyniku. To dodaje prędkości, jednocześnie zmniejszając obciążenie systemu.
Używaj skalowalnej bazy danych
Bazy danych NoSQL mają tendencję do bycia bardziej skalowalnymi niż SQL. SQL skaluje operacje odczytu wystarczająco dobrze, ale jeśli chodzi o operacje zapisu, koliduje z ograniczeniami mającymi na celu egzekwowanie zasad ACID.
Skalowanie baz NoSQL wymaga mniej rygorystycznego przestrzegania tych zasad, więc jeśli zgodność z ACID nie jest problemem, baza danych NoSQL może być właściwym wyborem.
Rozważ rozwiązania PaaS
Platforma jako usługa uwalnia od wielu problemów związanych ze skalowalnością, ponieważ dostawca PaaS zarządza skalowaniem. Skalowanie może być tak proste, jak podniesienie poziomu subskrypcji.
Spójrz na FaaS
Function-as-a-service wyewoluowało z PaaS i jest bardzo blisko związane. Serverless computing zapewnia sposób na wykorzystanie tylko tych funkcji, które są potrzebne w danym momencie, zmniejszając niepotrzebne wymagania wobec infrastruktury back-end.
FaaS wciąż dojrzewa, ale może być warte rozważenia jako sposób na obniżenie kosztów operacyjnych przy jednoczesnej poprawie skalowalności.
Nie zapomnij o konserwacji
Ustaw oprogramowanie pod kątem zautomatyzowanych testów i konserwacji, aby w przypadku jego rozwoju praca związana z jego utrzymaniem nie wymknęła się spod kontroli.
Build with An Eye to the Future
Priorytetowe traktowanie skalowalności przygotowuje Twoją firmę na sukces. Rozważ to wcześnie, a będziesz czerpać korzyści ze zwinności, gdy jest ona najbardziej potrzebna.
Czy szukasz oprogramowania, które może rosnąć wraz z Twoją firmą? Umów się na bezpłatne spotkanie z jednym z naszych programistów, aby porozmawiać o tym, gdzie musisz iść i jak możemy Cię tam zaprowadzić!