当前位置: 首页 > news >正文

教材资源网站建设桂林漓江船票官网订票

教材资源网站建设,桂林漓江船票官网订票,推广网站建设语句,wordpress的登录地址修改密码一.什么是限流 限流又称为流量控制#xff08;流控#xff09;#xff0c;通常是指限制到达系统的并发请求数。 我们生活中也会经常遇到限流的场景#xff0c;比如#xff1a;某景区限制每日进入景区的游客数量为8万人#xff1b;沙河地铁站早高峰通过站外排队逐一放行的…一.什么是限流 限流又称为流量控制流控通常是指限制到达系统的并发请求数。 我们生活中也会经常遇到限流的场景比如某景区限制每日进入景区的游客数量为8万人沙河地铁站早高峰通过站外排队逐一放行的方式限制同一时间进入车站的旅客数量等。 限流虽然会影响部分用户的使用体验但是却能在一定程度上报障系统的稳定性不至于崩溃大家都没了用户体验。 而互联网上类似需要限流的业务场景也有很多比如电商系统的秒杀、微博上突发热点新闻、双十一购物节、12306抢票等等。这些场景下的用户请求量通常会激增远远超过平时正常的请求量此时如果不加任何限制很容易就会将后端服务打垮影响服务的稳定性。 此外一些厂商公开的API服务通常也会限制用户的请求次数比如百度地图开放平台等会根据用户的付费情况来限制用户的请求数等。 二.常见的限流算法 2.1 漏桶算法 2.1.1 漏桶算法的原理 漏桶法的原理比较简单假设我们有一个水桶按固定的速率向下方滴落一滴水无论有多少请求请求的速率有多大都按照固定的速率流出对应到系统中就是按照固定的速率处理请求。原理图如下 漏桶法的关键点在于漏桶始终按照固定的速率运行但是它并不能很好的处理有大量突发请求的场景毕竟在某些场景下我们可能需要提高系统的处理效率而不是一味的按照固定速率处理请求。 关于漏桶算法,在开发中我们可以使用三方的开源框架uber团队有一个开源的github.com/uber-go/ratelimit库下面网站是由漏桶算法集成以下如何简单的在gin中集成一个由漏桶算法实现的限流中间(这里我用的是我尝试自己编写的一个漏桶算法代码大家可以选择自己写也可以选择使用上面的开源框架) //开源框架版 package mainimport (timegithub.com/gin-gonic/gingo.uber.org/ratelimit )func pong(c *gin.Context) {c.JSON(200, gin.H{code: 200,message: pong,})}func LimitHandler() gin.HandlerFunc {return func(c *gin.Context) {r : ratelimit.New(1) //每秒1个请求//每次滴水允许通过的请求数量// 限流if r.Take().Sub(time.Now()) 0 {c.JSON(200, gin.H{code: 429,message: Server busy,})c.Abort()}} }func main() {r : gin.Default()r.Use(LimitHandler()){r.GET(/ping, pong)}r.Run(:8080) }//自己实现版//main.go package mainimport (awesomeProject1/limittimegithub.com/gin-gonic/gingo.uber.org/ratelimit )func pong(c *gin.Context) {c.JSON(200, gin.H{code: 200,message: pong,})}func main() {r : gin.Default()r.Use(limit.LimitMiddleware()){}r.Run(:8080) }//limit.go package limitimport (synctimegithub.com/gin-gonic/gin )type Bucket struct {sync.MutexlastAccess time.Timerequests int64 // 当前已经接收请求次数MaxRequests int64 // 最大可接受请求次数interval time.Duration // 时间间隔 }func NewBucket(maxRequests int64, interval time.Duration) *Bucket {return Bucket{lastAccess: time.Now(),requests: 0,MaxRequests: maxRequests,interval: interval,} }func (b *Bucket) Allow() bool {b.Lock() //加锁defer b.Unlock()now : time.Now()if now.Sub(b.lastAccess) b.interval {b.requests 0b.lastAccess now}if b.requests b.MaxRequests {b.requestsreturn true}return false }func LimitMiddleware() gin.HandlerFunc {bucket : NewBucket(1, 10*time.Second)return func(c *gin.Context) {if !bucket.Allow() {c.JSON(200, gin.H{code: 429,message: Server busy,})c.Abort()}c.Next()} }2.2 令牌桶算法 2.2 令牌桶算法的原理 令牌桶其实和漏桶的原理类似令牌桶会按固定的速率往桶里放入令牌并且只要能从桶里取出令牌就能通过令牌桶支持突发流量的快速处理。原理图如下 当我们在令牌桶里面取不到令牌时我们就会选择拒绝该次请求。 2.2.2 基于令牌桶实现的限流中间件 和上面的漏桶限流一样这里有关令牌桶的限流博主还是给出两个版本一个是开源第三方库同时博主也会写一个自己实现的限流中间件供大家参考 首先是第三方库这里我们可以考虑使用github.com/juju/ratelimit这一第三方库下面我们来看一下如何基于这一第三方库封装出外面的限流中间件 // filepath:/limit/limiter package limitimport (timegithub.com/gin-gonic/gingithub.com/juju/ratelimit )// 考虑到我们可能会对不同的请求做不同的限流因此需要一个通用的实现接口 type LimiterInterface interface {Key(c *gin.Context) string //基于context实现获取对应限流器键值对GetBucket(key string) (*ratelimit.Bucket, bool) // 获取限流器AddBuckets(rules ...LimiterBucketRule) LimiterInterface // 添加限流器规则 }type Limiter struct{ // 限流器(用来记录不同接口对应的不同限流策略)LimiterBuckets map[string]*ratelimit.Bucket }type LimiterBucketRule struct { // 限流器规则Key string //FillInterval time.Duration // 时间间隔Capacity int64 // 容量Quantum int64 // 每次放置的令牌量 }// 接口的具体实现 filepath:/limit/method_limiter.go package limitimport (stringsgithub.com/gin-gonic/gingithub.com/juju/ratelimit )type MethodLimiter struct {*Limiter }func NewMethodLimiter() LimiterInterface {l : Limiter{LimiterBuckets: make(map[string]*ratelimit.Bucket)}return MethodLimiter{Limiter: l} }func (l MethodLimiter) Key(c *gin.Context) string {url : c.Request.RequestURIindex : strings.Index(url, ?)if index ! -1 {url url[:index]}return url }func (l MethodLimiter) GetBucket(key string) (*ratelimit.Bucket, bool) {bucket, ok : l.LimiterBuckets[key]return bucket, ok }func (l MethodLimiter) AddBuckets(rules ...LimiterBucketRule) LimiterInterface {for _, rule : range rules {if bucket, ok : l.LimiterBuckets[rule.Key]; !ok {bucket ratelimit.NewBucketWithQuantum(rule.FillInterval, rule.Capacity, rule.Quantum)l.LimiterBuckets[rule.Key] bucket}}return l }// 在gin框架中集成限流中间件 filepath: /middleware/limiter.go package middlewareimport (awesomeProject1/limitfmtgithub.com/gin-gonic/gin )func LimitHandler(l limit.LimiterInterface) gin.HandlerFunc {return func(c *gin.Context) {key : l.Key(c)if bucket, ok : l.GetBucket(key); ok {count : bucket.TakeAvailable(1)fmt.Println(key, key, count, count)if count 0 {c.JSON(429, gin.H{code: 429,msg: too many request,})c.Abort()}}c.Next()} }//测试样例 main.go package mainimport (awesomeProject1/limitawesomeProject1/middlewaretimegithub.com/gin-gonic/gin )func pong(c *gin.Context) {c.JSON(200, gin.H{code: 200,message: pong,})}func main() {r : gin.Default()limiter : limit.NewMethodLimiter()limiter.AddBuckets(limit.LimiterBucketRule{Key: /ping,FillInterval: 10 * time.Second,Capacity: 1,Quantum: 1,},)r.Use(middleware.LimitHandler(limiter)){r.GET(/ping, pong)}r.Run(:8080) }大家可以自己测试一下 结语 上面就是一些常见的限流策略虽然说现在限流策略已经不再是单体架构而是迈向分布式但是万变不离其宗主要还是基于上面所说的策略进行拓展 参考文章 李文周博客——常用限流策略——漏桶与令牌桶介绍
http://www.w-s-a.com/news/541933/

相关文章:

  • 旅游网站开发的流程江苏付费网络推广培训
  • 网站软文标题2018wordpress主题
  • 德清网站设计wordpress免登录发布接
  • 可以做游戏的网站有哪些客户关系管理系统的主要功能
  • 整人关不掉的网站怎么做广东省网站免备案表
  • 网站设计素材edu域名网站
  • 中山学校的网站建设wordpress文章图片显示不出
  • 兰溪城市建设规划网站网站联盟的基本流程
  • 免费推广网站注册入口小说阅读网站怎么建设
  • 新网站怎么做网络推广怎么做企业网站排名
  • jsp商业网站开发网站链接如何做二维码
  • 江苏高校品牌专业建设网站怎么制作网站搜索窗口
  • 北京app建设 网站开发公司织梦网站seo
  • 大学网站 作风建设专题汽车配件外贸出口公司
  • 东莞做网站系统购物网站建设精英
  • 建设vip网站相关视频网站营销建设公司
  • 微站直播平台杭州seo按天计费
  • seo 新旧网站 两个域名福州设计网站建设
  • 如何做网站客户端如何做网络营销网站
  • 苏州网站建设制度打鱼网站建设
  • 瓜子二手车直卖网上海小红书seo
  • 天津中小企业网站制作珠海做网站的
  • 网站排名影响因素最牛的科技网站建设
  • 长春网站建设公司怎么样电商网站建设与开发期末考试
  • 品牌网站建设搭建国内外网站建设
  • 辽宁人社app一直更新整站seo定制
  • 兰州网站建设论坛装修品牌
  • 云南省城乡住房与建设厅网站用什么网站可以做电子书
  • 自己电脑怎么做网站服务器吗0基础如何做网站
  • 做网站的股哥网络整合营销方案策划