分布式系統的開發經驗與心得
與近期與InfoQ的一次對話中, Vaughn Vernon 分享了一些他在開發分布式系統方面的心得。他特別指出,在分布式系統中,有可能會出現局部故障之類的問題。對于這種類型的問題以及一些其它挑戰來說,最佳的應對方式是做好一切準備,而不是無助地祈禱它不要出現。Vaughn還推薦了 Jeff Hodges 所撰寫的一篇 博客文章 ,這篇文章為分布式系統給出了一些落到實處的設計方式,并提出了一些實用的建議,非常適合于在分布式系統方面經驗尚淺的開發者。
Vaughn Vernon是 《實現領域驅動設計》 以及最新的 《通過Actor Model實現響應式消息處理模式》 這兩本書的作者。在他看來,Hodges的文章中有兩個推薦是最有價值的,一是嘗試為局部可用性進行設計,二是當依賴的系統變得不可用時,通過使用 capped指數退避(exponential back off)算法恢復完整的操作。這種方式是當故障發生時,你所能做的最好的期望,這會讓你想到Vernon的評價。
Hodges發現,新手往往會將延遲視為分布式計算中最困難的一部分。但在他看來,分布式系統的區別性因素在于出現故障的可能性增大了,尤其是局部故障的出現率。因此,他建議設計者去尋找一些能夠實現局部可用性的設計方式。他以一個設計良好的搜索系統作為示例,如果發生搜索操作超時的情況,那么系統應當返回在超時之前所獲得的搜索結果,這種方式可以有效地提高系統的彈性。
在Hodges看來,要創建健壯的分布式系統,一個最基本的構建塊就是背壓(backpressure)機制。被請求的系統會向發起請求的系統發出故障信號,以避免出現過載的情況。實現這種機制有一些常見的方式,例如丟棄消息,或是在處理一個有可能失敗的請求之前就返回錯誤信息。
Hodges強烈反對在服務器之間進行協調的做法,他傾向于讓服務器保持獨立性,將互相之間的通信次數降至最低。因為一旦出現需要兩臺服務器對某個操作表示允許的情況,整個服務的實現就變得更加困難了。
Hodges還認為,如果能夠找到一些高層次的業務邏輯,并將其提煉為服務,則能夠帶來許多益處。一個經過提煉的服務能夠提供更好的封裝性,并且能夠讓代碼變更的部署更快、更簡便。在他看來,對于部署至多個客戶的情況,在服務這一層進行協調的成本,比之讓所有客戶端使用一個共享的類庫,在部署時必須對所有客戶進行協調的成本來說要低上許多。
Hodges在文中也描述了一些在他的職業生涯中所學到的一些經驗教訓,例如利用特性標記交付基礎設施,以及為系統選擇id空間時所需考慮的各種因素。