func(j*jitteredBackoffManagerImpl)Backoff()clock.Timer{backoff:=j.getNextBackoff()//進來的時候就先計算出 backoff 時間,等等會看到怎麼做的。
ifj.backoffTimer==nil{//如果當前沒有 backoff timer 就要賦值
//賦與的數就是剛剛get next back off 曲的的時間
j.backoffTimer=j.clock.NewTimer(backoff)}else{j.backoffTimer.Reset(backoff)//如果存在的話需要刷新 backoff 時間
}returnj.backoffTimer}func(j*jitteredBackoffManagerImpl)getNextBackoff()time.Duration{jitteredPeriod:=j.durationifj.jitter>0.0{jitteredPeriod=Jitter(j.duration,j.jitter)//等等會看到jitter 在做什麼,這邊只要了解輸入基礎延遲時間跟抖動範圍
//我們就能到最後要延遲的時間
}returnjitteredPeriod}
Jitter
負責抖動延遲時間的運算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Jitter returns a time.Duration between duration and duration + maxFactor * duration.
//
// This allows clients to avoid converging on periodic behavior. If maxFactor
// is 0.0, a suggested default value will be chosen.
funcJitter(durationtime.Duration,maxFactorfloat64)time.Duration{//抖動因子參數(抖動範圍)可以自行調整,但不能小於等於0
ifmaxFactor<=0.0{maxFactor=1.0}//計算方式也很間單 基礎的延遲時間 + 隨機時間*抖動因子*基礎的延遲時間
wait:=duration+time.Duration(rand.Float64()*maxFactor*float64(duration))returnwait}
funcTestJitterBackoffManagerWithRealClock(t*testing.T){//定義抖動的參數,基礎延遲時間為1*time.Millisecond 抖動範圍為0 (這裡等等計算的時候會設定成1)
backoffMgr:=NewJitteredBackoffManager(1*time.Millisecond,0,&clock.RealClock{})//測試跑五次,如果抖動的延遲數值小於基礎延遲時間就是測試失敗
fori:=0;i<5;i++{start:=time.Now()//還記得Backoff()回傳一個 clock.Timer 嗎?
//他就像是一個鬧鐘,當設定的時間到鬧鐘就會響,我們就可以從 channel 被喚醒
<-backoffMgr.Backoff().C()passed:=time.Now().Sub(start)ifpassed<1*time.Millisecond{t.Errorf("backoff should be at least 1ms, but got %s",passed.String())}}}