English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

guest
1 / ?
back to lessons

節點、邊與方向

作為圖上行走的請求

請求觸及的每個元件都是一個節點:客戶端、DNS 解析器、CDN 邊緣、反向代理、後端副本、資料庫、快取。

兩個節點之間的每個連線都是一條有向邊:請求向前流動,回應向後流動。向前的邊代表一個開啟的 TCP 連線及其上層的協定。

單一請求是穿過此圖的一條路徑。系統為回應該請求所做的總工作量,等於每個節點上的工作量之和,加上每條邊的延遲。

為何重要? 一旦繪製出圖形,許多在程式碼中不可見的特性便會顯現出來:

- 跳數(Hop count):路徑中邊的數量。每一跳都會增加延遲(網路往返 + 節點處理)。跳數越少 = 延遲的下限越低。

- 入度(In-degree):指向節點內部的邊數。高入度表示該節點從許多來源接收請求,必須進行擴展或自我保護。

- 出度(Out-degree):從節點指向外部的邊數。高出度表示該節點依賴許多下游組件,且有多種失敗方式。

- 割點(Cut vertex):移除後會使圖斷開的單一節點。沒有同儕的反向代理是一個割點;移除它將移除對其源站的所有存取。

Request as path through directed graph: client, proxy, backend, database

繪製(或以文字描述)以下請求圖:用戶端瀏覽器 -> CDN 邊緣 -> 反向代理 -> 後端副本 -> 資料庫。計算跳數。識別割點。預測在路徑中連續存在如此多割點的一個運維後果。

流量匯聚之處

扇入 = 匯聚

節點的入度 = 指向該節點的邊數。在請求圖中,入度 = 發送請求的上游來源數量。

Fan-in(匯入)模式:許多客戶端 -> 一個 CDN;許多 CDN 邊緣節點 -> 少數源站代理;許多代理 -> 較少的後端副本;許多後端 -> 單一資料庫。

匯聚(Concentration)之所以重要,是因為入度(in-degree)最高的節點會承受最大的聚合負載。 鏈路末端的資料庫可能會看到來自整個系統中每個活躍請求的查詢,即使沒有任何單一使用者產生大量負載。

Fan-Out(扇出)= 依賴

節點的出度(Out-degree) = 從該節點指出的邊數。高出度意味著許多下游依賴。

一個呼叫資料庫、兩個快取、三個外部 API 以及一個佇列的後端,其出度為 7。其成功機率大致等於每個下游成功機率的乘積(如果所有下游都是成功回應所必需的)。

0.999 ^ 7 ≈ 0.993:一個擁有 7 個下游依賴的後端,若每個下游的可靠性為 99.9%,即使其自身沒有任何 Bug,其自身的可靠性也只能達到約 99.3%。

透過以下方式降低出度:快取下游結果、將非關鍵下游設為可選(優雅降級)、並行化可並行的操作。

不對稱性

Fan-in(匯入)會集中負載;fan-out(匯出)會放大風險。一個設計良好的圖形結構會將這兩個指標在影響最大的節點上降至最低。

資料庫(最高 fan-in):積極使用快取以減少負載。使用讀取複本(Read replicas)將 fan-in 分散到多個節點。

編排服務(最高 fan-out):針對每個依賴項使用熔斷器(circuit breakers)、優雅降級(graceful degradation)以及隔離舱(bulkheads)。

一個後端複本呼叫 4 個下游服務,每個服務獨立地具有 99.95% 的可用性。(1) 如果成功回應需要所有 4 個呼叫都成功,後端可用性的上限是多少?(2) 如果透過優雅降級將 4 個下游服務中的 2 個設為可選(當不可用時以快取回退值取代),上限會變成多少?

插入節點帶來靈活性

間接性 = 添加中間節點

沒有代理時,圖為:client -> backend。客戶端必須知道後端的地址。移動後端需要更新客戶端(透過 DNS 或配置)。這是一種緊耦合。

有了代理,圖變為:client -> proxy -> backend。客戶端只知道代理。移動後端需要更新代理的上游配置,而非客戶端。

圖操作:在現有邊上插入一個節點。新邊 client -> proxy 是穩定的;新邊 proxy -> backend 現在由團隊管理。

幾何解讀:間接性添加了一層,將上游變更與下游變更解耦。每一層的邊可以獨立重新連接。

間接性的成本

每一層都會增加:

- 一筆延遲(從客戶端到代理的邊)

- 路徑上多一個割點(代理本身)

- 多一個可能發生配置錯誤的地方

對於任何非平凡系統而言,其好處(重新佈線、擴展、防護、終止 TLS、負載分發)通常大於成本。但存在極限:每個間接層都會增加另一跳 & 另一個單點故障(SPOF)候選。

民間法則:任何問題都可以透過增加一層間接性來解決(除了間接性層數過多這個問題本身)。

一個團隊在現有的反向代理前面添加了一個 CDN。路徑從 `client -> proxy -> backend`(2 跳)變為 `client -> CDN -> proxy -> backend`(3 跳)。請列出兩個此間接性的好處(歡迎使用圖論術語)& 兩個成本。

將架構視為圖來閱讀

綜合

現在,你可以將系統架構視為圖形來閱讀:計算跳數、識別割點、衡量扇入集中度、根據扇出計算可用性上限,並評估間接引用的權衡。

應用這四項。

一個新服務具有此架構:clients -> CDN -> reverse proxy (2 replicas) -> backend tier (8 replicas) -> { DB primary, cache cluster (3 nodes), external API }。

分析:(1) 單一請求路徑上的最大跳數是多少,(2) 哪一層的扇入最高(& 這對擴展意味著什麼),(3) 如果 DB 為 99.95%、快取為 99.95%、外部 API 為 99.9%,且全部為必要條件,後端的可用性上限是多少,& (4) 移除哪一個節點會導致最多數量的用戶斷連?

隨堂筆記

隨堂筆記

本節「幾何視角」課程將代理與源頭(Proxies & Origins)主課程重新詮釋為有向圖分析。

本課程的下一個隨堂筆記 geometry_of_stateless_horizontal_scaling 將從主課程的副本數學(replica-math)出發,以幾何方式推導排隊曲線、利特爾法則(Little's Law)以及 80% 使用率的拐點。

做得很好。