在单个 docker 容器中运行两个进程还是在连接到同一个数据库的两个容器中运行?
Posted
技术标签:
【中文标题】在单个 docker 容器中运行两个进程还是在连接到同一个数据库的两个容器中运行?【英文标题】:Run two processes in a single docker container or two containers connecting to the same DB? 【发布时间】:2017-03-25 04:19:48 【问题描述】:我需要开发一个应用程序来监听 kafka 主题并将数据保存到数据库 (cassandra)。这将是一个高密度的数据流,因此保存数据将耗费资源。保存数据后,将通过 REST API 对其进行查询和公开。
我看到了两个选项,但它们都有缺点:
选项 1 创建两个服务,每个服务都在一个单独的 docker 容器中。一个只在 python 中运行 kafka 侦听器进程,另一个是烧瓶 Web 服务器。优点:每个容器只运行一个进程缺点:两者都有服务连接到同一个数据库,根据微服务模式架构,这并不理想,因为服务没有完全解耦。
选项 2 在一个容器中同时运行 kafka 侦听器和 Web 服务。优点:只需一项服务即可连接到数据库。缺点:运行多个进程在单个 docker 容器中,其中一个(保存和更新)将比另一个更昂贵,因此它不会统一扩展。
还有其他不涉及迁移到单体架构的方法吗?或者其中哪一个是最佳实践?
【问题讨论】:
您应该在构建自己的解决方案之前查看 Kafka Connect。对我来说,如果 Kafka Connect 可以提供开箱即用的任何东西,这听起来很不错。 (无论如何它是 Apache Kafka 的一部分)。 【参考方案1】:选择选项 1。使用 Docker Compose 设置您的容器:
为您的 Kafka 消费者提供一项“服务”。 为您的 REST API 进程提供一个“服务”。 如果您想对数据库进行容器化,也可以为此添加一个 Cassandra 容器。使用 Docker Compose 将允许您通过一个命令将所有事情一起启动,您可以在容器之间建立依赖关系和链接(DNS 名称解析)、集中式日志记录等 - 它非常适合像您这样的情况。
分离容器将允许您扩展、控制应用程序的生命周期,并允许您单独启动/停止/更新每个应用程序。此外,您只需为每个容器运行一个进程,这是经过验证和推荐的最佳实践。它使控制容器和应用程序的生命周期变得更加容易,并且还使您的容器保持精简和易于管理。
示例:如果您的 Kafka 侦听器出现故障并且 REST API 继续运行,您会怎么做?要解决此问题,您必须重新启动整个容器(除非您想通过 SSH 进入容器并重新启动其中一个进程)。每个容器一个进程使这变得微不足道 - 您只需重新启动该容器。
两者都指向同一个数据库这一事实是无关紧要的 - 如果两个服务使用相同的数据,您将不得不忍受这一点。另一种方法是在两个数据库之间同步(一个是 Kafka 侦听器写入的,一个是 REST API 的)。这将增加更多的复杂性和开销。如果你做了一个干净的设计,你仍然可以在以后看到分离数据的价值时添加它——我一开始不会担心这一点。
【讨论】:
以上是关于在单个 docker 容器中运行两个进程还是在连接到同一个数据库的两个容器中运行?的主要内容,如果未能解决你的问题,请参考以下文章