在单个 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 容器中运行两个进程还是在连接到同一个数据库的两个容器中运行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要构建多容器 docker 应用程序?

我们可以在多台机器(主机)上运行单个容器吗?

Docker 容器和 Node.js 集群

Docker 容器后台运行和前台运行的区别

如何在搬运工中将两个 docker 容器相互连接

是否可以在 docker 容器之间共享内存?