Sidecar 模式

Sidecar 是一種日軍在二戰期間廣泛使用的偏三輪摩托,由於它比兩輪摩托多一輪,且多出的一輪在其中一側,不影響另一側的結構,因此得名 Side-Car。

由於 sidecar 這個詞過於形象,後來被廣泛使用,比如支撐 iPad 作爲 MacBook 副屏的系統叫 Sidecar System。

在容器編排領域,k8s pod 被設計成編排的最小單位,但每個 pod 裏可以安排多個 container,主 container 提供核心業務邏輯,其他 container 提供配置初始化、請求 proxy、日誌等輔助功能,這種使用模式也被稱爲 sidecar 模式。

由於 pod 內的 container 共享一個 ip,通過 localhost 通信,雖然比不上 unix socket 和 mmap 內存共享,不過也很少存在容器間網絡通信的性能問題。

下面我們聊一聊 sidecar 模式的產生背景、實現細節和應用場景。

產生背景

應用和服務的正常運行通常需要執行一些通用的任務,比如監控、日誌、配置更新、服務發現等。這些外圍任務可以通過獨立的組件或服務來實現。如果把這些任務集成到服務中,和主幹邏輯運行在同一個進程的不同線程中,可以充分使用資源。不過副作用是這些外圍邏輯和主幹邏輯沒有被充分隔離開,其中任何一個組件出現問題都會影響其他組件,甚至導致整個應用的崩潰。另外一個問題是,編寫外圍組件用的語言需要和主幹邏輯保持一致,最終,外圍組件和主幹邏輯的相互依賴會越來越嚴重。

如果把一個應用解耦成不同的服務,每個服務都可以使用不同的編程語言實現。這樣的靈活性會大大增強,不過由於每個服務都會有自己的依賴,需要特定編程語言的庫來訪問底層的共享資源和數據,整體運維成本上升。由於每個任務都是獨立的服務,應用內服務通信的延遲會變高。

解決方案

針對上面的場景,我們可以把外圍任務與主幹邏輯部署在一起(一個 pod 裏),但每個任務擁有自己的進程或容器,爲不同語言編寫的業務服務提供同質化的接口。

Sidecar 服務可以不是應用的組成部分,但必須能夠與應用高效地通信。應用部署在哪裏,Sidecar 服務就部署在哪裏。Sidecar 服務與主應用的服務同時部署。因此,Sidecar 服務的生命週期與主應用保持一致。對於每個主應用的實例,都有一個 sidecar 實例與之部署在一起,運行在一起。

Sidecar 模式的優點有:

  1. Sidcar 有自己的編程語言和運行時環境,與主應用分離,所以不需要給每個編程語言都開發一套;

  2. Sidecar 與主應用有同樣的數據訪問權限。比如 sidecar 可以監控系統資源的使用情況,不管對象是 sidecar 服務本身,還是主應用;

  3. 由於在物理上很近,Sidecar 和主應用的通信延遲非常小;

  4. 即便主應用不提供擴展能力,也可以通過 sidecar 對其進行擴展;

存在問題和注意事項

  1. 需要考慮服務的部署和打包格式,最合適的場景是打包成容器;

  2. 設計 sidecar 服務時,尤其要考慮進程間通信的機制。不要使用依賴於特定語言或框架的技術,除非性能無法滿足要求;

  3. 在把功能塞到 sidecar 裏之前,先想想放到獨立的服務或傳統的後臺進程裏是否更合適;

  4. 優先考慮使用一個庫或插件機制去實現,基於特定語言的庫通常與系統集成度更高,也沒有網絡延遲;

應用場景

適用場景有:

  1. 主應用是由多個的語言和框架編寫而成,sidecar 裏的組件需要和不同語言不同框架編寫的服務配合使用;

  2. 組件是由另一個團隊或組織提供的;

  3. 組件必須和主應用部署在同一臺機器上;

  4. 需要一個服務能夠感知主應用的整個生命週期,且能夠獨立進行更新;

  5. 我們需要監控系統對內存的使用情況;

不適用場景有:

  1. 進程間的通信延遲成爲了系統瓶頸,需要進行優化;

  2. 應用程序比較簡單,應用 sidecar 耗費的資源已經超出了隔離帶來的收益;

  3. 服務需要獨立與主應用進行更新,這種情況更適合部署獨立的服務;

一些例子

  1. 基礎架構服務 API,比如日誌、環境數據、配置數據、服務發現、health check、watchdog 服務燈。sidecar 也可以監控主應用的宿主機情況和進程運行情況,記錄到一箇中心化的服務;

  2. 管理 NGINX/HAProxy。把 NGINX 和 sidecar 部署到一塊,sidecar 可以監控環境狀態的變化、更新 NGINX 配置文件、必要時重啓進程;

  3. 充當大使 sidecar。部署一個大使服務作爲 sidecar,主應用通過大使服務調用其他服務。大使服務提供的功能有請求日誌記錄、路由、熔斷器、和其他網絡相關的功能;

  4. 充當降負載的代理。把 NGINX 放到 nodejs 服務的前面,提供靜態文件的加載;

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Q-YvkWhFC2uK1z5AKEKSnw