在一个docker容器中运行两个进程,还是在连接到同一个db的两个容器中运行?

laawzig2  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(450)

我需要开发一个应用程序,听Kafka主题,并保存数据到数据库(Cassandra)。这将是一个高密度的数据流,因此保存数据将是一个资源昂贵的问题。数据保存后,将通过restapi进行查询和公开。
我看到两种选择,但都有缺点:
方案1
创建两个服务,每个服务位于单独的docker容器中。一个只运行python中的kafka侦听器进程,另一个运行flask web服务器。
优点:每个容器只运行一个进程
缺点:两个服务都连接到同一个数据库,根据microservices模式体系结构,这并不理想,因为服务没有完全解耦。
方案2
在一个容器中同时运行kafka侦听器和web服务。
优点:只需一个服务即可连接到数据库。
缺点:在一个docker容器中运行多个进程,其中一个进程(保存和更新)的资源开销要比另一个大得多,因此无法统一扩展。
有没有另外一种方法不涉及到整体架构?或者哪一个是最佳实践?

a5g8bdjr

a5g8bdjr1#

选择选项1。使用docker compose设置容器:
为您的Kafka消费者提供一项“服务”。
为您的restapi进程提供一个“服务”。
如果您想将您的数据库容器化,也可以为此添加一个cassandra容器。
使用docker compose将允许您通过一个命令来加速工作,您可以在容器、集中式日志记录等之间拥有依赖关系和链接(dns名称解析)-这是类似您的情况的理想选择。
分离容器将允许您扩展、控制应用程序的生命周期,并允许您单独启动/停止/更新每个应用程序。另外,您只需要为每个容器运行一个进程,这是一个经过验证和推荐的最佳实践。它使控制容器和应用程序的生命周期变得更容易,而且还使容器保持精简和更易于管理。
示例:如果你的kafka监听器坏了,restapi继续运行,你该怎么办?要解决这个问题,您必须重新启动整个容器(除非您希望ssh到容器中并重新启动其中一个进程)。每个容器只有一个进程,这很简单—只需重新启动该容器即可。
两个服务都指向同一个数据库这一事实无关紧要——如果两个服务都使用相同的数据,那么您就不得不接受这一点。另一种方法是在两个数据库之间进行同步(一个是kafka侦听器写入的,另一个是restapi)。这将增加更多的复杂性和开销。如果你做了一个干净的设计,你仍然可以在以后添加,如果你看到一个值在分离数据-我不会担心一开始。

相关问题