圖說分佈式計算的 8 大謬誤

分佈式計算的謬誤是由 L Peter Deutsch 和 Sun Microsystems 公司的其他人所提出的一組斷言,他們描述了不熟悉分佈式應用程序的程序員總是會做出的一些錯誤的假設。

微服務的大規模普及迫使越來越多的工程師意識到這些錯誤的認識給他們的系統帶來多麼大的影響。

我們經常會看到一些人在討論系統設計的時候,忽視或者淡化這 8 個謬誤。

下面我來介紹一下這些謬誤以及一些潛在的消減措施,希望大家能感興趣。

—__1 

網絡是可靠的

爲了構建一個可靠的系統,你必須理解並接受任何一種通信都可能會失敗的事實。因此,我們需要爲系統設計出一種方法來處理這種潛在的錯誤溝通。所以,最終需要用到重傳,而且它可以有多種形式。

存儲再轉發(store and forward)就是這樣一種模型。我們不直接將數據發送到下游服務器,而是將其存儲在本地或其他地方,這也提供了能從災難場景下恢復的保障。

有很多產品屬於這種技術,如 RabbitMQ,ActiveMQ 以及來自雲廠商的各種專有解決方案。

—__2 

網絡是零延遲的

圖片的左邊是在現代系統中直接訪問內存的時間,右邊是在世界各地往返所需的時間。

我喜歡把延遲看作是完成任何請求的嚴格開銷。傳遞的消息可以很大,也可以很小,而延遲是不變的。與帶寬不同,延遲通常與光速和通信距離(或物理路徑)有關。所以兩個系統之間的物理距離在這裏起着重要的作用。

延遲是無處不在的。它發生在所有的通訊中。理想情況下,這種開銷應該儘可能小。延遲的場景和從車上卸貨非常相似,就是說,從廚房到車上的時間就是延遲。你是想一趟儘可能多地拿東西,還是想每次只拿一個東西,花幾百次往返把車上的東西都卸下來?

—__3 

帶寬是無限的

假設持續無限制地增加信道上的數據大小,這顯然是個很大的錯誤。這種情況只有在某種通訊徹底佔滿帶寬與此同時無法擴容時纔會出現。

我第一次遇到這個問題是我不小心將主頁所需的有效負載增加了 10 倍時。這個特定的 API 是一個無緩存調用,每次頁面加載 3 MB,這也包括到數據庫的往返。我們的系統很快就達到帶寬限制,網站也就很快垮了。

現在你可能在想,你剛纔告訴我,每次往返時儘可能多地帶東西,以減少延遲方面的影響。這是事實,但它也有其侷限性。這在很大程度上取決於你的系統設計和各自的優先級。就是說,能夠意識到權衡至關重要。

—__4 

網絡是安全的

我們可以理所當然的信任我們所處的網絡或爲之構建的人,這可能是一個重大錯誤。如今,隨着每天新聞中出現的社區漏洞賞金計劃和重大漏洞攻擊,這一點變得更加明顯。

在設計系統時就採取安全第一的方針會讓你在未來獲得回報。甚至花點時間評估當前系統的安全漏洞並很快產生一個簡短的改進清單也是一個很好的開始。

—__5 

網絡拓撲永不改變

網絡架構並不總是相同的。例如,如果基礎設施的關鍵部分出現故障,流量能否繼續流向適當的目的地?是否存在單點故障?

如今,隨着 Docker 和 Kubernetes 的出現,更改網絡拓撲的便利現在幾乎讓我們將其視爲理所當然,這是非常危險的。像 ZooKeeper 和 Consul 這樣的工具可以幫助解決服務發現方面的問題,並允許應用程序對佈局和系統的變化做出反應。

構建能夠對這些拓撲結構變化做出反應的系統可能很棘手,但是,最終會收穫更有彈性的系統。

—__6 

只有一個管理員

這句話花了我一段時間去理解,本質上是說一個人無法控制所有的事情。

隨着系統數量的增長,它們會依賴於不在我們控制範圍的一些其他的系統,要知道我們只擁有從我們自己的代碼到運行它的服務器這一部分。同時,有一個清晰的方法來管理你的系統以及各自的配置是至關重要的。然而,隨着各種系統數量的增加,管理和跟蹤變得越來越困難。由此誕生的基礎設施即代碼(IaC)可以幫助將系統中的這些變化代碼化。

同時,當出現問題時,也需要有一個很好的方法來診斷問題,監控和可觀測性將是可以節省時間的關鍵工具。

最後,適當的解耦還可以幫助確保整個系統的彈性和在線時間。

—__7 

傳輸成本是零

我們經常認爲,用於在系統之間發送數據的資源只是很微小的業務成本。當事情很小的時候,這種間接消耗和成本可以忽略不計。不過,隨着系統的增長,優化像 JSON 這樣的消息格式的成本可能是值得投入的,雖然與 gRPC 或 MessagePack 相比可能有點沉重。認識到這些開銷是必不可少的;然而,它也有它的權衡。過早去做可能會在短期內帶來更多的麻煩。

—__8 

網絡是同質的

我曾經寫過很多關於 shims 的文章,有關將一種格式的數據轉換爲另一種格式。我們希望一切都乾淨整潔,但現實世界遠非如此。具有互操作性是必不可少的。

這種靈活性確保了我們的系統能在最新最熱的框架裏繼續發揮作用,也能在不適合的環境中繼續運行。(即使,互操作性有其侷限性)

如果能知道 “所有的系統都是不一樣的,不會將你的解決方案耦合到一個系統上。” 可以在未來節省你的很多時間和煩惱。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/v-AW6d58luQXT4RtcJFGmQ