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()
    }
    
  • 相关阅读:
    nyoj118 修路工程 次小生成树
    nyoj99 单词连接 欧拉回路
    NYOJ289 苹果 典型背包
    nyoj 139 牌数 康拓展开
    poj1423 NYOJ_69 数字长度 斯特林公式 对数应用
    NYOJ311 完全背包 对照苹果
    sort 函数的应用
    NYOJ120 校园网络 强连接
    nyoj219 计算日期 吉姆拉森公式
    把SmartQ5系统装在SD卡上
  • 原文地址:https://www.cnblogs.com/littlepage/p/13258668.html
Copyright © 2011-2022 走看看