2016-11-11 1 views
3

Мне нужно разработать приложение, которое прослушивает тему kafka и сохраняет данные в DB (cassandra). Это будет поток данных с высокой плотностью, поэтому сохранение данных будет дорогостоящим ресурсом. После сохранения данных он будет запрашиваться и отображаться через REST API.Запустить два процесса в одном контейнере докера или два контейнера, подключающихся к одному и тому же БД?

Я вижу два варианта, но оба из них имеют недостатки:

Вариант 1
Создание двух услуг, каждый из них в отдельном контейнере Докер. Один из них будет запускать только процесс прослушивания кафки на питоне, а другой - на флеш-сервере.
Преимущества: Каждый контейнер работает только один процесс
МИНУСЫ: Обе услуги подключения к одной и той же БД, что не является идеальным в соответствии с архитектурой microservices картины, за услуги не полностью развязаны.

Вариант 2
Run как Кафка слушателем и веб-службы в одном контейнере.
Преимущества: Только одна услуга для подключения к БД.
Недостатки: более одного процесса, работающего в одном контейнере докеров, и один из них (сохранение и обновление) будет намного дороже, чем другой, поэтому он не будет масштабироваться равномерно.

Есть ли еще один способ пойти, который не предполагает переход к монолитной архитектуре? Или какой из них - лучшая практика?

+0

Перед созданием собственного решения вы должны проверить Kafka Connect. Для меня это звучит, если Kafka Connect предоставит все, что вам нужно из коробки. (И это часть Apache Kafka). –

ответ

1

Go с опцией 1. Используйте Docker Compose для настройки ваших контейнеров:

  • One "сервис" для Кафки потребителя.
  • Один «сервис» для вашего процесса API REST.
  • Если вы хотите контейнеризировать свою базу данных, добавьте к ней контейнер Cassandra.

Использование Docker Compose позволят раскрутить вещи вместе с одной командой, вы можете иметь зависимости и связей (DNS разрешения имен) между контейнерами, централизованной регистрацией и т.д. - он идеально подходит для случаев, как ваши.

Разделение контейнеров позволит вам масштабировать, контролировать жизненный цикл ваших приложений, и это позволит вам запускать/останавливать/обновлять каждое приложение индивидуально. Кроме того, вам нужно всего лишь запустить один процесс на один контейнер, который является проверенной и рекомендуемой передовой практикой. Это упрощает управление жизненным циклом контейнера и приложения, а также помогает вашему контейнеру быть более легким и простым в управлении.

Пример: Что вы будете делать, если ваш слушатель Kafka опустится, и REST API продолжает работать? Чтобы исправить это, вы должны перезапустить весь контейнер (если вы не хотите, чтобы SSH в контейнер и перезапустить один из процессов). Один процесс на контейнер делает это тривиальным - вы перезапускаете именно этот контейнер.

Тот факт, что оба указывают на одну и ту же базу данных, не имеет значения - это просто то, с чем вам придется жить, если обе службы используют одни и те же данные.Альтернативой будет синхронизация между двумя базами данных (одна из которых записывает слушатель Kafka, а другая - для REST API). Это добавит сложности и накладных расходов. Если вы делаете чистый дизайн, вы можете добавить это позже, если увидите значение при разделении данных - я бы не стал беспокоиться об этом изначально.

Смежные вопросы