Шаблон «Посредник»
Этот шаблон предназначен для вынесения некритичных для бизнеса задач из основного приложения во вспомогательный сервис, называемый посредником.

Как работает паттерн:
- Посредник действует как прокси между приложением и внешними сервисами или компонентами инфраструктуры.
- Он берет на себя задачи, не связанные с бизнес-логикой, тем самым упрощая основное приложение.
Преимущества:
- Упрощает основное приложение, убирая повторяющиеся задачи.
- Улучшает наблюдаемость за системой благодаря централизованному логированию и мониторингу.
- Повышает отказоустойчивость, реализуя автоматические повторы запросов и механизм защиты от сбоев.
Пример использования:
В архитектуре микросервисов сервис-посредник может управлять повторными запросами и тайм-аутами при обращении к внешним API, защищая основное приложение от перегрузки и ошибок соединения.
Шаблон «Предохранитель»
Шаблон «Предохранитель» – это паттерн отказоустойчивости, который предотвращает цепные отказы в распределенных системах. Он отслеживает обращения к сервису и «размыкается» (блокирует запросы), если частота сбоев превышает заданный порог.

Как работает паттерн:
- Если вызовы к сервису начинают часто завершаться с ошибками, предохранитель переходит в открытое состояние и отклоняет новые запросы.
- Через некоторое время система переходит в полуоткрытое состояние, чтобы проверить, восстановился ли сервис.
- Если тестовые запросы проходят успешно, предохранитель снова замыкается, позволяя нормальную работу. В противном случае он остается открытым.
Преимущества:
- Защищает сервисы от перегрузки зависимых компонентов.
- Повышает стабильность системы, изолируя сбойные модули.
- Ускоряет восстановление, предотвращая лишнюю нагрузку на проблемный сервис.
Пример использования:
В e-commerce системе предохранитель может защитить сервис обработки заказов от бесконечных попыток связаться с недоступным платежным шлюзом, экономя ресурсы и предотвращая задержки.
Как разработчику выйти на новый уровень: интенсив по архитектуре и шаблонах проектирования
Для тех, кто хочет глубже разобраться в архитектуре и шаблонах проектирования: опытные разработчики из HWdTech запустили интенсив, где на примере создания игры разбирают SOLID-принципы и паттерны проектирования – от теории к реальным кейсам.
Шаблон «Разделение ответственности» CQRS
Паттерн CQRS («разделение ответственности между командами и запросами») разделяет операции чтения и записи на отдельные модели, оптимизируя каждую из них под свою задачу.

Как работает паттерн:
- Модель команд отвечает за операции записи (создание, обновление, удаление данных).
- Модель запросов отвечает за чтение данных. Она часто использует заранее подготовленные и денормализованные представления для быстрого доступа к информации.
Преимущества:
- Повышает масштабируемость за счет разделения нагрузки между чтением и записью.
- Позволяет использовать разные модели данных и технологии для каждой операции.
- Упрощает сложную бизнес-логику, сосредотачивая каждую модель на одной задаче.
Пример использования:
В интернет-магазине CQRS позволяет обрабатывать массовые запросы на просмотр каталога товаров отдельно от операций размещения заказов, обеспечивая высокую производительность чтения и стабильность системы.
Шардинг
Шардинг – это метод разделения монолитной базы данных на несколько меньших частей (шардов), распределенных по разным серверам. Каждый шард содержит только часть данных.

Как работает паттерн:
- Данные разделяются по определенному ключу (например, ID пользователя или географическому региону).
- Каждый шард работает независимо и управляет только своим подмножеством данных.
Преимущества:
- Улучшает горизонтальное масштабирование, распределяя нагрузку между серверами.
- Снижает риск единой точки отказа: сбой одного шарда не влияет на другие.
- Повышает производительность, уменьшая конкуренцию за ресурсы.
Пример использования:
В социальной сети данные пользователей можно шардировать по регионам, чтобы локальные всплески трафика не перегружали всю базу данных.
Шаблон расширения (Sidecar)
Шаблон расширения Sidecar заключается в развертывании вспомогательных компонентов рядом с основным сервисом в отдельном контейнере. Эти контейнеры-расширения выполняют общие вспомогательные задачи, включая:
- Обнаружение сервисов
- Логирование
- Мониторинг
- Управление конфигурацией

Как работает паттерн:
- Основной сервис и его sidecar-контейнер работают на одном хосте или в одном поде (если используется Kubernetes).
- Взаимодействие между основным сервисом и сайдкар-контейнером происходит через локальные механизмы связи (например, общую память, локальную сеть, сокеты и т. д.).
Преимущества:
- Разделение логики – основные задачи сервиса остаются неизменными, а вспомогательные функции выносятся в отдельный контейнер.
- Повторное использование – можно единообразно внедрять вспомогательные компоненты в разные микросервисы.
- Упрощение развертывания – логика вспомогательных функций (например, логирования) переносится в отдельный контейнер, который можно легко обновлять и масштабировать.
Пример использования:
Допустим, микросервис генерирует логи. Вместо того, чтобы сам сервис отправлял их на централизованный сервер мониторинга, этим занимается sidecar-контейнер, который собирает логи и пересылает их в систему мониторинга (например, ELK, Prometheus, Fluentd). При этом основной сервис остается неизменным и не перегружен дополнительной логикой.
Шаблон «Издатель/Подписчик»
Паттерн «Издатель/Подписчик» используется для асинхронного обмена сообщениями между издателями и подписчиками.

Как работает паттерн:
- Издатели отправляют сообщения в определенную тему или поток событий.
- Подписчики слушают эту тему и обрабатывают сообщения по мере их поступления.
- Брокер сообщений (например, Kafka, RabbitMQ, NATS) управляет темами и обеспечивает доставку сообщений подписчикам.
Преимущества:
- Ослабленная связь между компонентами – издатели не знают о подписчиках, а подписчики – об издателях. Это облегчает масштабирование и замену компонентов.
- Поддержка потоковой обработки данных – можно обрабатывать события в режиме реального времени.
- Множественные подписчики – одно и то же событие может обрабатываться разными подписчиками для различных целей (например, логирование, аналитика, оповещения).
Пример использования:
В IoT-платформе датчики (издатели) отправляют данные (температура, влажность и т. д.) в систему. Аналитические сервисы (подписчики) получают эти данные и обрабатывают их в режиме реального времени, например, для построения графиков или выявления аномалий.
Шаблон «Выбор лидера»
В распределенных системах некоторые задачи (например, управление общими ресурсами или координация процессов) требуют единственного ведущего узла (лидера). Шаблон «Выбор лидера» гарантирует, что в каждый момент времени есть только один активный лидер.

Как работает паттерн:
- Узлы в системе участвуют в процессе выбора лидера с использованием алгоритмов консенсуса, таких как Raft или Paxos.
- Один узел становится лидером и берет на себя координационные задачи (например, управление записью в базу данных).
- Если лидер выходит из строя, запускается повторный процесс выборов, и новый узел становится лидером.
Преимущества:
- Предотвращает конфликты – гарантирует, что только один узел принимает важные решения.
- Упрощает координацию – централизованный контроль снижает сложность распределенного управления.
- Обеспечивает отказоустойчивость – система автоматически выбирает нового лидера при сбое текущего.
Пример использования:
В распределенной базе данных один из узлов становится лидером и отвечает за запись данных, чтобы обеспечить согласованность между репликами. Если этот узел выходит из строя, система автоматически выбирает нового лидера.
Шаблон источников событий
Паттерн источников событий предполагает, что изменения состояния не записываются напрямую, а фиксируются в виде неизменяемых событий. Система восстанавливает текущее состояние путем последовательного воспроизведения этих событий.

Как работает паттерн:
- Каждое изменение состояния представляется в виде события и добавляется в хранилище событий.
- Подписчики (например, модели запросов) читают эти события и используют их для построения представлений данных или аналитики.
- При необходимости восстановления система повторно проигрывает события, восстанавливая состояние на любой момент времени.
Преимущества:
- Полный журнал изменений – позволяет отследить всю историю изменений данных.
- Возможность восстановления – можно повторно проиграть события и восстановить систему, например, после сбоя.
- Упрощение CQRS – хранилище событий может питать модель запросов, упрощая разделение команд и запросов.
Пример использования:
В финансовом приложении каждое изменение счета (например, пополнение, списание) фиксируется как отдельное событие. Это гарантирует надежный аудит и возможность проверки всех транзакций для соблюдения нормативных требований и сверки балансов.
В заключение
Каждый из рассмотренных паттернов решает определенные проблемы, с которыми сталкиваются разработчики распределенных систем. Одни повышают отказоустойчивость, другие – улучшают масштабируемость или управляемость сервисов. Важно понимать принципы их работы и уметь применять в зависимости от конкретных задач. Комбинируя эти подходы, можно создавать системы, которые остаются надежными и эффективными даже в условиях высокой нагрузки и сложной инфраструктуры.
Какой из описанных паттернов вы уже применяли в своих проектах? Поделитесь опытом!