Що робить додаток масштабованим?


37

Я продовжую бачити на посадах, що заявник повинен мати досвід написання "масштабованих" заявок. Що робить додаток масштабованим і як я можу знати, що мій код може масштабувати мільйони користувачів?


Я вважаю, що кращим способом формулювання цього питання є: Як я можу написати свій код з можливістю масштабування? Так що код можна масштабувати з початку роботи, на відміну від задуму. Чи існують певні методології проектування? Або просто питання підбору правильних алгоритмів для роботи?

Відповіді:


24

Є два напрямки масштабування:

  • вертикаль (також масштабування): швидший процесор, більше оперативної пам’яті, більше місця на диску;
  • горизонтальний (він же масштабує): більше ядер в процесорі, більше процесорів, більше серверів;

Для першого ви просто повинні подбати про те, щоб у вас не було ніяких довільних обмежень. Вони або через занадто малі цілі розміри або з фіксованою / обмеженою довжиною структури. Ці структури можуть бути пов'язані з базовою ОС. Наприклад, якщо ви намагаєтеся масштабувати, використовуючи більше потоків або процесів, у якийсь момент ви збираєтесь досягти меж ОС. Ось чому в даний час сервери, побудовані для високої масштабованості, роблять паралельність на основі асинхронних подій. Ця проблема описана у відомому документі C10K .

Другий складніше. Він вимагає програмування з урахуванням двох речей: дані будуть оброблятися паралельно, а дані можуть бути фізично розподілені. Зв'язок між вузлами повинен бути обмежений. На практиці це, як правило, означає жертвувати деякими частинами кислоти (доведено, що ви не можете мати повноцінну кислоту та здатність до одночасного масштабування). Найбільш відомим рішенням для зберігання даних у цій парадигмі є рішення NoSQL . Вони варіюються від дуже простих сховищ ключових значень, до систем, схожих на RDBMS, лише позбавлених можливостей робити з'єднання. В ключ-значення зберігає ультра-масштабується, але це приходить як ціна. В основному ви можете робити запит лише на первинному ключі. Однак для цього є рішення, це зменшення карти. Це може здатися дуже неоптимальним, якщо дивитись на точку зору кумулятивної складності, але ви повинні мати на увазі, що вона працює паралельно.

Якщо ви хочете прочитати більше про масштабність на прикладах із реального життя, перегляньте блог HighScalability.com .


+1 для згадування шкали. Додавання більшої кількості ресурсів дуже швидко і привабливо для осіб, які приймають рішення (купіть кілька шестигранних сердечників та подвійну пам’ять!). Але якщо програма не може тиснути на них, у вас є більша проблема.
jqa

14

Масштабованість вимірюється через пропускну здатність на основі деякої змінної. Наприклад, кількість запитів на секунду у користувачів X. Найпростіший спосіб описати масштабованість:

Міра ефективності в міру збільшення навантаження.

Перше, що вам потрібно зрозуміти при розробці масштабованості - це те, що вимірювання є найбільш важливим для вашої програми? Існує кілька способів вимірювання ефективності, що є ключовим компонентом масштабованості:

  • Одночасні запити в секунду
  • Середній час відповіді на запит
  • Кількість оброблених записів за секунду / хвилину

Існує більше вимірювань ефективності, які можна використовувати, але вони є загальними для веб-систем або систем пакетної обробки.

Наступний аспект масштабованості - це вимірювання того, що відбувається з вашою ефективністю при збільшенні навантаження. Загальні способи збільшення навантаження:

  • Більше користувачів потрапляє на сервер (тобто більше веб-трафіку)
  • Більше даних у базі даних (тобто запити займають більше часу або обробка займає більше часу)
  • Збій жорсткого диска в RAID (це впливає на ефективність / надійність зберігання)
  • Насиченість мережі

Метою масштабованого додатка є або підтримувати, або підвищувати ефективність, коли ми маємо справу з проблемою навантаження. Якщо коротко, якщо час відповіді забирає занадто багато часу, чи можемо ми додати ще один сервер для рівномірного розподілу навантаження? Такий підхід зменшує обсяг роботи одного сервера і зберігає сервери, які працюють у цій "солодкій точці" для підвищення ефективності.

Ваша програма повинна бути розроблена спеціально для масштабу. Це означає, що вам потрібно бути обережними з даними сеансу, маршрутизацією запитів на потрібний сервер, зменшення вузьких місць, які обмежують можливість програми масштабувати масштаб.


5

Ви, як правило, хочете уникнути вузьких місць, коли збільшуєте кількість користувачів та / або обробляєте більший набір даних та / або пропонуєте свій інтерфейс більшою кількістю мов тощо.

Ви в основному переглядаєте схему вашої бази даних, алгоритми та процес розробки програмного забезпечення та намагаєтесь передбачити майбутні проблеми. Ви також хочете налаштувати моніторинг продуктивності, щоб виявити проблеми, коли вони починають збиратись.

Я підбирав ці поради, коли читав " Створення масштабованих веб-сайтів" (посилання на Amazon).

Сподіваюся, це допомагає!


3

Єдиний спосіб, що програми можуть бути справді масштабованими, - це не маючи обмежень, які неможливо прийняти (або лише дуже дорого).

Типовим прикладом є те, що відбувається, коли у вас закінчуються доступні cpu-цикли? Якщо у вашій програмі багатогранна, ви можете працювати на коробці з декількома ядрами, але що станеться, коли більше коробки більше не можна купити? Ваша програма просто не може більше зростати, а значить, не масштабується.

Будь-яка справді масштабована програма повинна бути спроможна прозоро розповсюджуватися на декілька комп’ютерів і робити це без помітних ударів. Це непросто, і це одна з причин, чому Google настільки успішний.


1

Існують унікальні проблеми, які виникають із підтримкою великих масштабованих програм. Повідомлення про роботу шукає кандидатів, які працювали в цьому середовищі і яким довелося вирішувати такі проблеми.

З додатків високого рівня їх можна масштабувати, постійно задаючи питання, що буде, якби цей фрагмент коду було запропоновано запускати тисячі разів за дуже малий період. Це означає керувати слідами пам’яті, використовувати кешування підсумків та даних, використовуючи джерела даних, які самі масштабуються тощо.


1

Якщо ви будували функцію пошуку, яка була ефективною, коли в БД є 100 рядків для пошуку та 10 користувачів, які використовують її одночасно. Наскільки добре він би працював, коли 100 користувачів одночасно користувались ним і є 100 К рядків для пошуку.

Якщо він виконує те саме, незважаючи ні на що, тоді це дуже добре. це, якщо виконує пропорційну кількість користувачів / даних (тобто на 10 разів більше даних == 10 разів довше обробляти), це добре. Якщо він працює набагато нижче, чим більше даних (у режимі 10x = = 10x ^ 10 довше обробляти), то він не масштабує масштаб.

Мої приклади дійсно повинні бути показані в нотації Big O, але наразі я не знаю цього досить добре, щоб написати приклади в Big O.

Ви можете імітувати більше даних, завантажуючи фіктивні дані у вашу БД, і є інструменти для імітації більшої кількості користувачів, таких як Apache AB.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.