概念地圖・指數退避與抖動
分類:系統
這一頁不只是把一個概念解釋一遍——一張自己畫的結構圖,加上拿台灣情境從頭走一次的實例演練、這個框架什麼時候會騙你,以及它接回 P.A.I.N. 之後長什麼樣。一頁必須交付的三層 →
指數退避與抖動:攤平重試尖峰
第一通催繳電話沒人接,第二通隔十分鐘,第三通隔十分鐘,第四通還是隔十分鐘。那天下午四點整,三十七支手機同時響起。重試寫起來只有一行——失敗了,等一下再送——麻煩全藏在「等一下」三個字裡。固定的間隔會讓一批同時失敗的對象,在同一秒又被一起叫醒。指數退避把等待窗一輪一輪加倍,抖動再讓每一個對象在窗裡自己抽一個時刻,「同時失敗」才拆得成「陸續回來」。這張圖畫的就是窗怎麼長大、五個點怎麼散進去。
每一輪的等待窗怎麼長大,抖動落在哪裡
先把圖上那五個色塊讀成一張表。左邊三欄是退避負責的部分——窗的上緣照倍數長大;最右邊那一欄是抖動缺席時的預設結果,也是多數人以為自己已經解決了、其實沒有的那一格。
| 輪次 | 等待窗 | 上緣怎麼來的 | 沒有抖動時會怎樣 |
|---|---|---|---|
| 第 1 輪 | 0~1 秒 | 2 的 0 次方 | 五個客戶都在第 1 秒送出 |
| 第 2 輪 | 0~2 秒 | 2 的 1 次方 | 五個客戶都在第 2 秒送出 |
| 第 3 輪 | 0~4 秒 | 2 的 2 次方 | 五個客戶都在第 4 秒送出 |
| 第 4 輪 | 0~8 秒 | 2 的 3 次方 | 五個客戶都在第 8 秒送出 |
| 第 5 輪 | 0~16 秒 | 2 的 4 次方 | 等了 16 秒,五個還是同一秒撞上去 |
表格右邊那一整欄長得一模一樣,這件事本身就是答案:窗長大了,尖峰高度一格都沒降。只加退避,你買到的是「晚一點撞」;把抖動加進來,那個 16 才從一個時刻變成一段區間,五個客戶的平均間距瞬間有了 3 秒以上。退避管的是規模,抖動管的是形狀——少了後者,前者只是把同一堵牆往後搬。
判斷你的重試會不會撞成一團,先看三件事
底下三個自問,是拿一份催繳電話排程磨出來的(下一段會把它整個走一遍)。順序有意義:不先問清楚第一件,後面兩件都會答錯。
一、這批失敗是各自出事,還是同一個原因一起出事。四點整那一輪三十七通全部沒接通,可能是三十七支手機各自有各自的狀況,也可能是外撥線路整條卡住。前者的重試本來就分散,抖動加了也是白加;後者是同一個發令槍打下去,三十七隻腳同時起跑——退避與抖動要治的正是這一種。分不出來就先去看失敗時間戳:擠在同一秒裡的,就是同源。自問:把上一次的失敗紀錄按秒排開,最擁擠的那一秒裝了幾筆?
二、下游同一時間吃得下幾筆。催繳排程真正的瓶頸落在客服端——同時能開幾條通話線。六線就是六線,第七通進來只會聽到忙線音、然後被記成一次新的失敗。這個數字要先量出來,才有辦法反推窗要開多寬——窗寬到讓每分鐘的到達量壓在容量之下,退避才算調對了。自問:你那一頭的同時容量是幾,量到的還是猜的?
三、重試幾次之後你就放棄,那個上限訂在哪裡。指數長得比人的直覺快。窗的上緣每一輪翻倍,第十輪就是五百一十二秒、第十五輪超過四個半小時——沒有上限的退避,會安安靜靜地把一戶欠款人退到明天早上。上限有兩種訂法:訂輪數,或訂總時長。催繳這種有人在等回音的流程,訂總時長比訂輪數誠實。自問:這件事拖到第幾分鐘之後,再打就沒有意義了?
一家信合社的催繳排程,四輪走一遍
底下這家台灣中部的信用合作社,是為了把這個結構講清楚而編出來的示意情境,沒有指涉任何真實公司。它的逾期催繳走自動外撥,每天下午跑一輪。
- 舊排程:固定隔 10 分鐘:四通電話分別落在第 0、10、20、30 分鐘。設定畫面上只有一格「重試間隔」,填 10,收工。四點整,37 支手機同時響
- 第 1 輪,窗 0~10 分鐘:改成退避加抖動之後,每一戶在自己那一輪的窗內隨機取一個時間。第一輪就已經把三十七通拆散在十分鐘裡。首輪就不再同秒
- 第 2 輪,窗 0~20 分鐘:上緣翻倍,還沒接通的戶數少了一截,窗卻變寬——密度掉得比戶數更快,這是退避真正划算的地方。
- 第 3 輪,窗 0~40 分鐘:剩下的多半是真的不在座位上的人。窗開到四十分鐘,等於承認「現在打也沒用」,把線讓給還有機會接通的那幾戶。
- 第 4 輪,窗 0~80 分鐘:三十七通分散在八十分鐘內,每分鐘最多 2 通,客服端六線綽綽有餘。第四輪跑完就停——這家社訂的上限是輪數四輪。最後一戶等了 80 分鐘
兩張排程表放在一起,差別只有一格設定,尖峰卻從 37 掉到 2。舊排程的問題從來不在「10 分鐘太短」——把它改成 30 分鐘,四點整那一場踩踏只是換到四點半發生,三十七支手機照樣一起響。真正換掉的是「同一秒」這三個字:窗一輪比一輪寬,每一戶又在窗裡各抽各的,於是同時通話需求從 37 線壓到 2 線,而客服端本來就只有 6 線。順帶一提,這家社原本打算加人——六線變十二線,成本翻倍,還是接不住三十七通。攤平尖峰跟擴充容量是同一個問題的兩個出口,前者這次只花了改一格設定的力氣。以上為說明結構用的示意情境,僅供理解框架之用。
這張退避曲線什麼時候會騙你
- 退避換到的是時間,換不掉總量。窗開得再寬,那三十七通電話一通都沒少。如果下游壞在總量——每天只能處理三十筆、第三十一筆註定失敗——退避只是把同一批工作往後推,帳單照付、人力照排。曲線畫出來很漂亮,因為它畫的只有到達的時刻——要做的件數從頭到尾沒進過那張圖。判斷方法很直接:把一整天的成功處理量加起來,跟需求量比一次,兩個數字接近才輪得到談尖峰。
- 抖動把平均壓下來,把尾巴拉長。三十七通分散在八十分鐘裡,平均等待漂亮了,代價是有一戶真的等到第 80 分鐘。對機器來說這叫尾延遲,對人來說這叫「你們今天沒打給我」。如果你的服務水準是用最慢那一個來衡量的,抖動反而可能讓你更難達標——這時候該動的是上限與輪數。關掉抖動,你會連平均一起賠進去。
- 沒訂上限的退避,會退成失聯。倍增的速度遠超過人的估計:第十輪五百一十二秒、第十五輪一萬六千多秒、超過四個半小時。系統日誌上看起來一切正常——還在重試嘛——實際上那一戶已經整個下午沒有人聯絡。退避的設定畫面幾乎都不強迫你填上限,因為對機器來說無限重試是合理的預設。對客戶來說不是。上限這一格空著,就是把「什麼時候該放棄」交給指數函數決定。
等待窗長大的時候,誰在那一頭等
每一支手機都照規矩響。
湊在一起卻成了一場踩踏——每個節點各自都很守本分,沒有人違規,災難卻是集體行為的產物。這正是《痛點》一路在講的事:結構算得出來,感受算不出來。這張圖畫得出五個客戶各自落在第幾秒,畫不出第三十七戶在等這通電話之前,已經把手機翻過來看了幾次。退避與抖動優化的是到達的分佈,而催繳電話那一頭的人在意的是「有沒有人記得我」——分佈變好了,被排到第 80 分鐘的那一戶,體感只會更差。所以窗開多寬這件事,最後落在一個工程參數管不到的地方——你願意讓誰多等。今晚可以做一件小事:把你手上任何一份自動重試的設定翻出來,在「最後一名等多久」旁邊寫下一個你自己願意接受的分鐘數,明天拿它去對照真實紀錄。那個數字會比任何一條退避曲線更快告訴你,這套設定是為系統設計的,還是為對面那個人設計的。
關於指數退避,常見問題
指數退避一定要加抖動嗎?
如果所有客戶是被同一個事件同時打掛的,那就一定要。純退避把大家的等待秒數變成一樣的 1、2、4、8、16,於是每一輪的重試仍然精準地擠在同一個時刻——窗長大了,尖峰高度紋風不動。只有各自失敗、時間本來就散開的情境,才可以省掉抖動。判斷的依據是失敗時間戳的密度,跟系統規模大小無關。
抖動要加多少才夠?
最常見的是全幅抖動:在 0 到上緣之間均勻取一個值,也就是這張圖畫的做法。它的分散效果最好,代價是有些重試會非常早就送出去,看起來像沒退避。折衷版是取一半固定、一半隨機,例如第五輪落在 8 到 16 秒之間,既保住了退避的下限,也散得開。從全幅開始試,量下游的每分鐘到達量,撐不住再往固定那一側挪。
退避的上限該怎麼訂?
兩個上限要分開訂:單輪窗的最大寬度,以及整件事的總放棄點。前者防止第十輪那種五百一十二秒的荒謬等待,通常壓在一個對業務有意義的區間,例如三十分鐘。後者回答「什麼時候不再試」,訂輪數或訂總時長都可以,有人在等回音的流程建議訂總時長。兩格都空著的設定,實際行為由指數函數決定,跟你的判斷無關。
人在做的流程也適用嗎?
適用,而且效果常常比機器那一頭更明顯,因為人力容量小、卡住的樣子更直接。催繳電話、到貨提醒、續約通知,凡是「一批對象同時觸發、失敗要再來一次」的排程,都會踩到同一個尖峰。差別在於窗的單位從秒變成分鐘或小時,還有一件機器沒有的事:對方會記得自己被打擾過幾次,所以輪數上限要訂得比機器保守。
打開你手上那份自動重試設定,看它第三輪等幾秒。如果那一格填的是固定值,你就知道下一次大家會在哪一秒一起回來。想接著往下游看,背壓與流量控制畫的是下游擋不住時怎麼往回頂;想知道什麼時候該整條停掉、連退避都不必再談,那是斷路器的狀態機那一張圖的事。
喜歡這篇文章嗎?
每週幫你拆二本好書,把判斷力、好書金句、好問題,直送你的信箱。
不適合你可隨時退訂 · 每週兩封,陪你把書讀進生活。
送出即表示同意我們依隱私權政策使用你的 email。