Что делает приложение масштабируемым?


37

Я постоянно вижу в объявлениях о работе, что соискатель должен иметь опыт написания «масштабируемых» приложений. Что делает приложение масштабируемым и как я узнаю, что мой код может масштабироваться до миллионов пользователей?


Я думаю, что лучший способ сформулировать этот вопрос: как я могу написать свой код с учетом масштабируемости? Так что код масштабируется с самого начала, а не с запоздалой мыслью. Существуют ли определенные методологии проектирования? Или это просто вопрос выбора правильных алгоритмов для работы?

Ответы:


24

Существует два направления масштабируемости:

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

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

Второй сложнее. Это требует программирования с учетом двух вещей: данные будут обрабатываться параллельно, и данные могут быть физически распределены. Связь между узлами должна быть ограничена. На практике это обычно означает пожертвование некоторыми частями ACID (доказано, что у вас не может быть полного ACID и способности к горизонтальному масштабированию одновременно). Наиболее известным решением для хранения данных в этой парадигме являются решения NoSQL . Они варьируются от очень простых хранилищ значений ключей до систем, похожих на RDBMS, только лишенные возможности делать объединения. Магазины « ключ-значение» очень масштабируемы, но это цена. Вы можете запросить только первичный ключ. Однако есть решение, это уменьшение карты, Это может показаться очень неоптимальным, если вы посмотрите на точку зрения совокупной сложности, но вы должны иметь в виду, что он работает параллельно.

Если вы хотите узнать больше о масштабируемости на реальных примерах, загляните в блог HighScalability.com .


+1 за упоминание масштабирования. Добавление большего количества ресурсов очень быстро и привлекательно для лиц, принимающих решения (купите несколько шестигранных ядер и удвойте объем памяти!). Но если приложение не может оказать на них давление, у вас есть большая проблема.
JQA

14

Масштабируемость измеряется с точки зрения пропускной способности на основе некоторой переменной. Например, количество запросов / сек с X пользователями. Самый простой способ описать масштабируемость:

Мера эффективности при увеличении нагрузки.

Первое, что вам нужно понять при проектировании для масштабируемости, это то, какие измерения наиболее важны для вашего приложения? Существует несколько способов измерения эффективности, которые являются ключевым компонентом масштабируемости:

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

Существует больше измерений эффективности, которые можно использовать, но они являются общими для веб-систем или систем пакетной обработки.

Следующим аспектом масштабируемости является измерение того, что происходит с вашей эффективностью при увеличении нагрузки. Распространенные способы увеличения нагрузки:

  • Больше пользователей, попадающих на сервер (т.е. больше веб-трафика)
  • Больше данных в базе данных (т.е. запросы занимают больше времени или обработка занимает больше времени)
  • Сбой жесткого диска в RAID (производительность / надежность хранилища зависит)
  • Насыщенность сети

Цель масштабируемого приложения - поддерживать или повышать эффективность при решении проблемы нагрузки. Короче говоря, если время отклика занимает слишком много времени, можем ли мы добавить еще один сервер для равномерного распределения нагрузки? Такой подход сокращает объем работы, выполняемой одним сервером, и позволяет серверам работать в этом «лучшем месте» для повышения эффективности.

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


5

По сути, вы хотите избежать узких мест в производительности, когда увеличиваете количество пользователей и / или обрабатываете больший набор данных, и / или предлагаете свой интерфейс на нескольких языках и т. Д.

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

Я взял эти советы, когда читал « Создание масштабируемых веб-сайтов» (ссылка на Amazon).

Надеюсь это поможет!


3

Единственный способ, которым приложения могут быть действительно масштабируемыми, - это отсутствие ограничений, которые нельзя передать (или только очень дорого).

Типичным примером является то, что происходит, когда у вас заканчиваются доступные циклы процессора? Если ваша программа многопоточная, вы можете запустить на коробке с несколькими ядрами, но что произойдет, если вы больше не сможете купить большую коробку? Ваше приложение просто не может больше расти и, следовательно, не масштабируется.

Любое действительно масштабируемое приложение должно иметь возможность прозрачного распределения по нескольким компьютерам и делать это без каких-либо заметных затруднений. Это нелегко, и это одна из причин успеха Google.


1

Существуют уникальные проблемы, связанные с поддержкой крупномасштабных приложений. Вакансия ищет кандидатов, которые работали в этой среде и должны были решить такие проблемы.

Приложения высокого уровня становятся масштабируемыми, постоянно задавая вопрос, что произойдет, если этот фрагмент кода будет запрошен тысячи раз за очень короткий период времени. Это означает управление вашими следами памяти, использование кэширования итогов и данных, использование источников данных, которые сами масштабируются, и т. Д.


1

Если вы строили функцию поиска, которая работала хорошо, когда в БД 100 строк для поиска и 10 пользователей использовали ее одновременно. Насколько хорошо он будет работать, когда 100 пользователей будут использовать его одновременно, и есть 100K строк для поиска.

Если он выполняет то же самое, несмотря ни на что, это очень хорошо. Это хорошо, если он работает пропорционально количеству пользователей / данных (т.е. в 10 раз больше данных == в 10 раз дольше для обработки). Если он работает намного ниже, чем больше у него данных (данные в 10-кратном режиме == 10 × ^ 10 дольше для обработки), то он плохо масштабируется.

Мои примеры действительно должны быть показаны в обозначении Big O, но в настоящее время я недостаточно хорошо их знаю, чтобы выписать примеры в Big O.

Вы можете симулировать больше данных, помещая фиктивные данные в вашу БД, и есть инструменты для симуляции большего количества пользователей, такие как Apache AB.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.