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