Перевод текста на русский язык:
При разработке современных программных систем привлекательность распределённых систем может быть ошеломляющей. Они обещают масштабируемость, высокую доступность и способность обрабатывать огромные нагрузки, что делает их популярным выбором для многих разработчиков. Однако за блестящей поверхностью распределенных систем скрывается сложный клубок проблем, которые могут превратить ваш проект мечты в кошмар.
Заблуждения о распределённых системах
Прежде чем погрузиться в детали, давайте рассмотрим некоторые распространённые заблуждения, которые часто приводят разработчиков к выбору распределённых систем без полного понимания последствий.
- Сеть надёжна. Одна из самых опасных ошибок — полагать, что сеть всегда будет работать без каких-либо проблем. Сети по своей природе уязвимы к сбоям, таким как потери пакетов, задержки и потери соединения. Эти проблемы могут возникнуть из-за поломок оборудования, программных сбоев или физических нарушений.
- Задержка равна нулю. Другое заблуждение заключается в том, что передача данных происходит мгновенно. Задержка, вызванная такими факторами, как расстояние, перегрузка сети и задержки обработки, может существенно повлиять на производительность вашей системы. Такие методы, как кэширование и асинхронная связь, могут помочь смягчить эту проблему, но они добавляют сложности.
- Пропускная способность бесконечна. Неограниченная пропускная способность — это миф. В приложениях с высоким темпом работы пропускная способность может стать ограничивающим фактором. Эффективное управление пропускной способностью через сжатие, кодирование данных и приоритизацию крайне важно для поддержания производительности.
- Сеть безопасна. Верить в то, что сеть по своей сути безопасна, — путь к катастрофе. Сети можно прослушивать, взламывать и атаковать злоумышленниками. Обеспечение безопасности включает в себя надёжные меры, такие как шифрование, брандмауэры и непрерывный мониторинг.
Сложность распределённых систем
Распределённые системы вводят уровень сложности, который может оказаться пугающим даже для опытных разработчиков.
Частичные сбои и неизвестные состояния
В распределённой системе частичные сбои могут привести к неизвестным состояниям. Например, если служба обработки заказов выходит из строя во время обработки заказа, неясно, был ли создан заказ или обновился запас. Эта неопределённость требует сложных механизмов повторных попыток и обработки ошибок, которые бывает сложно реализовать правильно.
Время и синхронизация
Каждый компонент в распределённой системе имеет собственное представление о времени, и даже с помощью таких решений, как NTP, дрейф времени неизбежен. Это делает невозможным полагаться на настенные часы для упорядочивания событий, добавляя ещё один уровень сложности в вашу систему.
Согласованность данных
В распределённых системах данные часто хранятся в нескольких системах хранения, каждая со своими механизмами сохранения. Это может привести к несогласованности данных, если её не контролировать должным образом. Например, два запроса на получение заказа могут дать противоречивые результаты, если система хранения запасов использует окончательную согласованность.
Операционная катастрофа
Разработка распределённой системы — это только начало; поддержание её — вот где начинаются настоящие проблемы.
Опыт
Когда вы создаёте собственную распределённую систему, знания о ней часто являются исключительно внутренними, то есть передаются напрямую от разработчиков команде эксплуатации. Этот недостаток внешних ресурсов и документации может сделать устранение неполадок и обслуживание невероятно трудными. Здесь нет поиска Google или ответа Stack Overflow, чтобы спасти ситуацию; вы — узкое место.
Непрерывное решение проблем
С собственной распределённой системой вы будете тратить больше времени на решение проблем, чем на создание новых функций. Каждая проблема переходит к вам, а у команды эксплуатации ограниченные ресурсы для самостоятельного устранения неполадок. Это может превратить вашу роль разработчика в роль пожарного на полную ставку, постоянно затыкающего дыры в вашей системе.
Стоимость собственных решений
Одна из наиболее убедительных причин избегать создания собственной распределённой системы заключается в связанных с этим расходах.
Ресурсы и время
Создание распределённой системы с нуля — трудоёмкая и ресурсоёмкая задача. Она требует обширного тестирования, включая тестирование всех возможных режимов отказа, что может увеличить вашу тестовую матрицу экспоненциально. Например, то, что могло бы составлять 10 сценариев для тестирования в одномашинной версии, в распределённой системе может превратиться в 200 сценариев.
Упущенные возможности
Время и ресурсы, потраченные на создание и поддержку собственной распределённой системы, можно было бы лучше использовать в других аспектах вашего проекта. Использование существующих распределённых систем позволяет вам воспользоваться коллективным опытом и усилиями сообщества, освобождая вас для сосредоточения внимания на основной бизнес-логике и функциях.
Когда использовать распределённые системы
Несмотря на проблемы, существуют сценарии, когда распределённые системы являются правильным выбором.
Масштабируемость и высокая доступность
Если вашему приложению требуется масштабируемость и высокая доступность, распределённые системы могут предоставить необходимую инфраструктуру. Например, облачные сервисы, такие как Amazon Web Services (AWS), построены на распределённых системах для обработки огромных нагрузок и обеспечения непрерывной работы.
Сложные сценарии использования
Определённые сценарии использования, такие как обработка данных в реальном времени или распределённые базы данных, по своей сути требуют распределённых систем. Здесь преимущества распределённых систем перевешивают затраты, а сложность оправдывается функциональностью.
Заключение
Распределённые системы не являются универсальным решением. Хотя они предлагают масштабируемость и высокую доступность, они связаны с множеством сложностей и проблем, которые для многих проектов могут принести больше проблем, чем пользы.
Прежде чем приступить к созданию распределённой системы, сделайте шаг назад и спросите себя:
- Действительно ли мне нужна масштабируемость и высокая доступность, предлагаемые распределёнными системами?
- Учёл ли я операционные расходы и затраты на обслуживание?
- Существуют ли существующие решения, которые могли бы удовлетворить мои потребности без дополнительной сложности?
Вот простая блок-схема, которая поможет вам принять решение:
В конце концов, решение об использовании распределённой системы должно основываться на тщательном анализе требований вашего проекта и связанных с ним затрат. Иногда самое простое решение является лучшим, и избегание сложностей распределённых систем может избавить вас от множества проблем.