基于docker的設計模式

一. 面向對象和設計模式

設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發(fā)人員所采用。使用設計模式的目的:為了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。設計模式是在面向對象技術出現以后,由工程師們總結出來的寶貴經驗。其中,最主要的23種設計模式,收錄在【Design Patterns: Elements of Reusable Object-Oriented Software】一書中

設計模式的細節(jié)可能不同,但是總體的設計思想和原則都遵循如下:
單一職責原則 (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的邊界職責和協作帶來了新的挑戰(zhàn)。這個問題和面向對象及其之上的設計模式要解決的問題十分類似。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的進程通訊即可

ambassador pattern

如上圖,代理container可以負責與外部的分布式存儲連接提供容錯,負載均衡等功能。該container可以被復用

  • Adapter pattern


    Adapter pattern

    如上圖,adapter container 適配了不同的主container和統一的監(jiān)控框架之間的信息差異。同樣,adapter container 也可以方便的復用

3. multi-node patterns for distributed algorithms

  • leader election pattern
    原來的選主操作需要application集成lib來實現,如:集成raft協議的lib來實現。另一個更好的選擇是使用一組帶leader election 功能的“保姆container”來實現。application需要區(qū)分主從的時候,依賴本pod的“保姆container”狀態(tài)來區(qū)分。帶leader election的container可以復用

  • work queue pattern
    使用docker 靈活的啟動消費Worker container來處理Queue中的Job
    一個真實Use Case:視頻處理, 1pod分析處理1個mp4視頻文件,并且使用gpu硬件加速

work queue pattern

灰色的worker container中基礎框架部分,可以重用
kubernetes 原生支持此workload類型:Job

  • scatter/gather pattern
    這種模式在搜索引擎中十分常見。整體后端服務,是一個樹形的結構。根節(jié)點接收/分發(fā)query給不同的庫,之后,整合,rank不同庫的返回結果,返回給用戶
scatter/gather pattern

如上圖,灰色的container完成了并發(fā)的分發(fā),和整合數據的復雜操作,可以復用。用戶自定義的邏輯container可以方便的在之上做進一步操作處理

綜合上述的3種設計模式。個人覺得,基于docker的設計模式有如下的優(yōu)點
1)更好地拆分服務(模塊,containers)給不同的team,支持各種語言,提高研發(fā)效率。微服務架構也是類似
2)更高級別的復用模塊,如:一個container整體通過配置,可以很方便地添加到一套新的分布式系統中去,想拼積木一樣,靈活插拔

四. 參考

  1. 【Design patterns for container-based distributed systems】
  2. 【Kubernetes Production Patterns and Anti-Patterns】
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發(fā)人員所采用。設計模式是軟...
    Chars閱讀 710評論 2 5
  • 設計模式(使代碼編制真正的工程化) 設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分...
    賽亞人之神閱讀 173評論 0 0
  • 設計模式是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更...
    4ea0af17fd67閱讀 729評論 0 3
  • 我們的生活里,總是有人作弊。 排隊有人插隊,辦事有人行賄,就連玩兒個游戲,都有人開外掛寫腳本。 對于那些代碼仔程序...
    福釀閱讀 470評論 0 0
  • 漫長的黑暗像深淵下沉寂的死水,似乎要吞沒了她。 她驚恐地奮力扇動翅膀,向著刺破黑暗的那一星光點飛去。 靠近一點,再...
    三水林楓閱讀 543評論 1 2

友情鏈接更多精彩內容