在一个Docker容器中运行两个进程,或者两个容器连接到同一个数据库?

我需要开发一个应用程序来监听一个kafka主题并将数据保存到一个数据库(cassandra)中。 这将是一个高密度的数据stream,所以保存数据将是资源昂贵。 数据保存后,将通过REST API进行查询和公开。

我看到两个选项,但是它们都有缺点:

选项1
创build两个服务,每个服务在一个单独的泊坞窗容器中。 一个只能运行python中的kafka监听器进程,另一个运行烧瓶web服务器。
优点 :每个容器只运行一个进程
缺点 :两种服务都连接到相同的数据库,根据微服务模式架构,这并不理想,因为服务并没有完全分离。

选项2
在一个容器中同时运行kafka监听器和Web服务。
优点 :只需一个服务即可连接到数据库。
缺点 :在一个docker集装箱中运行多个进程,其中一个(保存和更新)会比另一个更昂贵,所以不能一致地扩展。

还有另外一个不涉及到单一体系结构的方法吗? 或者哪一个是最佳实践?

去select1.使用Docker撰写设置您的容器:

  • 为您的卡夫卡消费者提供一项“服务”。
  • 一个“服务”为您的REST API过程。
  • 如果你想装箱你的数据库,也可以为它添加一个Cassandra容器。

使用Docker Compose将允许您使用一个命令将事物联系在一起,您可以在容器之间build立依赖关系和链接(DNS名称parsing),集中式日志logging等等,这对于像您这样的情况非常理想。

分离容器将允许您扩展,控制应用程序的生命周期,并允许您单独启动/停止/更新每个应用程序。 另外,您只需要为每个容器运行一个进程,这是经过validation并推荐的最佳实践。 它使控制容器和应用程序的生命周期变得更容易,同时也使您的容器更加精简,更易于pipe理。

示例:如果您的Kafka侦听器closures,并且REST API继续运行,您会怎么做? 要解决这个问题,你必须重新启动整个容器(除非你想SSH进入容器并重新启动其中一个进程)。 每个容器一个进程使这个微不足道 – 你重新启动容器。

两者都指向同一个数据库的事实是无关紧要的 – 只有在两个服务使用相同数据的情况下,您才需要这样做。 另一种方法是在两个数据库之间进行同步(一个是Kafka监听器写的,另一个是REST API)。 这会增加更多的复杂性和开销。 如果你做了一个干净的devise,如果你看到一个分离数据的价值,那么你以后还可以添加它 – 我最初不会担心。