我需要开发一个应用程序来监听kafka主题并将数据保存到数据库(cassandra)。它将是一个高密度的数据流,因此保存数据将耗费资源。保存数据后,将通过REST API查询和公开数据。
我看到两个选项,但它们都有缺点:
选项1
创建两个服务,每个服务在一个单独的docker容器中。一个人只在python中运行kafka监听器进程,另一个在烧瓶Web服务器上运行
优点:每个容器只运行一个进程
下行:两种服务都连接到同一个数据库,根据微服务模式架构,这是不理想的,因为服务并没有完全解耦。
选项2
在一个容器中运行kafka监听器和Web服务
优点:只需一个服务即可连接到数据库
下行:在一个docker容器中运行多个进程,其中一个(保存和更新)将比另一个更昂贵,因此它不会统一扩展。
还有另一种方法可以转移到单片架构吗?或者哪一个是最佳做法?
答案 0 :(得分:1)
使用选项1.使用Docker Compose设置容器:
使用Docker Compose将允许您使用一个命令将事物一起旋转,您可以在容器之间具有依赖关系和链接(DNS名称解析),集中记录等等 - 它非常适合像您这样的情况。
分隔容器将允许您缩放,控制应用程序的生命周期,并允许您单独启动/停止/更新每个应用程序。此外,您只需要为每个容器运行一个进程,这是经过验证和建议的最佳实践。它可以更轻松地控制容器和应用程序的生命周期,同时还可以使您的容器更精简,更易于管理。
示例:如果您的Kafka侦听器出现故障并且REST API继续运行,您会怎么做?要解决此问题,您必须重新启动整个容器(除非您想要SSH进入容器并重新启动其中一个进程)。每个容器一个进程使这一点变得微不足道 - 您只需重新启动该容器。
两者都指向同一个数据库的事实是无关紧要的 - 如果两个服务使用相同的数据,那么这就是你必须要忍受的事情。另一种方法是在两个数据库之间进行同步(一个是Kafka监听器写入的,另一个是REST API)。这会增加更多的复杂性和开销。如果你做一个干净的设计,如果你看到分离数据的价值,你仍然可以稍后添加 - 我最初不会担心这个。