前言
轉眼間工作已經有了一年半,工作之後所做的事情與預想中的還是有較大的差距的。回想一年多以來,大多數的時間都在處理業務邏輯或是重構已有的代碼,在前人的基礎上修修改改,真正的技術進步并不是很大。
做程式員這一行,還是要經常檢討,時常學習的。在工作時間之外盡可能去了解一些工作接觸不到的知識面。在工作的第一年,讀了一些C++程式員的基礎書籍,今年準備讀一些更高層次的東西,比如架構,設計等,擴充一下視野。
本篇博文記錄一些筆者在閱讀《分布式服務架構原理與實踐》過程中一些比較經典的圖示或語句。
正文
1.應用架構的演進
- MVC架構:讀書時候做的大多數項目都是MVC架構,适用于業務規模小的場景。所有功能部署在同一個程序中,通過雙機或者前置硬體負載均衡器來實作負載均衡。用于分離前背景邏輯是MVC架構的關鍵
- RPC架構 :将核心業務和公共服務抽離供上層使用。用于提高業務複用和拆分是RPC架構的關鍵
- SOA架構 :面向服務的架構,多用于企業内部,重用已有的不同的異構元件。
- 微服務架構 :便于靈活開發、持續傳遞。将服務原子化,各個微服務獨自打包部署和更新,降低開發和運維成本
2.通信架構
1、關鍵技術點
- 長連接配接和短連接配接:長連接配接更節省資源
- 同步IO和異步IO:同步IO調用簡單,異步IO性能高
2、可靠性設計
- 鍊路有效性檢測:保持心跳,單向心跳雙向心跳都行
- 斷線重連:斷線之後過段時間再重連
- 消息緩存
- 資源優雅釋放
3.序列化
序列化就是将對象序列化為位元組流用于不同程序之間的通信。常見的序列化技術有谷歌的protobuf和facebook的thift,谷歌的性能更優。分布式架構應該支援擴充性,可擴充多種序列化方式。
4.協定棧
- 可靠性設計
- 用戶端連接配接逾時
- 用戶端斷線重連
- 用戶端重複握手保護
- 消息緩存重發,對方當機恢複之後将當機期間發送失敗的消息重新發送
- 心跳機制
- 協定的相容性和可擴充性
5.服務路由
1.透明化路由
- 基于服務注冊中心的訂閱釋出
-
消費者緩存服務提供者位址:即使服務注冊中心當機也不會影響消費者與生産者之間的通信
2.負載均衡
- 随機
- 輪詢
- 服務調用時延
- 一緻性哈希
- 粘紙連接配接
2.路由規則
總的來說路由規則配置要足夠靈活,支援多種配置方式,實時生效,部分生效等。
6.叢集容錯
- 叢集容錯的場景
- 通信鍊路故障
- 服務端逾時
- 服務端調用失敗
- 容錯政策
- 失敗自動切換
- 失敗通知:通知上層調用者,由上層處理
- 失敗緩存:緩存請求,等鍊路正常後再發送
- 快速失敗:直接忽略異常,記錄日志
- 容錯政策擴充:支援可擴充,采用其他手段根據不同條件不同處理
7.其他
- 基于注冊中心的訂閱釋出
-
分布式事務設計
兩階段送出采用的是悲觀鎖政策,需要等待最慢的參與者,一旦協調者故障則整個事務就會阻塞。在分布式架構中,事務是一件很麻煩的事情。應盡量在業務層避免使用分布式事務。在大多數的業務場景中,我們可以使用最終一緻性替代傳統的強一緻性。