一. 面向對象和設計模式
設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發人員所采用。使用設計模式的目的:為了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。設計模式是在面向對象技術出現以后,由工程師們總結出來的寶貴經驗。其中,最主要的23種設計模式,收錄在【Design Patterns: Elements of Reusable Object-Oriented Software】一書中
設計模式的細節可能不同,但是總體的設計思想和原則都遵循如下:
單一職責原則 (Single Responsiblity Principle SRP)
開閉原則(Open Closed Principle,OCP)
里氏代換原則(Liskov Substitution Principle,LSP)
依賴倒轉原則(Dependency Inversion Principle,DIP)
接口隔離原則(Interface Segregation Principle,ISP)
合成/聚合復用原則(Composite/Aggregate Reuse Principle,CARP)
最小知識原則(Principle of Least Knowledge,PLK,也叫迪米特法則)
二. 引入docker技術帶來的新變化
隨著docker技術和微服務的日趨成熟。怎樣合理的設計container的邊界職責和協作帶來了新的挑戰。這個問題和面向對象及其之上的設計模式要解決的問題十分類似。container 相當于object,image相當于Class定義
三. 3種抽象設計模式
1. single-container patterns for container management
- container本身提供了類似Object一樣的封閉性
container暴露的interface相當于類暴露的public方法
例如,container的資源使用情況,健康情況,等等
container生命周期的hooks,比如:created,started,before termination等等
container的可復制性-replica:類似拷貝構造函數
2. single-node patterns of closely cooperating containers
-
sidecar pattern
在主要工作的container之外,掛載一個"保姆container"。二者一起提供某種服務。kubernetes中的pod實現了類似的思想。其中"保姆container"可以被復用。
sidecar pattern
上圖中的"保姆container"提供了日志收集的功能,職責分離,可以分別單獨測試,可以被復用
這樣設計的另一個好處是:可以分開升級,不相互影響。"保姆container"可以關閉,降級服務 ambassador pattern
代理模式。一個額外的代理container負責與外部的分布式服務通訊,簡化、屏蔽了外部系統的復雜性。主container只需要假設和localhost的進程通訊即可
如上圖,代理container可以負責與外部的分布式存儲連接提供容錯,負載均衡等功能。該container可以被復用
-
Adapter pattern
Adapter pattern
如上圖,adapter container 適配了不同的主container和統一的監控框架之間的信息差異。同樣,adapter container 也可以方便的復用
3. multi-node patterns for distributed algorithms
leader election pattern
原來的選主操作需要application集成lib來實現,如:集成raft協議的lib來實現。另一個更好的選擇是使用一組帶leader election 功能的“保姆container”來實現。application需要區分主從的時候,依賴本pod的“保姆container”狀態來區分。帶leader election的container可以復用work queue pattern
使用docker 靈活的啟動消費Worker container來處理Queue中的Job
一個真實Use Case:視頻處理, 1pod分析處理1個mp4視頻文件,并且使用gpu硬件加速
灰色的worker container中基礎框架部分,可以重用
kubernetes 原生支持此workload類型:Job
- scatter/gather pattern
這種模式在搜索引擎中十分常見。整體后端服務,是一個樹形的結構。根節點接收/分發query給不同的庫,之后,整合,rank不同庫的返回結果,返回給用戶
如上圖,灰色的container完成了并發的分發,和整合數據的復雜操作,可以復用。用戶自定義的邏輯container可以方便的在之上做進一步操作處理
綜合上述的3種設計模式。個人覺得,基于docker的設計模式有如下的優點
1)更好地拆分服務(模塊,containers)給不同的team,支持各種語言,提高研發效率。微服務架構也是類似
2)更高級別的復用模塊,如:一個container整體通過配置,可以很方便地添加到一套新的分布式系統中去,想拼積木一樣,靈活插拔