1. 程式人生 > >分布式系統實戰

分布式系統實戰

分布式

導言:記得在自己大學畢業的2006年到之後近五年的工作裏,源於工作經歷和有限的視野,幾乎對“分布式系統”沒有任何概念。當然,彼時的互聯網/移動互聯網還未對我們的生活呈覆蓋顛覆之勢,很多網絡應用采用傳統的集中式服務便可應對。但是隨著互聯網大潮的風起雲湧,出現了越來越多的細分大流量網站及應用,網民體量也如滾落雪球一般越來越大,這種情況下分布式的概念幾乎在技術圈“家喻戶曉”,也成了我們追逐的另一顆時代“銀彈”。我也不例外,但是只是因為身處於某幾乎無互聯網氛圍的二線城市和保守封閉的技術氛圍中,所以對分布式系統的理解、掌握只能是自己一個人一步步學習、實踐而來,但是反過來也有了很多踏實的實踐體會。




剛才提到分布式系統產生的背景之一就是有了很多大型網站、應用。

  • 這些系統的特點是:高並發、大流量;高可用;海量數據;用戶分布廣泛,網絡情況復雜,安全環境惡劣;需求快速變更,叠代式發展,發布頻繁。

  • 這些系統的核心架構要素:性能、可用性、伸縮性、擴展性和安全性。

來看看分布式系統的特點:

  • 異構性:使得用戶能在大量異構計算機和網絡上訪問服務和運行應用程序,比如允許硬件、操作系統、編程語言、開發者等的多樣性和差別。

  • 開放性(擴展性):使系統能以不同的方式被擴展和實現,比如通過發布系統的關鍵接口、基於一致的通信機制和網絡協議擴展其他應用。

  • 可伸縮性:在不同的用戶規模下通過對資源的調節依然能有效且高效的運轉,比如通過縱向的伸縮來加強硬件、通過橫向的伸縮來增加服務器等。

  • 並發性:保持用戶對共享資源操作的正確性,比如CAP理論中的C(一致性)的要求。

  • 高可用性:通過性能優化、安全性、故障處理提高可用性,比如采用高性能的編程模型,安全的隔離和過濾機制,自動化故障檢測、容錯、故障修復、冗余等。

分布式系統的優勢:

  • 降低不同模塊開發團隊間的協同成本,業務響應更迅捷。

  • 大大降低系統間的耦合度以及整體復雜度,各個開發團隊可專註於各自的業務模塊。

  • 避免了個別模塊的錯誤給整體帶來的影響。

  • 業務可拆分、可擴展後解放了對單服務資源的依賴。

  • 做到針對性的業務能力擴容,減少不必要的資源浪費。

可見分布式系統為大型網站應用在技術和組織層面都提供了良好的解決和支撐。


分布式系統相關的理論:

  • CAP理論:一個分布式系統最多只能同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance 指分布式系統在遇到某節點或網絡分區故障的時候,仍然能夠對外提供滿足一致性和可用性的服務)。

  • BASE理論:是指基本可用(Basically Avalilable)、柔性狀態(Soft State)、最終一致性(Eventual Consistency)。BASE是對CAP理論的延伸,核心思想是即使無法做到強一致性,但應用可以采用適合的方式達到最終一致性。


另外,現在經常有人問起分布式架構理念與之前我們經常說的SOA(面向服務的架構)和現在頗為流行的微服務架構孰優孰劣。我個人認為問優劣是不合理的,首先分布式構架理念在兩者中都有體現和應用。而對於作為對比的SOA和微服務,這二者在彼此適配的場景下都可以殊途同歸的解決問題,都是好的架構理念。但是確實是也有區別和聯系:

SOA的主要特性:

  • 面向服務的分布式計算

  • 服務間松散耦合

  • 支持服務的組裝

  • 服務註冊和自動發現

  • 以服務契約方式定義服務交互方式

微服務架構的典型特征:

  • 分布式服務組成的系統

  • 按照業務而不是按照技術來劃分組織

  • 做有生命的產品而不是項目

  • 智能化服務端點與傻瓜式服務編排

  • 自動化運維

  • 系統容錯

  • 服務快速演化




上面主要講了對分布式系統的概念認識,很多是對書籍和學習的總結。但是做到真正的理解就必須有實戰,拿其中一個自己親自架構編碼的即時聊天系統的後臺架構為例,此架構思路目前已經切換了多個其他應用服務並且支撐著數百萬的用戶。其實對於此架構的分布式應用,自己並不是在熟知分布式理論的前提下設計的,而是基於其他理念模型和在具體的業務實踐、組織協作過程中演化而來的。比如分層的架構設計,之前由於主要做網絡安全和網絡編程工作,TCP/IP協議棧的分層設計深深影響了自己

技術分享圖片

把網絡層、業務邏輯層、數據層分離,網絡層支持負載均衡,業務層支持動態擴展,數據層支持分布式存儲,各層均支持分布式部署;以下是架構細化圖

技術分享圖片

  • 對不同功能的模塊進行進程級的分離,用TCP來進行通訊。這是受“《UNIX編程藝術》第7章——多道程序設計:分離進程為獨立的功能“的理念影響,是不是和微服務的理念很像,而且基於TCP通信的方式利於進行分布式部署。Unix最具特點的程序模塊化技法就是將大型程序分解成多個協作進程,並專註於考慮這些子進程間的接口和通訊方式;

  • 通用技術模塊和業務應用模塊分離,比如網關服務、上線服務實現網絡接入和協議轉發功能不承載業務邏輯,由具體的應用進程處理業務。網關服務就類似於Nginx,用戶的請求首先會通過前端接入層(Nginx)分發到後端的應用集群上,另外通過在網關上實現的安全過濾(比如域名IP類、協議秘鑰、黑名單)實現接入層限流、安全的主要工作。

  • 無狀態的設計,將狀態、消息、業務數據類信息分離出業務進程,利用分布式緩存(如redis),數據庫(關系型數據庫MySQL、非關系型數據庫MongoDB)存儲進行調用。這樣業務進程利於分布式部署,數據服務也支持分布式存儲。

  • 服務間利用標準統一的協議進行信息交互,比如采用序列化協議Json和RESTful API設計,我個人比較推崇文本化的協議,容易使人理解也更容易記錄、分析、調試。這是深受“《Unix編程藝術》第5章——文本化:好協議產生好實踐”理念的影響。相比二進制協議,文本化協議可以帶來互用性、透明性、可擴展性。

  • 通過配置文件或者配置服務加載策略,對於很多靜態和動態的策略不要寫死在程序中,而是通過配置文件或者配置服務加載,這樣可以快速部署發布新功能、對服務進行無間斷的熱啟動。這也是“《Unix編程藝術》中分離原則:策略同機制分離,接口同引擎分離”原則的實踐。


資料:

《服務端架構中的“網關服務器 》 《IM系統架構設計之淺見 》

DSF(Distributed service framework)基於C++語言實現的一個簡單分布式服務框架示例,包括一個邏輯分發服務實現(網關服務),一個邏輯應用實現(具體應用服務)

highPerformanceNetworkServer高性能TCP網絡服務器程序(上線服務器的雛形)


參考書籍:

《企業IT架構轉型之道:阿裏巴巴中臺戰略思想與架構實戰 》

《大型網站技術架構》

《分布式系統概念與設計》





分布式系統實戰