簡體   English   中英

在一個docker容器中運行兩個進程或連接到同一個DB的兩個容器?

[英]Run two processes in a single docker container or two containers connecting to the same DB?

我需要開發一個應用程序來監聽kafka主題並將數據保存到數據庫(cassandra)。 它將是一個高密度的數據流,因此保存數據將耗費資源。 保存數據后,將通過REST API查詢和公開數據。

我看到兩個選項,但它們都有缺點:

選項1
創建兩個服務,每個服務在一個單獨的docker容器中。 一個只在python中運行kafka監聽器進程,另一個在燒瓶Web服務器中運行。
優點 :每個容器只運行一個進程
缺點 :兩種服務都連接到同一個數據庫,根據微服務模式架構,這種服務並不理想,因為服務並沒有完全解耦。

選項2
在一個容器中運行kafka偵聽器和Web服務。
優點 :只需一個服務即可連接到數據庫。
缺點 :在一個docker容器中運行多個進程,其中一個(保存和更新)將比另一個更昂貴,因此它不會統一擴展。

還有另一種方法可以不涉及轉向單片架構嗎? 或者哪一個是最佳做法?

使用選項1.使用Docker Compose設置容器:

  • 為您的Kafka消費者提供的一項“服務”。
  • REST API流程的一個“服務”。
  • 如果要對數據庫進行容器化,請為此添加Cassandra容器。

使用Docker Compose將允許您使用一個命令將事物一起旋轉,您可以在容器之間具有依賴關系和鏈接(DNS名稱解析),集中式日志記錄等等 - 它非常適合像您這樣的情況。

分離容器將允許您擴展,控制應用程序的生命周期,並允許您單獨啟動/停止/更新每個應用程序。 此外,您只需要為每個容器運行一個進程,這是經過驗證和建議的最佳實踐。 它可以更輕松地控制容器和應用程序的生命周期,同時還可以使您的容器更精簡,更易於管理。

示例:如果您的Kafka偵聽器出現故障並且REST API繼續運行,您會怎么做? 要解決此問題,您必須重新啟動整個容器(除非您想要SSH進入容器並重新啟動其中一個進程)。 每個容器一個進程使這一點變得微不足道 - 您只重新啟動該容器。

兩者都指向同一個數據庫的事實是無關緊要的 - 如果兩個服務使用相同的數據,那么這就是你必須要忍受的事情。 另一種方法是在兩個數據庫之間進行同步(一個是Kafka監聽器寫入的,另一個是REST API)。 這會增加更多的復雜性和開銷。 如果你做了一個干凈的設計,如果你看到分離數據的值,你仍然可以稍后添加 - 我最初不會擔心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM