Растущие компании часто сталкиваются с проблемой производительности. Без надлежащего масштабирования приложения могут работать медленно, неэффективно и вызывать недовольство пользователей. Одно из решений этой проблемы – это выбор правильной стратегии масштабирования, поскольку их разные виды предлагают разные подходы.
В этой статье мы рассмотрим горизонтальное и вертикальное масштабирование, сравним их сильные и слабые стороны, и предложим практические решения, которые помогут выбрать лучшую стратегию для вашего проекта.
Что такое горизонтальное и вертикальное масштабирование: сравнительная таблица
Прежде чем перейти к подробному анализу, давайте очень кратко рассмотрим основные различия между горизонтальным и вертикальным масштабированием в таблице ниже:
Аспект
|
Горизонтальное масштабирование
|
Вертикальное масштабирование
|
Масштабируемость
|
Практически неограничена
|
Ограничена возможностями аппаратного обеспечения
|
Стоимость
|
Более низкая (есть возможность масштабирования с помощью стандартного оборудования)
|
Более высокая (необходима закупка высокопроизводительного оборудования)
|
Сложность
|
Высокая
|
Низкая
|
Надежность
|
Высокая
|
Более низкая
|
Производительность
|
Отлично подходит для параллельных задач
|
Лучше подходит для однопоточных задач
|
Согласованность данных
|
Сложная (требует синхронизации)
|
Простая (все данные на одном сервере)
|
Обслуживание
|
Более сложное
|
Более простое
|
Гибкость
|
Высокая
|
Ограничена пропускной способностью сервера
|
Скорость развертывания
|
Потенциально может быть медленной (большее количество компонентов)
|
Быстрее (однократное развертывание)
|
Способ обновления
|
Добавление дополнительных серверов
|
Обновление оборудования
|
А теперь давайте подробнее рассмотрим каждый метод масштабирования, их особенности и примеры использования в реальных условиях.
Что такое горизонтальное масштабирование
Горизонтальное масштабирование – это важнейший элемент современной системной архитектуры, особенно в сфере облачных вычислений и распределенных системах. Оно решает проблему обработки растущих рабочих нагрузок путем добавления дополнительных ресурсов вместо модернизации существующих. В этом разделе мы рассмотрим основы горизонтального масштабирования, как оно работает и когда его наиболее эффективно использовать.
Определение и механизм
Горизонтальное масштабирование означает добавление в систему большего количества машин или узлов. Этот подход распределяет нагрузку между несколькими устройствами вместо увеличения возможностей одного сервера, как это происходит при вертикальном масштабировании.
За счет привлечения дополнительных серверов инфраструктура расширяется и становится возможным управлять большим количеством транзакций или данных. Вот список ключевых компонентов горизонтального масштабирования:
- Балансировка нагрузки. Балансировщик нагрузки выполняет роль регулировщика трафика, который следит за вашими серверами и направляет запросы клиентов на все серверы, способные выполнять эти запросы, чтобы максимально увеличить скорость и производительность. Таким образом он предотвращает превращение какого-либо отдельного сервера в “бутылочное горлышко”.
- Распределенные вычисления. Они распределяют вычислительные задачи между несколькими компьютерами. С использованием таких платформ, как Hadoop, Apache Spark и Kubernetes, организации могут выполнять эти задачи одновременно на разных узлах. Такой подход повышает производительность и позволяет более эффективно использовать доступные ресурсы.
- Stateless-архитектура (без учета состояния). В такой системе каждый запрос от клиента содержит всю информацию, необходимую для его обработки, независимо от состояния сервера. Это помогает распределять запросы по нескольким серверам, не беспокоясь о контексте.
- Разделение данных (Sharding). Большие базы данных разделяются на более мелкие, более управляемые части, называемые сегментами. Каждый сегмент хранится на отдельном экземпляре сервера баз данных для распределения нагрузки. Сегментирование обеспечивает горизонтальное масштабирование на уровне базы данных.
В горизонтально масштабируемой среде каждый узел работает независимо, выполняя часть общей рабочей нагрузки. Такая настройка предлагает высокую доступность, а в случае сбоя в работе одного узла, другие могут взять на себя выполнение его задач.
VPS для бизнеса
Виртуальные приватные серверы - эффективная работа по приятной цене. Быстрые NVMe, более 30 стран, масштабирование в любой момент.
Тарифы
Ключевые функции
Горизонтальное масштабирование имеет несколько особенностей, которые демонстрируют его преимущества и потенциальные области применения. Вот список причин, почему многие современные системы предпочитают масштабирование по горизонтали, а не по вертикали:
- Распределенная нагрузка. В таких системах рабочая нагрузка распределяется между несколькими серверами, что снижает нагрузку на какой-либо один сервер. А это значит, что в один момент может быть обработано больше запросов
- Масштабируемость. Системы можно масштабировать бесконечно (в теории), добавляя больше узлов. Такая линейная масштабируемость идеально подходит для приложений с непредсказуемыми или быстро растущими рабочими нагрузками, что во многих случаях делает горизонтальное масштабирование более гибким, чем вертикальное.
- Отказоустойчивость. Если один узел выходит из строя, система продолжает функционировать, а другие выполняют ее задачи.
- Экономическая выгода. В случае с горизонтальным масштабированием можно использовать обычное оборудование, что снижает затраты по сравнению с высокопроизводительными серверами, необходимыми для вертикального масштабирования.
- Гибкость. Горизонтальное масштабирование предлагает высокую степень гибкости, ведь ресурсы могут быть добавлены или удалены в зависимости от спроса. Это особенно полезно в облачных средах, таких как Amazon Web Services (AWS), где ресурсы могут быть выделены по запросу.
- Географическое распределение. Узлы могут быть расположены в разных регионах, что сокращает задержку для пользователей из разных мест и ускоряет аварийное восстановление.
Варианты использования горизонтального масштабирования
Горизонтальное масштабирование особенно актуально, когда задачи можно разделить и выполнять одновременно. Вот несколько распространенных примеров использования горизонтального масштабирования:
- Веб-приложения с высоким трафиком. Платформы социальных сетей, e-commerce сайты и сети доставки контента (CDN) часто используют горизонтальное масштабирование для управления массовыми нагрузками со стороны пользователей. Например, Facebook и Amazon используют серверные фермы, расположенные по всему миру, для одновременного обслуживания миллионов пользователей.
- Распределенные базы данных. Если вертикальное масштабирование предполагает обновление аппаратного обеспечения одного сервера баз данных, то горизонтальное масштабирование позволяет распределить базу данных по нескольким серверам – это повышает производительность и надежность.
- Архитектура микросервисов. Приложения, созданные с использованием микросервисов, могут масштабировать отдельные службы по горизонтали в соответствии с конкретными требованиями. Каждая служба может быть развернута независимо от других и масштабироваться в зависимости от ее уникальных характеристик нагрузки.
- Облачные вычисления. Облачные платформы, например AWS, Microsoft Azure и Google Cloud, предлагают простые возможности горизонтального масштабирования с помощью таких сервисов, как группы автоматического масштабирования и кластеры Kubernetes. Это позволяет компаниям быстро корректировать ресурсы в ответ на изменения нагрузки.
- Обработка больших данных (Big Data). Горизонтальное масштабирование особенно актуально для платформ аналитики больших данных, которые обрабатывают огромные объемы информации в распределенных системах.
- WebSockets-приложения. Для приложений, использующих WebSockets, важно понимать разницу между горизонтальным и вертикальным масштабированием, чтобы поддерживать постоянные соединения в нужном масштабе. В частности, горизонтальное масштабирование позволяет распределять соединения между несколькими серверами, что повышает на масштабируемость и надежность.
- Высокопроизводительные вычисления. Разные виды сложных вычислений выигрывают от распределения задач по нескольким узлам – они сокращают время обработки.
Что такое вертикальное масштабирование
Если горизонтальное масштабирование позволяет увеличить количество машин, способных справляться с повышенной нагрузкой, то вертикальное масштабирование использует другой подход, повышая мощность существующих машин. Далее в этом разделе мы рассмотрим концепцию вертикального масштабирования, объясним, как оно работает, его преимущества и когда оно наиболее целесообразно.
Определение и механизм
Вертикальное масштабирование направлено на увеличение пропускной способности отдельного сервера или узла. Этот подход повышает производительность существующего оборудования за счет добавления таких ресурсов, как:
- Центральный процессор. Обновление до процессоров с большим количеством ядер или более высокой тактовой частотой позволяет выполнять больше вычислений.
- Оперативная память. Увеличение объема памяти позволяет серверу одновременно запускать дополнительные процессы и управлять большими массивами данных.
- Место хранения. Есть возможность увеличить емкость диска или переключиться на более быстрые решения для хранения данных, чтобы сократить время на их поиск.
- Пропускная способность сети. Усовершенствование сетевых интерфейсов для более высоких скоростей передачи данных.
Хранение бэкапов
Надежное пространство для резервных копий вашего проекта. is*hosting гарантирует защиту данных.
Тарифы
Механизм вертикального масштабирования выглядит так:
- Обновление аппаратного обеспечения. Физическое обновление серверных компонентов до более высоких спецификаций.
- Масштабирование виртуальной машины. В облачных средах это может означать изменение размера экземпляра виртуальной машины до экземпляра с большим количеством ресурсов без обновления физического оборудования.
Вертикальное масштабирование не требует существенного изменения кода или архитектуры приложения, поскольку приложение продолжает работать на одном сервере с более широкими возможностями. Именно эта простота делает его привлекательным вариантом для многих компаний и проектов.
Ключевые функции
Вертикальное масштабирование отличается простотой и легкостью реализации, но это еще не все. Вот список его главных преимуществ:
- Простота. Этот подход прост в применении на практике. Он позволяет избежать сложностей, связанных с балансировкой нагрузки, разделением данных и изменениями архитектуры приложения, необходимыми для горизонтального масштабирования.
- Согласованность. Учитывая, что все данные хранятся на одном сервере, вертикальное масштабирование устраняет проблемы, связанные с синхронизацией данных, согласованностью и задержкой в сети, которые могут возникнуть при горизонтальном масштабировании между несколькими узлами.
- Минимальная задержка. Все процессы выполняются на одном компьютере, что потенциально снижает нагрузку на связь между компонентами. Это означает более быструю обработку определенных типов рабочих нагрузок.
- Простота управления. Меньшее количество серверов означает меньшую сложность с точки зрения управления, мониторинга и обслуживания. Теоретически это снизит операционные издержки и упростит устранение неполадок по сравнению с управлением несколькими узлами при горизонтальном масштабировании.
- Немедленное повышение производительности. Обновление оборудования может быстро повысить производительность и не потребует внесения изменений в программное обеспечение.
Варианты использования вертикального масштабирования
Вертикальное масштабирование – отличный вариант в случаях, если вы работаете с приложением, дистрибьюция которого затруднена, или, например, если ваша организация стремится к простоте, а не к масштабируемости. Вот список других распространенных вариантов использования этого подхода:
- Устаревшие системы. Более старые приложения, предназначенные для работы на одном сервере, выигрывают от вертикального масштабирования. Модификация таких приложений для горизонтального масштабирования может оказаться неосуществимой из-за архитектурных ограничений или стоимости.
- Монолитные приложения. Приложения, которые тесно интегрированы и требуют, чтобы все компоненты находились в одном месте, могут не подходить для распределения на нескольких серверах. В этом случае вертикальное масштабирование становится единственным выбором.
- Серверы баз данных. Базы данных, которые требуют строгой согласованности и не могут быть легко разделены на разделы, могут значительно выиграть от вертикального масштабирования и повысить нагрузку.
- Начальные этапы разработки. Стартапы или небольшие приложения, в которых рабочая нагрузка не оправдывает распределенную систему, могут использовать вертикальное масштабирование для удовлетворения потребностей в производительности без сложного горизонтального масштабирования.
- Системы обработки данных в режиме реального времени. Системы, требующие быстрой обработки данных, такие как торговые платформы или некоторые приложения интернета вещей, могут предпочесть вертикальное масштабирование из-за минимальных задержек связи.
- Лицензионные ограничения. Некоторые лицензии на программное обеспечение привязаны к количеству серверов или экземпляров, что делает вертикальное масштабирование более бюджетным вариантом.
Подробное сравнение горизонтального и вертикального масштабирования
Для того, чтобы составить полную картину о горизонтальном и вертикальном масштабировании, необходимо понимать различия, существующие в каждом подходе. Именно поэтому далее в этом разделе мы сравним два типа масштабирования и рассмотрим некоторые факторы, такие как стоимость, масштабируемость, сложность, надежность и производительность.
Анализ затрат на горизонтальное и вертикальное масштабирование:
- Горизонтальное масштабирование. На первый взгляд, этот подход может показаться дорогостоящим, поскольку требует большего количества серверов и расширения инфраструктуры. Однако использование стандартного оборудования и облачных сервисов может сделать его вполне экономичным вариантом. Только имейте в виду, что эксплуатационные расходы также могут возрасти, поскольку управление несколькими серверами потребует больше ресурсов.
- Вертикальное масштабирование. Переход на высокопроизводительное оборудование может быть дорогостоящим, поскольку мощные серверы стоят дорого. С другой стороны, при меньшем количестве серверов, эксплуатационные расходы могут быть ниже.
Рамки масштабируемости:
- Горизонтальное масштабирование. Предлагает практически неограниченную масштабируемость. Вы можете продолжать добавлять узлы в соответствии с потребностями, а облачные сервисы еще больше упрощают масштабирование.
- Вертикальное масштабирование. Ограничено максимальной доступной аппаратной мощностью, так как существует предел возможностей модернизации одной машины.
Сложность горизонтального и вертикального масштабирования:
- Горизонтальное масштабирование. Этот подход усложняет балансировку нагрузки, распределенные базы данных и согласованность данных. Поэтому горизонтальное масштабирование требует тщательного архитектурного планирования и глубокого понимания распределенных систем.
- Вертикальное масштабирование. Проще в реализации, поскольку требует только обновления оборудования без серьезных изменений в приложении или архитектуре.
Надежность и отказоустойчивость горизонтального и вертикального масштабирования:
- Горизонтальное масштабирование. Этот подход предлагает повышенную отказоустойчивость – если один узел выходит из строя, другие продолжают работать.
- Вертикальное масштабирование. Имеет единую точку отказа, если не были приняты меры по резервированию (например, резервные копии и отказоустойчивые системы).
Производительность горизонтального и вертикального масштабирования:
- Горизонтальное масштабирование. Хорошо работает в ситуациях, когда задачи могут выполняться параллельно. Подходит для stateless-приложений и рабочих нагрузок, которые легко распределяются по нескольким узлам.
- Вертикальное масштабирование. Может повысить производительность для задач, требующих тесной связи, общей памяти или обмена данными между процессами с низкой задержкой.
Согласованность данных и целостность при горизонтальном и вертикальном масштабировании:
- Горизонтальное масштабирование. Согласованность данных может стать сложной задачей, особенно в распределенных базах данных. Потребуется тщательное планирование репликации данных, синхронизации и моделей согласованности.
- Вертикальное масштабирование. Проще поддерживать согласованность данных, поскольку все данные хранятся на одном сервере.
Развертывание и поддержка горизонтального и вертикального масштабирования:
- Горизонтальное масштабирование. Развертывание можно автоматизировать с помощью специальных инструментов оркестрации, например Kubernetes, но для обслуживания нескольких серверов требуются надежные системы мониторинга и управления.
- Вертикальное масштабирование. Меньшее количество серверов делает развертывание и обслуживание простым, но может потребовать запланированного простоя для обновления.
Четкое понимание разницы между горизонтальным и вертикальным масштабированием только поможет компаниям эффективно масштабировать свою деятельность.
Как выбрать правильную стратегию масштабирования
Выбор правильной стратегии масштабирования сыграет важную роль в долгосрочном успехе вашего приложения или системы. Поэтому мы подробно описали ключевые соображения и шаги, которые помогут вам принять подходящее решение.
Что следует учитывать
Первым делом оцените следующие факторы:
- Характеристики рабочей нагрузки. Проанализируйте, может ли ваше приложение извлечь выгоду из параллельной обработки. Если задачи могут выполняться одновременно и не зависят от состояния, предпочтительнее будет горизонтальное масштабирование. Для рабочих нагрузок, требующих высокой вычислительной мощности для каждого процесса или тесно связанных между собой, лучше использовать вертикальное масштабирование.
- Бюджет. Рассмотрите финансовые последствия обеих стратегий. Горизонтальное масштабирование может быть более эффективным с точки зрения затрат в долгосрочной перспективе, но может потребовать первоначальных инвестиций в инструменты управления инфраструктурой. Вертикальное масштабирование может потребовать больше первоначальных затрат на оборудование.
- Технический опыт. Внедрение горизонтального масштабирования требует знаний в области распределенных систем, балансировки нагрузки, секционирования данных и рефакторинга приложений. Вертикальное масштабирование менее сложное, но может не соответствовать будущим потребностям в масштабируемости.
- Прогнозируемый рост. Если вы ожидаете значительного роста или изменения рабочих нагрузок, горизонтальное масштабирование даст вам большую гибкость. Вертикальное масштабирование подходит для стабильных или предсказуемых рабочих нагрузок.
- Архитектура приложения. Оцените, разработано ли ваше приложение с учетом масштабируемости. Приложения, построенные на микросервисах или протоколах без учета состояния, лучше подходят для горизонтального масштабирования. Монолитные приложения могут использовать вертикальное масштабирование (если их архитектура не будет изменена).
- Требования к согласованности данных. Если высокая согласованность и мгновенная синхронизация данных имеют большое значение и их трудно достичь в распределенных системах, выберите вертикальное масштабирование.
- Время выхода на рынок. Вертикальное масштабирование может ускорить развертывание, поскольку требует меньшего количества компонентов. Горизонтальное масштабирование может потребовать больше времени на настройку, но предлагает и более долгосрочную масштабируемость.
- Соответствие требованиям и безопасность. Рассмотрите любые нормативные требования, которые могут повлиять на вашу стратегию масштабирования. Распределенные системы могут создавать дополнительные проблемы с безопасностью.
Инструкция для принятия решения
Четкое понимание, когда использовать горизонтальное масштабирование, а когда вертикальное, зависит от различных факторов, которые мы описали выше. Но как учесть все эти данные? С чего начать? Отвечаем далее:
- Оцените текущие и будущие потребности. Тщательно проанализируйте требования к производительности вашего приложения. Посмотрите на текущие модели использования и подумайте о планируемом росте. Используйте такие показатели, как загрузка процессора, памяти, время отклика и пропускная способность.
- Проанализируйте структуру рабочей нагрузки. Определите, связана ли ваша рабочая нагрузка с процессором, памятью или пропускной способностью. Идентификация таких “бутылочных горлышек” помогает выбрать правильную стратегию масштабирования.
- Оцените архитектуру приложения. Проверьте, может ли ваше приложение адаптироваться к горизонтальному масштабированию без значительных изменений или потребуется значительный рефакторинг.
- Рассмотрите стратегии управления данными. Подумайте о том, как вы будете управлять данными, синхронизировать их и создавать резервные копии при обоих вариантах масштабирования.
- Оцените затраты. Подготовьте подробный анализ затрат, включая затраты на оборудование, лицензии на программное обеспечение, облачные сервисы и операционные расходы.
- Проконсультируйтесь с техническими специалистами. Привлеките системных архитекторов, инженеров DevOps или консультантов для оценки технических возможностей и обмена опытом.
- Пилотное тестирование. Создайте небольшой прототип или сделайте проверку концепции (Proof of concept), чтобы оценить выбранную стратегию масштабирования, прежде чем внедрять ее в более широком масштабе.
- Планируйте с учетом гибкости. Даже если вы выберете одну стратегию, проектируйте свою систему с учетом будущих изменений в масштабируемости, например, при необходимости переходите от вертикального масштабирования к горизонтальному.
Гибридный подход
Во многих случаях лучшим решением может стать гибридный подход, сочетающий как горизонтальное, так и вертикальное масштабирование. Эта стратегия использует преимущества обоих методов и может адаптироваться к меняющимся требованиям и технологическому прогрессу.
Сценарии для гибридного масштабирования
Гибридное масштабирование может быть адаптировано к конкретным потребностям и ситуациям, например:
- Вертикальное масштабирование, за которым следует горизонтальное масштабирование. Начните с вертикального масштабирования, чтобы удовлетворить актуальные потребности. По мере увеличения спроса и доступности ресурсов переходите к горизонтальному масштабированию, чтобы справляться с более высокими нагрузками.
- Объединение масштабируемых узлов. Используйте вертикально масштабируемые (более мощные) узлы в горизонтально масштабируемом кластере, чтобы повысить производительность. Это распространено в кластерах баз данных, где каждый узел надежен, но данные распределены.
- Многоуровневая архитектура. Реализуйте горизонтальное масштабирование для stateless-приложений (веб-серверы, API) и вертикальное масштабирование для данных с отслеживанием состояния (базы данных), где важна согласованность данных.
- Географическое распределение с локальным вертикальным масштабированием. Разверните горизонтально масштабируемые кластеры в разных географических точках, чтобы каждый кластер масштабировался вертикально в соответствии с местными требованиями.
- Масштабирование в зависимости от конкретной функции. Масштабируйте различные компоненты приложения по-разному в зависимости от их требований. Например, уровень кэширования может быть масштабирован по горизонтали, в то время как уровень обработки может быть масштабирован по вертикали.
Преимущества гибридных подходов
Гибридные подходы сочетают в себе горизонтальную и вертикальную масштабируемость и позволяют получить максимум от обоих видов. К преимуществам гибридного подхода можно отнести:
- Оптимизированное использование ресурсов. Можно распределить ресурсы в соответствии с требованиями к конкретным компонентам – так каждая часть системы будет эффективна.
- Экономическая эффективность. При необходимости можно сбалансировать затраты, используя вертикальное масштабирование (например, для баз данных, требующих высокой согласованности) и горизонтальное масштабирование, где это возможно (например, для веб-серверов, обрабатывающих большой трафик).
- Повышенная производительность. Высокая производительность достигается за счет объединения мощных серверов с распределенной обработкой. Такое сочетание поддерживает как задачи с высокой интенсивностью вычислений, так и масштабируемые рабочие нагрузки.
- Гибкость и ориентация на будущее. Гибридный подход позволяет вносить коррективы по мере развития приложения, приспосабливаясь к новым технологиям и меняющимся потребностям бизнеса.
- Снижение рисков. Диверсификация стратегий масштабирования может снизить риск, связанный с использованием одного подхода, и повысить устойчивость системы.
В дополнение к этим преимуществам, гибридные подходы также упрощают настройку вашей системы на будущее, обеспечивая масштабируемость по мере роста требований пользователей.
Выделенный сервер
Идеальное решение для масштабных проектов. Безупречная защита, высокая производительность и гибкая настройка.
Тарифы
Рекомендации по внедрению гибридного масштабирования
Если вы решили, что гибридное масштабирование лучше других подходит для вашей системы, почитайте наши рекомендации по его внедрению:
- Архитектурный дизайн. Определите четкие границы между компонентами, чтобы определить, какой метод масштабирования применяется. Используйте сервис-ориентированную архитектуру (service-oriented architecture – SOA) или микросервисы, чтобы облегчить это разделение, учитывая преимущества горизонтального и вертикального масштабирования на разных уровнях.
- Мониторинг и управление. Внедрите надежные инструменты мониторинга для управления компонентами как горизонтального, так и вертикального масштаба, чтобы улучшить видимость производительности системы.
- Автоматизация. Используйте средства автоматизации, например Ansible, Terraform или облачные решения, для управления политиками предоставления ресурсов и масштабирования.
- Синхронизация данных. Решайте проблемы, связанные с согласованностью и синхронизацией данных в различных моделях масштабирования, например, с помощью промежуточного программного обеспечения или стратегии репликации данных.
- Тестирование и валидация. Тщательно протестируйте гибридную систему в различных условиях нагрузки, чтобы подтвердить ее производительность, надежность и отказоустойчивость.
Хорошо разработанный план внедрения также имеет все шансы повысить производительность вашей системы в долгосрочной перспективе и помогает избежать “бутылочных горлышек”.
Заключение
Горизонтальное масштабирование предлагает гибкость и отказоустойчивость, отлично подходит для для работы с переменными нагрузками и легко приспосабливается к росту. В свою очередь, вертикальное масштабирование проще в управлении и лучше работает в устаревших системах или приложениях с постоянными рабочими нагрузками.
Чтобы выбрать правильную стратегию масштабирования, оцените требования вашего приложения, рабочую нагрузку и предполагаемый рост. Учитывайте технические навыки вашей команды и общие затраты, включая долгосрочные операционные расходы. Во многих случаях гибридный подход, сочетающий горизонтальное и вертикальное масштабирование, даст хорошее сочетание производительности, экономической эффективности и гибкости.
Имейте в виду, что универсального решения не существует. Будьте в курсе происходящего на вашем проекте и проконсультируйтесь с экспертами, чтобы выбрать подходящую стратегию.