Який найкращий спосіб розробити веб-сайт, щоб він був масштабованим?


35

Для веб-сайтів, які мають бути масштабованими, наприклад, таких соціальних мереж, як facebook, який найкращий спосіб створити веб-сайт?

  1. Чи повинен я мати веб-сервіс, який сайт запитує, щоб отримати необхідні йому дані?

    або

  2. Чи повинен сайт запитувати бази даних безпосередньо? (можна зробити за допомогою вбудованих мовних конструкцій для автоматичного заповнення таблиць тощо).

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


Існує також питання, яку архітектуру використовувати (як MVC тощо).
Іван

Не знаючи більше про те, що саме ви збираєтеся запустити, дати відповідь дуже складно, але пам’ятайте про «хмарні сервіси», ймовірно, ваша програма вписується у якусь програму SaaS. (Він централізований).
deepcell

Взагалі кажучи, я б сказав, нічого особливого не маю на увазі ..
Даніель,

1
Побудуйте його у «хмарі» та витрачайте багато часу на читання HighScalability.com.
Еван Плейс

Відповіді:


37

Нічого собі, це просте запитання, на яке величезний масив можливих відповідей. Більш чітка частина вашого запитання запитує, чи більш масштабованим є взаємодія з вашою базою даних безпосередньо або через веб-сервіс. Ця відповідь проста: запитайте безпосередньо в базу даних. Перехід через веб-сервіс додає цілу купу затримок, які абсолютно непотрібні для коду, що працює за брандмауером (за великим рахунком). Наприклад, для веб-сервісу потрібен якийсь компонент, щоб отримати запит, десеріалізувати його, запитувати БД, серіалізувати відповідь та повернути його. Тож якщо ваш код працює за брандмауером, збережіть собі проблеми і просто запитайте БД безпосередньо.

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

Я рекомендую вам ознайомитися з роботою та інструментами, побудованими Бредом Фітцпатріком (засновником LiveJournal і зараз в Google). Коли я працював з ним у Six Apart, ось деякі речі, які я дізнався від нього, та про архітектуру LiveJournal, яка зробила його таким масштабним.

  1. Використовуйте вузькі таблиці баз даних на відміну від широких . Захоплююче в цьому було вивчення того, що мотивувало цю архітектуру, яка створювала систему легко і швидкооновлено. Якщо ви використовуєте широкі таблиці або таблиці, для яких кожне поле або властивість є стовпцем таблиці, коли настає час оновити схему бази даних, наприклад, додати новий стовпець, тоді системі потрібно буде заблокувати таблицю, поки схема зміна реалізована. При роботі в масштабі це означатиме, що проста зміна схеми бази даних може призвести до великого відключення бази даних. Який смокче очевидно. З іншого боку, вузька таблиця просто зберігає кожну окрему властивість, пов'язану з об'єктом, як один рядок у базі даних. Тому, коли ви хочете додати до бази даних новий стовпець, все, що вам потрібно зробити, це записи INSERT в таблицю, що є незаблокувальною операцією. Гаразд, це невелике тло, давайте подивимося, як ця модель насправді перекладається в такій робочій системі, як LiveJournal.

    Скажімо, ви хочете завантажити останні 10 записів журналу в блозі людини, і скажімо, що кожен запис журналу має десять властивостей. У класичному широкому макеті таблиці кожна властивість співвідноситься зі стовпцем таблиці. Потім користувач запитує таблицю один раз, щоб отримати всі необхідні їм дані. Запит повертає 10 рядків, і кожен рядок матиме всі необхідні їм дані (наприклад, ВИБІР * ВІД записів ЗАМОВЛЕННЯ ДЛЯ ГРОМИ 10). У вузькому макеті таблиці все дещо інакше. У цьому прикладі насправді є дві таблиці: перша таблиця (таблиця A) зберігає прості критерії, за якими хотіли б шукати, наприклад, ідентифікатор запису, ідентифікатор автора, дата введення тощо. Друга таблиця (таблиця B), тоді зберігаються всі властивості, пов'язані із записом. У цій другій таблиці є три стовпці: entry_id, ключ та значення. Для кожного рядка таблиці A буде 10 рядків у таблиці B (по одному рядку для кожної властивості). Тому для отримання та відображення останніх десяти записів вам знадобиться 11 запитів. Перший запит дає вам список ідентифікаторів запису, а потім наступні десять запитів отримають властивості, пов'язані з кожною з записів, повернутих у першому запиті.

    "Святий молі!" ви кажете, "як на Землі це може бути масштабнішим ?!" Це абсолютно контр-інтуїтивно зрозуміло? У першому сценарії у нас був лише один запит до бази даних, але в другому «більш масштабованому» рішенні у нас є 11 запитів до бази даних. В цьому немає сенсу. Відповідь на це питання повністю покладається на наступну групу.

  2. Використовуйте memcache вільно. Якщо ви не були в курсі, memcache - це розподілена кешова система, керована мережею, з низьким рівнем затримки. Його використовують у Facebook, Google, Yahoo та майже на кожному популярному та масштабованому веб-сайті планети. Він був винайдений Бредом Фітцпатріком частково, щоб допомогти компенсувати накладні витрати, притаманні дизайну баз даних вузької таблиці. Давайте подивимось на той самий приклад, про який говорилося в №1 вище, але цього разу введемо пам’ять.

    Почнемо, коли користувач вперше відвідує сторінку, і нічого немає в кеші. Ви починаєте з таблиці запитів A, яка повертає ідентифікатори 10 записів, які ви хочете відобразити на сторінці. Після цього для кожного з цих запитів ви запитуєте базу даних для отримання властивостей, пов'язаних із цим записом, а потім, використовуючи ці властивості, становлять об'єкт, з яким ваш код може взаємодіяти (наприклад, об'єкт). Потім ви зберігаєте цей об’єкт (або серіалізовану форму цього об’єкта) у мемошах.

    Другий раз, коли хтось завантажує ту саму сторінку, ви починаєте так само: за допомогою запиту таблиці A для списку вхідних ідентифікаторів, які ви будете відображати. Для кожного запису ви спершу переходите до пам’ятної пам’яті та говорите: „Чи є у вас кеш-запис #X?“ Якщо так, то memcache повертає вам об'єкт введення. Якщо ні, то вам потрібно ще раз запитувати базу даних, щоб отримати її властивості, скласти об'єкт і зберегти його в мемках. Більшість випадків, коли вдруге хтось відвідує ту саму сторінку, є лише один запит до бази даних, а всі інші дані потім витягуються прямо з пам'яті.

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

    Ця конструкція зробила вирішення проблеми, пов’язаної зі складанням списку публікацій, пов’язаних з усіма вашими друзями, в потік або "стіну" набагато, набагато простіше.

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

  4. Нарешті, вам потрібні приголомшливі індекси. Швидкість ваших запитів багато в чому буде залежати від того, наскільки добре проіндексовані таблиці вашої бази даних. Я не витрачу надто багато часу на обговорення того, що таке індекс, крім того, щоб сказати, що це дуже схоже на систему гігантських каталогів карт, щоб зробити голки в стозі сіна більш ефективним. Якщо ви використовуєте mysql, то рекомендую увімкнути журнал повільних запитів для моніторингу запитів, які потребують тривалого часу. Коли на вашому радарі з'являється запит (наприклад, тому, що він повільний), то з’ясуйте, який індекс потрібно додати до таблиці, щоб прискорити його.

"Дякую за весь цей чудовий фон, але святий суровий, це дуже багато коду, який мені доведеться написати".

Не обов'язково. Написано багато бібліотек, які роблять взаємодію з пам’яттю справді просто. Ще інші бібліотеки кодифікували весь описаний вище процес; Дані :: ObjectDriver в Perl - саме така бібліотека. Що стосується інших мов, то вам потрібно буде зробити власне дослідження.

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


3
+1 Я дуже люблю цього Вау, це просте запитання, на яке існує величезний масив можливих відповідей.
Pankaj Upadhyay

1
Я повністю не згоден з "запитом безпосередньо в базу даних". Ви згадуєте розділення бази даних для продуктивності, коли було б простіше реалізувати одноразову архітектуру з декількома рабами з інтерфейсом API. Перевага від’єднання БД від програми полягає в тому, що рівень API може поширювати запити, як вам завгодно. API - це абстракція, яка дозволяє змінити базову реалізацію та / або повторно використовувати дані, не порушуючи додаток.
Еван Плейс

1
(продовження) Серіалізація завжди додаватиме накладні витрати, але лише в шарі API, який, швидше за все, буде складатися з декількох екземплярів, що працюють одночасно. Якщо ви переживаєте за швидкість передачі через провід, перетворіть на JSON, і він, швидше за все, буде стиснутий gzip. Найпростіші підвищення продуктивності можна досягти, коли робота відсувається від сервера до клієнта. Важливе питання, яке ви хочете задати, чи бажаєте ви поширювати запити в додатку або на рівні сервера? Що простіше дублювати?
Еван Плейс

1
@EvanPlaice - чудові моменти щодо повторної використання та зміни логіки реалізації служби при користуванні послугами. Крім того, кеш-інфраструктура може також використовуватися службами замість прямих дзвінків до бази даних.
Ашиш Гупта

1
@AshishGupta Саме так, єдиною різницею в розподілі даних на окрему службу є те, що отримує користувач. Замість цього збирайте вміст html + на сервері. Користувач отримує дані та html окремо, а клієнтський браузер обробляє повторну збірку. Якщо дані є окремим сервісом, можна також зробити їх доступними для мобільних додатків або інших клієнтів, які не базуються на веб-сторінках (колишні програми для смарт-телевізорів).
Еван Плейс

13

Для веб-сайтів, які потребують великого масштабування, таких як соціальні мережі, такі як facebook, який найкращий спосіб створити веб-сайт?

Виміряйте.

Я думаю, що ...

Погана політика.

Потрібно фактичне вимірювання.


Кількісні показники FTW.
bhagyas

1
Гаразд ... так що після вимірювання?
Pacerier

9

Scalablility - це не функція конкретних стратегій впровадження, а швидше розробка архітектури додатків, щоб рівень доступу до даних міг розвиватися без масового рефакторингу та переписування.

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

Вам не обов'язково потрібен мережевий канал між логікою бізнесу програми та логікою доступу до даних; непряме виклик методу одним методом на логічну операцію було б чудово почати.

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

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

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


4

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

Поки ви не зіткнетеся з проблемою, ви не можете придумати рішення .

Повірте мені, як тільки у вас буде прокат сайту та перед ним постане вимога масштабування, ви обов'язково знатимете, як це зробити. :-)


Гарна цитата !!!!!!!!!!
AmirHossein

2

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

Конкретна кількість шарів та відповідна архітектура для вашої програми, однак, не повинні відповідати цій чи будь-якій іншій моделі.

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

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


2

Будь-який додатковий крок у підключенні до бази даних - це лише накладні витрати. Наприклад, між UI -> Business Facade -> Business -> Data Access -> Databaseі UI -> Database, другий підхід швидше. Однак чим більше кроків ви видаляєте, тим менш вашою стає система, і з'являється більше дублювання. Уявіть, що ви написали необхідний код для отримання списку друзів у профілі, домашній сторінці, на сторінці управління знайомими тощо.

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

Але не обмежуйтеся темою підключення до бази даних, коли ви думаєте про створення високомасштабних веб-сайтів. Розглянемо також ці елементи:

  1. Вибір правильної платформи (PHP швидше через його сценарій), але ASP.NET повинен зібрати потрібний файл на льоту, щоб обробити його і щось подати. Також node.js вважається більш масштабованим через його зворотного виклику- заснована архітектура )
  2. Використання архітектури RESTful замість моделі веб-сервісу (SOA)
  3. Використання JSON для передачі даних замість XML (що призводить до передачі менше байтів)
  4. Дотримуючись інструкцій щодо ефективності Yahoo
  5. Теми мережі та обладнання, такі як балансування навантаження або архітектура ярусів

2
Ви не можете сказати, що PHP швидше. Правильно написані програми ASP.NET можуть перевершити PHP у багатьох випадках. naspinski.net/post/AspNet-vs-php--speed-comppare.aspx
Ендрю Льюїс

+1 Насправді вашим простим рішенням буде користувальницький інтерфейс -> Доступ до даних -> База даних. 2 REST "простий", оскільки він уже вбудований у більшість браузерів. Не потрібно відтворювати колесо API-відповіді команд. 3 JSON не тільки менший, але для того, щоб серіалізувати-десеріалізувати, потрібно менше кроків, тому що вам не потрібно перевіряти наявність HTML-об'єктів. Хороший матеріал.
Еван Плейс

1

Є два основних способи масштабування, збільшення та зменшення масштабів.

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

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

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

Я б зробив варіант 1, мав службу, а не робив це безпосередньо. Наразі ви можете масштабувати лише монолітне додаток.


0

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

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