題幹與適用情境
某租戶購買每分鐘 30,000 次的全域額度,突發容量為 6,000。流量會進入三個雙活區域,每次請求跨區域決策會超過延遲目標。請只設計全域協調層;假設每個區域已有正確的本地權杖桶。
回答必須量化流量遷移、區域網路分區和協調器故障時的行為。HTTP 429 與 Retry-After 用來告知用戶端請求遭拒,但不會替系統選擇內部演算法。
面試官考察點
- 能否說清楚低延遲、分區可用和精確全域上限的取捨。
- 能否守住配額守恆,而不是向每個區域複製完整額度。
- 能否安全回收閒置配額,避免重複消費。
- 故障政策與最大超放量是否可以計算。
回答前需要釐清的問題
- 全域數字是嚴格防濫用邊界,還是允許誤差的商業目標?
- 分區時,區域用完租約後應停止,還是允許使用緊急額度?
- 流量遷移有多快,各區域尖峰能相差多少?
- 請求成本都是 1,還是不同端點有不同權重?
- 暫時少用額度與超放相比,業務較能接受哪一項?
嚴格上限下,分區區域只能消費未過期租約;盡力而為的商業限制才可設定有明確上界的緊急額度。
30 秒回答框架
「我會讓強順序協調器管理兩項可租資源:每秒 500 次的全域補充速率和 6,000 次的全域突發容量。協調器向各區域發放短時的補充速率與突發份額,區域用既有原子權杖桶在本地消費,請求路徑不跨區域。任何時刻,所有重疊生效租約的速率總和不超過 500 次/秒,突發份額總和不超過 6,000;續租只能更新參數,不能重設本地餘額。流量遷移時,舊份額確認歸還或過期後才能重新分配。網路分區時,嚴格模式在租約過期後停止;盡力模式只能使用明確設定的額外緊急額度,其總和就是可聲明的超放上界。」
分步驟深入解答
第一步:用守恆不變量管理配額
將每分鐘 30,000 次換算為連續補充速率 R = 500 req/s,突發容量為 B = 6000。任何時刻都要滿足 sum(active_lease.refill_rate) <= R 和 sum(active_lease.burst_capacity) <= B。租約包含租戶、區域、epoch、速率份額、突發份額、生效時間、過期時間與唯一 ID。初始各區域餘額總和不超過 B,續租、擴容和改配都不能憑空增加餘額,因此任意時段的總放行量不超過 R × 時長 + B。故障切換使用持久化租約帳本和更高 epoch,既有租約在歸還或過期前仍計入兩項上限。
第二步:本地消費並提前續租
區域權杖桶按租約速率持續補充,並以突發份額限制餘額上限;每次請求仍用原子操作扣減。無間斷續租只延長或調整速率與容量,保留既有餘額並在容量下降時截斷至新上限,不能把桶重新填滿。租約中斷後,新租約從零餘額開始,除非協調器轉入已確認回收的剩餘權杖。租期越短,再平衡和故障邊界越緊,但續租負載越高;應依真實尖峰、協調器容量和可接受的失聯時間選擇。
第三步:再平衡但不重複使用
健康區域回報餘額與需求。協調器先降低冷區域下一份租約的速率和突發份額,再把釋放的份額交給熱區域。舊租約確認歸還或自然過期前,新舊租約的重疊區間仍須同時計入上限。歸還確認必須先讓舊桶失效;熱區域新增容量不會自動變成餘額,只能從零補充或接收已確認轉移的剩餘權杖。歸還操作要冪等,狀態不確定時寧可暫時少用,也不能提前重複分配。
第四步:寫清楚故障語意
嚴格模式下,區域只在租約有效期內按獲配速率補充;租約過期且無法續租後使本地桶失效,並丟棄未確認轉移的餘額,代價是可能少用額度。若每個區域另有不計入正常突發上限的緊急額度 E,斷線期間的額外放行上界就是所有可觸發緊急額度之和,此模式不能再聲稱嚴格零超放。協調器故障不影響已發租約;新協調器必須恢復持久化帳本、使用更高 epoch,並繼續計入尚未過期的舊租約。
高品質示範回答
「本地權杖桶繼續留在請求同步路徑。我增加一個全域協調器,把每分鐘 30,000 次表示為每秒 500 次補充速率,並單獨管理 6,000 次突發容量。它向區域發放帶 epoch 和有效期的速率、突發份額,始終保證生效租約的速率總和不超過 500 次/秒、突發份額總和不超過 6,000。
區域按速率補充本地桶,容量不超過租約份額;無間斷續租保留餘額,增加容量不會自動增加餘額。熱區域只能取得已確認歸還的剩餘權杖,或在冷區域租約過期後從零補充。嚴格模式下,分區區域在租約過期後使本地桶失效;若業務核准每區域 100 個額外緊急權杖,分區超放上界就是符合觸發條件的緊急額度總和。協調器切換恢復租約帳本並使用新 epoch,避免雙主發放。我會用流量突遷、重複歸還、續租重疊、時鐘偏差和網路分區驗證兩項不變量。」
常見錯誤
- 每個區域設定完整速率與突發容量 → 全域上限按區域數放大 → 分別租出速率與突發份額。
- 歸還未確認就重新使用 → 同一權杖可能消費兩次 → 冪等確認或等待過期。
- 只說最終一致 → 無法知道最大超放量 → 給出租約與緊急額度邊界。
- 續租時重新填滿本地桶 → 每次續租都製造額外突發額度 → 保留餘額,只更新速率、容量與有效期。
- 故障切換不隔離舊主 → 兩個協調器同時發放 → 租約攜帶單調遞增 epoch。
追問及應對
租約應該多大?
分別決定租期、速率份額和突發份額。租期按可接受的失聯時間設定;速率按近期需求分配;突發份額依尖峰和全域 6,000 上限分配。縮短租期可加快再平衡並收緊故障邊界,但會增加續租負載。
流量突然轉移到另一個區域怎麼辦?
協調器降低冷區域下一份租約的速率與突發份額,並在歸還確認或舊租約過期後把份額交給熱區域。等待期間可能出現全域仍有閒置卻暫時拒絕的情況,這是避免重疊超配的代價。
Retry-After 如何計算?
取目前租約下本地下一次補充、已確認的新租約生效或協調器預計恢復中的最早時間,並按回應支援的精度向上取整。若恢復時間未知,不應承諾虛假的精確時間。
能否同時保證零超放和分區期間全量可用?
只能預先給每個分區足夠額度並接受大量閒置,或讓請求跨區域同步並犧牲延遲與分區可用性。業務必須明確選擇邊界。