Масштабируемые системы 101

Масштабируемые системы 101 Изучение

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

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

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

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

Что такое масштабируемость?

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

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

Задержка против пропускной способности против пропускной способности

Задержка — это время, необходимое системе для ответа на запрос пользователя.

Существует два основных типа задержки: Сетевая задержка — это время, необходимое сети для отправки пакета данных из точки А в точку Б. Задержка приложения — это время, необходимое приложению для обработки запроса пользователя.

Компании сокращают задержку в сети, используя сети доставки контента (CDN) для развертывания своих серверов ближе всего к конечному пользователю. Эти сайты называются пограничными местоположениями. Одним из решений для минимизации задержки приложений является запуск стресс -тестов и нагрузочных тестов для поиска узких мест в системе.

Пропускная способность измеряет способность сети или вычислительной системы отправлять или получать данные в течение определенного периода времени.

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

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

Когда важна масштабируемость?

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

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

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

Система с плохой масштабируемостью может увеличить трудозатраты и время отклика и даже поставить под угрозу качество продукта или услуги.

Примечание. Спросите себя, сколько пользователей вы хотите, чтобы дизайнерское решение поддерживало, а затем спросите себя, может ли эта конструкция поддерживать в 10 раз больше пользователей?

Механизмы достижения масштабируемости

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

Вертикальное масштабирование (увеличение)

Вертикальное масштабирование означает добавление большей мощности для обработки возросших нагрузок. Вот вам архитектурная аналогия.

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

То же правило действует, если на сервере с 16 гигабайтами ОЗУ размещается приложение, которое видит взрыв трафика. Одним из способов размещения этого дополнительного трафика было бы увеличение оперативной памяти до 32 гигабайт.

То же правило действует, если на сервере с 16 гигабайтами

Вертикальное масштабирование

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

Вернемся к аналогии с нашей квартирой. В вашем высотном многоквартирном доме могут с комфортом разместиться 10 000 жильцов. Для вашего следующего проекта вас попросят построить высотное здание, способное вместить 1 000 000 арендаторов.

Читайте также:  В чем разница между su и su- в Linux?

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

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

Точно так же вы не можете увеличивать вычислительную мощность одного сервера до бесконечности. В какой-то момент вам нужно будет подключить к своей системе больше серверов, чтобы обрабатывать весь трафик, который вы будете видеть.

Преимущества Ограничения
Легкий и несложный (как с административной точки зрения, так и с точки зрения разработки программного обеспечения) Технологические ограничения препятствуют бесконечному вертикальному масштабированию
Не нужно рефакторить код Значительно дороже купить современное оборудование
Нет необходимости менять реализацию Может не отвечать на одновременные запросы

Горизонтальное масштабирование (масштабирование)

При горизонтальном масштабировании системы вы добавляете дополнительное оборудование для увеличения вычислительной мощности системы.

При горизонтальном масштабировании системы вы добавляете дополнительное

Горизонтальное масштабирование

Горизонтальное масштабирование имеет значительно меньше физических и технологических ограничений. Гораздо проще добавить больше серверов и настроить дополнительные центры обработки данных, чем сделать один сервер чрезвычайно мощным. Таким образом, единственное практическое ограничение горизонтального масштабирования — количество имеющихся у вас ресурсов. Горизонтальное масштабирование также позволяет использовать динамическое масштабирование для эффективной обработки изменений трафика. Когда трафик растет, больше серверов подключено к сети, и меньше серверов подключено к сети, когда трафик падает для экономии ресурсов.

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

Преимущества Ограничения
Экономически эффективным Больше машин = больше отказов
Лучшая устойчивость Необходимость сложного промежуточного программного обеспечения для взаимодействия между узлами
Время простоя менее вероятно
Позволяет динамическое масштабирование в зависимости от трафика
Лучшая отказоустойчивость

Размеры масштабируемости

Существует несколько способов измерения масштабируемости, но все показатели будут измерять степень удовлетворенности от предоставления того или иного нового сервиса.

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

Административная масштабируемость — это измерение масштабируемости, связанное с ручным трудом, необходимым для управления и обслуживания системы. Административно масштабируемая система не потребует значительного увеличения административных издержек при добавлении новых узлов.

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

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

Функциональная масштабируемость относится к способности системы добавлять новые возможности и функции без прерывания работы или снижения производительности.

Выявление узких мест в производительности

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

Монолитная база данных

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

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

Один из способов обеспечить масштабируемость базы данных — разумно использовать секционирование и сегментирование базы данных.

Разделение базы данных разбивает большие базы данных на более мелкие, известные как сегменты, чтобы ускорить поиск данных.

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

Вы можете разделить эту базу данных на множество более мелких баз данных, организованных по континентам, странам, филиалам компании или другим образом.

Неправильный тип базы данных

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

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

Если приоритетом для вашего приложения является не строгая согласованность, а горизонтальная масштабируемость, то база данных NoSQL будет хорошим выбором для вашей базы данных. Знание того, какой тип хранилища данных лучше всего подходит для нужд вашего бизнеса, и рассмотрение преимуществ одной технологии перед другой на раннем этапе — это простой способ избежать этого конкретного узкого места.

Архитектурные ошибки

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

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

Читайте также:  Интеграция Razorpay в Django

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

Отсутствие кэширования

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

Исходные серверы содержат исходную версию вашего веб-сайта, которая кэшируется серверами на периферии. CDN могут кэшировать и сжимать точные копии ваших веб-страниц, чтобы уменьшить время приема-передачи (RTT) и задержку.

Если вы работаете с системой со значительным объемом статических данных, кэширование любых часто используемых данных из базы данных и сохранение их в ОЗУ может ускорить время отклика и значительно снизить затраты на развертывание.

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

Нет балансировщиков нагрузки

Балансировщики нагрузки используют несколько алгоритмов для равномерного распределения интенсивного трафика между несколькими серверами.

Вот некоторые алгоритмы, используемые для балансировки нагрузки:

  • Наименьшее время отклика : этот алгоритм направляет трафик на сервер с наименьшим количеством активных подключений и наименьшей задержкой.
  • Round Robin : этот алгоритм чередует серверы в очереди. Трафик распределяется по очереди в зависимости от того, какой сервер стоит следующим в очереди.
  • IP-хеш : IP-адрес клиента определяет, какой сервер получает его запросы.

Балансировка нагрузки смягчает проблемы, которые могут возникнуть при работе с монолитной базой данных, где весь трафик сходится на одном узле. Когда сервер выходит из строя, балансировщик нагрузки автоматически перенаправляет запросы на другие серверные узлы в кластере, чтобы гарантировать, что вся система остается в сети.

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

Плохо написанный код

Неэффективный или плохо написанный код — еще один способ ухудшить масштабируемость вашего приложения и замедлить разработку программного обеспечения в целом. Использование ненужных или вложенных циклов, а также написание тесно связанного кода может вывести из строя весь сервис в производственной среде.

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

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

Неиспользование нотации Big O также может повредить масштабируемости вашего приложения. Big O измеряет сложность алгоритма по двум измерениям: времени (сколько времени требуется для выполнения функции) и пространству (сколько памяти требуется для выполнения функции).

Тестирование производительности вашего приложения

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

  • Профилируйте свое приложение. Профилирование — это динамический анализ вашего кода, который может помочь вам понять, как устранить ошибки параллелизма и ошибки памяти. Профилирование также повышает общую надежность и безопасность вашей программы.
    • Запустите профиль приложения и профилировщик кода или ознакомьтесь со списком инструментов анализа производительности, используемых в отрасли.
  • Используйте CDN. CDN уменьшают задержку, вызванную близостью пользователей к базе данных.
  • Сжать данные. Используйте алгоритмы сжатия для сжатия данных, а затем сохраняйте их в сжатом виде. Сжатые данные потребляют меньше трафика и загружаются намного быстрее, чем несжатые данные.

Тестирование масштабируемости вашего приложения

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

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

Параметры для рассмотрения:

  • Использование процессора
  • Потребление пропускной способности сети
  • Пропускная способность
  • Количество запросов, обработанных в течение x времени
  • Задержка
  • Использование памяти приложением
  • UX во время интенсивного трафика

На этапе тестирования стресс- и нагрузочные тесты используются для имитации трафика и наблюдения за тем, как система ведет себя и масштабируется при больших нагрузках.

Заключение

Сегодня мы многое рассмотрели. Проектирование системы охватывает множество тем, но, надеюсь, теперь вы лучше знакомы с некоторыми фундаментальными концепциями, лежащими в основе масштабируемости, и почему масштабируемость так важна для качественного проектирования программного обеспечения. Хотя технологические инновации (например, облачные вычисления) могут изменить способ решения проблем, связанных с проектированием систем, почти наверняка нам всегда нужно будет думать о том, как наши системы могут адаптироваться и сохраняться в будущем.

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

Оцените статью
bestprogrammer.ru
Добавить комментарий

Adblock
detector