zoukankan      html  css  js  c++  java
  • 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()
    }
    
  • 相关阅读:
    reduce 一知半解(一):根据id合并两个数组
    textarea去除右下角默认样式
    css禁止点击事件
    poj 2723 二分+2-sat判定
    hdu 3062 2-Sat入门
    poj 3694双联通缩点+LCA
    poj 1986LCA离线dfs+并查集
    poj 1330 LCA最近公共祖先
    poj 1882完全背包变形
    poj 1948二维01背包
  • 原文地址:https://www.cnblogs.com/littlepage/p/13258668.html
Copyright © 2011-2022 走看看