в надежде получить помощь по какому-то общему архитектурному вопросу.
У меня есть веб-приложение Flask (назовем его приложением для людей), которое работает в контейнере Docker. Он развернут в Amazon ECS и работает нормально. people-app предоставляет HTTP API, в котором авторизованные пользователи могут взаимодействовать с помощью токена, а также некоторые традиционные страницы веб-приложений.
Что я хотел бы сделать, так это реализовать группу потребителей Kafka, которая предназначалась для потребления из темы, связанной с приложением Flask (т.е. темы людей), и при потреблении взаимодействовать с приложением Flask (возможно, создавая экземпляры модели и сохраняя их к базе данных, аналогично тому, как HTTP API будет обрабатывать HTTP-запрос). Я нигде не смог найти примеров реализации, особенно на питоне, но я бы сказал, что пытаюсь добиться чего-то похожего на фреймворк событий от Криса Ричардсона.
Я думаю, мой вопрос сводится к; Как бы я реализовал что-то подобное? Если Kafka Consumers работают в непрерывном цикле, я предполагаю, что они должны запускаться в своем собственном, отдельном процессе. Похоже, это создает проблемы с Docker, поскольку запуск нескольких процессов в контейнере фактически лишает контейнер возможности эффективно взаимодействовать с приложениями.
Должен ли я запускать отдельные контейнеры? Если да, то как эти два контейнера будут взаимодействовать? Я что-то пропустил? Я здесь совершенно не на том пути?
Любая помощь будет принята с благодарностью, даже если это что-то маленькое, чтобы направить меня на правильный путь. Заранее спасибо.
Я бы предложил использовать отдельные контейнеры для вашего приложения flask и приложения kafka. Это соответствует принципу единой ответственности при проектировании хорошего программного обеспечения.
Вам не нужно изучать java, вы можете программировать на python, перейдите по ссылке ниже https://towardsdatascience.com/kafka-python-explained-in-10-lines-of-code-800e3e07dad1
Вы можете проверить документы AWS для контейнерной сети в ECS. https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html[2]
Пожалуйста, ознакомьтесь с этой статьей о том, как создать несколько задач или услуг. Вы можете использовать сеть awsvpc
или bridge
. В режиме awsvpc
каждый из ваших контейнеров будет иметь собственный частный IP-адрес и может прикреплять группу безопасности. С сетью bridge
вы можете сопоставить порт контейнера с хостом, и контейнеры могут получать доступ друг к другу через локальный хост: порт.
https://www.freecodecamp.org/news/amazon-ecs-terms-and-architecture-807d8c4960fd/https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html
Вы также можете проверить AWS Farget для среды выполнения вашего контейнера.
Привет Радждип, спасибо, что нашли время ответить. Что касается написания Java, я упоминал об этом только в том смысле, что он относится к Eventuate Framework, в том смысле, что я не могу «просто использовать eventuate». Я понимаю, что это заявление было ненужным, и я его отредактирую. Мое мнение о том, что и потребитель, и фляжное приложение находятся в одном контейнере, заключалось в том, что, поскольку они находятся в одном домене, они разделяют эту «единую ответственность». Тем не менее, имеет больше смысла, что запуск фляги или потребительского приложения является «единственной ответственностью» контейнера. Еще раз спасибо за ваше понимание