0 6.3K ru

Sidecar паттерн

Разделение функций приложения в отдельный процесс можно рассматривать как шаблон Sidecar. Шаблон Sidecar позволяет добавить ряд возможностей в ваше приложение без дополнительного кода конфигурации для сторонних компонентов.

Проблема и контекст

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

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

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

Решение

Разместите набор задач вместе с основным приложением внутри их собственного процесса или контейнера, предоставляя однородный интерфейс для служб на платформе для разных языков (Sidecar pattern).

sidecar pattern

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

moto caw

Преимущества использования sidecar:

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

Паттерн Sidecar часто используется с контейнерами и называется "sidecar container" или "sidekick container".

Проблемы и вопросы при реализации

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

Когда следует использовать этот шаблон

Используйте этот шаблон, когда:

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

Не используйте этот шаблон, когда:

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

Источник: https://docs.microsoft.com/en-us/azure/architecture/patterns/sidecar

Comments:

Please log in to be able add comments.