漏桶(leaky bucket)
想像一個真實的桶子,底部有個小洞。你可以倒水進去,快或慢、湧出或細流——但水總是以一個固定速率從洞口滴出。若你倒得比它漏得快,水位就上升;倒進去的超過桶子裝得下的量,它就溢出來灑掉。漏桶是一個極其簡單的模型,能把任何顛簸、爆發的輸入轉成完全穩定的輸出。用在網路上,封包就是水,穩定的漏出就是它們被允許離開的速率。
作為一個演算法,它這樣運作:從應用程式抵達的封包被放進一個固定容量的佇列(桶子)。這個佇列以固定速率被排出——每個固定間隔排出一個封包(或固定數量的位元組)——那些排出的封包就是網路送出的東西。若一個封包在桶子已滿時抵達,它就被丟棄(即溢位)。結果是一股無論輸入多麼凹凸不平、都極其平順的輸出串流:爆發被壓平了,因為它們堆在桶子裡、以漏出速率涓涓流出。桶子的深度決定它在溢出之前能吸收多大的輸入爆發。
為什麼重要:漏桶是流量塑形的教科書意象,也是權杖桶在觀念上的祖先。它的長處也是它的限制,這是關鍵且誠實的一點:純漏桶在輸出上完全不允許任何爆發——即使一條流安靜了一小時,它一送出,輸出仍只以那緩慢的漏出速率冒出。這種僵硬對自然就有爆發性、且能受益於偶爾送出一段累積爆發的真實流量來說,往往太過嚴格。這正是權杖桶填補的缺口,做法是讓一條安靜的流累積額度,稍後再以受控的爆發花用。
一個漏桶每 10 毫秒排出 1 個封包(每秒 100 個)。一個應用在一瞬間傾倒 30 個封包;桶子留住它們,每 10 毫秒釋放一個,所以輸出是平穩的每秒 100 個。若這個應用把 1000 個傾倒進一個只裝得下 50 個的桶子,其餘 950 個就會溢出而被丟棄。
任何形狀的輸入都變成固定的輸出速率;超過桶子深度的溢位則被丟棄。
純漏桶完全不允許輸出爆發——它執行嚴格的固定速率。那往往太僵硬,這正是為什麼較有彈性、允許有界爆發的權杖桶在實務上更常見。