Token bucket

Token bucket

令牌桶限流機制:

在長連接時,當一個http請求來臨,我們需要進行GetConn,放入一個令牌進桶中,當我們的連接釋放,於是可以釋放連接。
我們控制桶的大小即可控制http的流量。

令牌桶算法,最近在學Golang,而對於HTTP的限流,Golang的令牌桶實現更爲簡潔,Golang的channel可以控制協程通信,所以令牌桶會簡單很多。

shared channel instead of shared memory.

我們可以知道,channel可以作爲共享內存。

Go語言代碼案例:

// 令牌桶的數據結構
type ConnLimiter struct {
	concurrentConn int
	bucket chan int
}

// 初始化令牌桶 cc爲capacity,令牌桶容量
func NewConnLimiter(cc int) *ConnLimiter {
	return &ConnLimiter {
		concurrentConn: cc,
		bucket: make(chan int, cc),
	}
}

// 獲取一個連接
func (cl *ConnLimiter) GetConn() bool {
	if len(cl.bucket) >= cl.concurrentConn {
		log.Printf("Reached the rate limitation.")
		return false
	}

	cl.bucket <- 1
	return true
}

// 釋放一個連接
func (cl *ConnLimiter) ReleaseConn() {
	c :=<- cl.bucket
	log.Printf("New connction coming: %d", c)
}

最後我們在實際場景中,把令牌桶添加到一個http中間件中即可

func (m middleWareHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if !m.l.GetConn() {
		sendErrorResponse(w, http.StatusTooManyRequests, "Too many requests")
		return
	}
	m.r.ServeHTTP(w, r)
	defer m.l.ReleaseConn()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章