分布式系統(tǒng)的開發(fā)經(jīng)驗與心得

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