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

找网络公司做网站需要注意做微网站的第三方

找网络公司做网站需要注意,做微网站的第三方,传媒公司属于什么行业类型,免费咨询专业服务#x1f680; 优质资源分享 #x1f680; 学习路线指引#xff08;点击解锁#xff09;知识定位人群定位#x1f9e1; Python实战微信订餐小程序 #x1f9e1;进阶级本课程是python flask微信小程序的完美结合#xff0c;从项目搭建到腾讯云部署上线#xff0c;打造一… 优质资源分享 学习路线指引点击解锁知识定位人群定位 Python实战微信订餐小程序 进阶级本课程是python flask微信小程序的完美结合从项目搭建到腾讯云部署上线打造一个全栈订餐系统。Python量化交易实战入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 一、Go time/rate 限流器 1.1 简介 Go 在 x 标准库即 golang.org/x/time/rate 里自带了一个限流器这个限流器是基于令牌桶算法token bucket实现的。 在上一篇文章讲了几种限流算法里面就有令牌桶算法具体可以看上篇文章介绍。 1.2 rate/time 限流构造器 这个限流构造器就是生成 token供后面使用。 Limiter struct 结构 Copy// https://github.com/golang/time/blob/master/rate/rate.go#L55// The methods AllowN, ReserveN, and WaitN consume n tokens. type Limiter struct {mu sync.Mutexlimit Limit // 放入 token 的速率burst int // 令牌桶限制最大值tokens float64 // 桶中令牌数// last is the last time the limiters tokens field was updatedlast time.Time// lastEvent is the latest time of a rate-limited event (past or future)lastEvent time.Time } 限流器构造方法func NewLimiter(r Limit, b int) *Limiter r 产生 token 的速率。默认是每秒中可以向桶中生产多少 token。也可以设置这个值用方法 Every 设置 token 速率时间粒度。b 桶的容量桶容纳 token 的最大数量。 b 0允许声明容量为 0 的值这时拒绝所有请求与 b 0 情况相反如果 r 为 inf 时将允许所有请求即使是 b 0。 Copy// Inf is the infinite rate limit; it allows all events (even if burst is zero). const Inf Limit(math.MaxFloat64) It implements a “token bucket” of size b, initially full and refilled at rate r tokens per second. 构造器一开始会为桶注入 b 个 token然后每秒补充 r 个 token。 每秒生成 20 个 token桶的容量为 5代码为 Copylimiter NewLimiter(20, 5) 200ms 生成 1 个 token 这时候不是秒为单位生成 token 就可以使用 Every 方法设置生成 token 的速率 Copylimit : Every(200 * time.Millisecond) limiter : NewLimiter(limit, 5) 1秒 200ms * 5也就是每秒生成 5 个 token。 生成了 token 之后请求获取 token然后使用 token。 1.3 time/rate 有3种限流用法 time/rate 源码里注释消费 n 个 tokens 的方法 // The methods AllowN, ReserveN, and WaitN consume n tokens. AllowNReserveNWaitN A. WaitN、Wait WaitN / Wait 方法 Copy// https://pkg.go.dev/golang.org/x/time/rate#Limiter.WaitN // WaitN blocks until lim permits n events to happen. // It returns an error if n exceeds the Limiters burst size, the Context is // canceled, or the expected wait time exceeds the Contexts Deadline. // The burst limit is ignored if the rate limit is Inf. func (lim *Limiter) WaitN(ctx context.Context, n int) (err error)func (lim *Limiter) Wait(ctx context.Context) (err error) WaitN 当桶中的 token 数量小于 N 时WaitN 方法将阻塞一段时间直到 token 满足条件或超时或取消(如果设置了context)超时或取消将返回error。如果 N 充足则直接返回。 Wait 就是 WaitN 方法中参数 n 为 1 时即WaitN(ctx, 1)。 方法里还有 Contex 参数所以也可以设置 Deadline 或 Timeout来决定 Wait 最长时间。比如下面代码片段 Copy ctx, cancel : context.WithTimeout(context.Background(), time.Second * 5)defer cancel()err : limiter.WaitN(ctx, 2) 例子1 Copypackage mainimport (contextfmttimegolang.org/x/time/rate )func main() {limit : rate.NewLimiter(3, 5) // 每秒产生 3 个token桶容量 5ctx, cancel : context.WithTimeout(context.Background(), time.Second*5)defer cancel() // 超时取消for i : 0; ; i { // 有多少令牌直接消耗掉fmt.Printf(%03d %s\n, i, time.Now().Format(2006-01-02 15:04:05.000))err : limit.Wait(ctx)if err ! nil { // 超时取消 err ! nilfmt.Println(err: , err.Error())return // 超时取消退出 for}} } 分析这里指定令牌桶大小为 5每秒生成 3 个令牌。for 循环消耗令牌产生多少令牌都会消耗掉。 从开始一直到 5 秒超时计算令牌数一开始初始化 NewLimiter 的 5 个 每秒 3 个令牌 * 5秒 总计 20 个令牌。运行程序输出看看 Copy$ go run .\waitdemo.go 000 2022-05-17 21:35:38.400 001 2022-05-17 21:35:38.425 002 2022-05-17 21:35:38.425 003 2022-05-17 21:35:38.425 004 2022-05-17 21:35:38.425 005 2022-05-17 21:35:38.425 006 2022-05-17 21:35:38.773 007 2022-05-17 21:35:39.096 008 2022-05-17 21:35:39.436 009 2022-05-17 21:35:39.764 010 2022-05-17 21:35:40.106 011 2022-05-17 21:35:40.434 012 2022-05-17 21:35:40.762 013 2022-05-17 21:35:41.104 014 2022-05-17 21:35:41.430 015 2022-05-17 21:35:41.759 016 2022-05-17 21:35:42.104 017 2022-05-17 21:35:42.429 018 2022-05-17 21:35:42.773 019 2022-05-17 21:35:43.101 err: rate: Wait(n1) would exceed context deadline B: AllowN、Allow AllowN / Allow 方法 Copy// https://pkg.go.dev/golang.org/x/time/rate#Limiter.AllowN // AllowN reports whether n events may happen at time now. // Use this method if you intend to drop / skip events that exceed the rate limit. // Otherwise use Reserve or Wait. func (lim *Limiter) AllowN(now time.Time, n int) bool// Allow is shorthand for AllowN(time.Now(), 1). func (lim *Limiter) Allow() bool AllowN 截止到某一时刻桶中的 token 数量至少为 N 个满足就返回 true同时从桶中消费 n 个 token反之返回 false不消费 token。这个实际就是丢弃某些请求。 Allow 就是 AllowN 方法中参数 now 为现在时间n 为 1即 AllowN(time.Now(), 1) 例子 Copypackage mainimport (fmtnet/httptimegolang.org/x/time/rate )func main() {r : rate.Every(1 * time.Millisecond)limit : rate.NewLimiter(r, 10)http.HandleFunc(/, func(w http.ResponseWriter, r *http.Request) {if limit.Allow() {fmt.Printf(success当前时间%s\n, time.Now().Format(2006-01-02 15:04:05))} else {fmt.Printf(success但是被限流了。。。\n)}})fmt.Println(http start ... )_ http.ListenAndServe(:8080, nil)} 然后你可以找一个 http 测试工具模拟用户压测下比如 https://github.com/rakyll/hey 这个工具。测试命令 Copyhey -n 100 http://localhost:8080/ 就可以看到输出的内容 … … success当前时间2022-05-17 21:41:44 success当前时间2022-05-17 21:41:44 success当前时间2022-05-17 21:41:44 success但是被限流了。。。 success但是被限流了。。。 … … 例子2 Copypackage mainimport (fmttimegolang.org/x/time/rate )func main() {limit : rate.NewLimiter(1, 3)for {if limit.AllowN(time.Now(), 2) {fmt.Println(time.Now().Format(2006-01-02 15:04:05))} else {time.Sleep(time.Second * 3)}} } CReserveN、Reserve ReserveN / Reserve 方法 Copy// https://pkg.go.dev/golang.org/x/time/rate#Limiter.ReserveN // ReserveN returns a Reservation that indicates how long the caller must wait before n events happen. The Limiter takes this Reservation into account when allowing future events. The returned Reservation’s OK() method returns false if n exceeds the Limiters burst size. func (lim *Limiter) ReserveN(now time.Time, n int) *Reservationfunc (lim *Limiter) Reserve() *Reservationfunc (r *Reservation) DelayFrom(now time.Time) time.Duration func (r *Reservation) Delay() time.Duration func (r *Reservation) OK() bool 其实上面的 WaitN 和 AllowN 都是基于 ReserveN 方法。具体可以去看看这 3 个方法的源码。 ReserveN 此方法返回 *Reservation 对象。你可以调用该对象的 Dealy 方法获取延迟等待的时间。如果为 0则不用等待。必须等到等待时间结束后才能进行下面的工作。 或者如果不想等待可以调用 Cancel 方法该方法会将 Token 归还。 Reserve 就是 ReserveN 方法中参数 now 为现在时间n 为 1即 AllowN(time.Now(), 1) usage example: Copy// https://pkg.go.dev/golang.org/x/time/rate#Limiter.ReserveNr : lim.ReserveN(time.Now(), 1) if !r.OK() {// Not allowed to act! Did you remember to set lim.burst to be 0 ?return } time.Sleep(r.Delay()) Act() // 执行相关逻辑 1.4 动态设置桶token容量和速率 SetBurstAt / SetBurst Copyfunc (lim *Limiter) SetBurstAt(now time.Time, newBurst int) func (lim *Limiter) SetBurst(newBurst int) SetBurstAt 设置到某时刻桶中 token 的容量 SetBurstSetBurstAt(time.Now()) SetLimitAt / SetLimit Copyfunc (lim *Limiter) SetLimitAt(now time.Time, newLimit Limit) func (lim *Limiter) SetLimit(newLimit Limit) SetLimitAt 设置某刻 token 的速率 SetLimit 设置 token 的速率 二、uber 的 rate limiter 2.1 简介 uber 的这个限流算法是漏桶算法leaky bucket - github.com/uber-go/ratelimit。 与令牌桶算法的区别 漏桶算法流出的速率可以控制流进桶中请求不能控制令牌桶算法对于流入和流出的速度都是可以控制的因为令牌可以自己生成。所以它还可以应对突发流量。突发流量生成 token 就快些。令牌桶算法只要桶中有 token 就可以一直消费漏桶是按照预定的间隔顺序进行消费的。 2.2 使用 官方的例子 Copylimit : ratelimit.New(100) // 每秒钟允许100个请求prev : time.Now()for i : 0; i 10; i {now : limit.Take()fmt.Println(i, now.Sub(prev))prev now } 限流器每秒可以通过 100 个请求平均每个间隔 10ms。 2.3 uber 对漏桶算法的改进 在传统的漏桶算法每个请求间隔是固定的然而在实际应用中流量不是这么平均的时而小时而大对于这种情况uber 对 leaky bucket 做了一点改进引入 maxSlack 最大松弛量的概念。 举例子比如 3 个请求请求 1 完成15ms后请求 2 才到来可以对 2 立即处理。请求 2 完成后5ms后请求 3 到来这个请求距离上次请求不足 10ms因此要等 5ms。 但是对于这种情况实际三个请求一共耗时 25ms 才完成并不是预期的 20ms。 uber 的改进是可以把之情请求间隔比较长的时间匀给后面的请求使用只要保证每秒请求数即可。 uber ratelimit 改进代码实现 Copyt.sleepFor t.perRequest - now.Sub(t.last) if t.sleepFor 0 {t.clock.Sleep(t.sleepFor)t.last now.Add(t.sleepFor)t.sleepFor 0 } else {t.last now } 把每个请求多余出来的等待时间累加起来以给后面的抵消使用。 其他参数用法 WithoutSlack ratelimit 中引入最大松弛量默认的最大松弛量为 10 个请求的间隔时间。 但是我不想用这个最大松弛量呢就要限制请求的固定间隔时间用 WithoutSlack 这个参数限制 Copylimit : ratelimit.New(100, ratelimit.WithoutSlack) WithClock(clock Clock) ratelimit 中时间相关计算是用 go 的标准时间库 time如果想要更高进度或特殊需求计算可以用 WithClock 参数替换实现 Clock 的 interface 就可以了 Copytype Clock interface {Now() time.TimeSleep(time.Duration) }clock MyClock{} limiter : ratelimit.New(100, ratelimit.WithClock(clock)) 更多 ratelimit 三、其他限流器算法库包和软件 滴滴的 tollboothhttp 限流中间件有很多特性 1.基于IP路径方法header授权用户等限流2.通过使用 LimitByKeys() 组合你自己的中间件3.对于head项和基本auth能够设置TTL-过期时间4.拒绝后可以使用以下 HTTP 头响应比如 X-Rate-Limit-Limit The maximum request limit5.当限流达到上限可以自定义消息和方法返回信息6.它是基于 golang.org/x/time/rate 开发 java 的 guava 限流 ratelimiter 基于信号量限流 https://github.com/golang/net/blob/master/netutil/listen.go sentinel-go 服务治理软件以及sentinel https://github.com/alibaba/sentinel-golanggithub.com/alibaba/Sentinel java编写的流控组件服务治理 还有各种基于 nginx 的限流器限流软件-服务网关api gateway等 四、参考 https://github.com/golang/timepkg.go.dev/golang.org/x/time/ratehttps://zhuanlan.zhihu.com/p/100594314https://segmentfault.com/a/1190000023033365https://www.cyhone.com/articles/usage-of-golang-rate/https://www.cyhone.com/articles/analysis-of-uber-go-ratelimituber ratelimit vs go time/rate demouber-go ratelimit
http://www.zqtcl.cn/news/153691/

相关文章:

  • 济南网站APPwordpress零基础建站教程视频
  • nodejs和wordpress福建seo快速排名优化
  • 网站开发的主要工作步骤页面跳转流程图
  • 医院网站源码 asp网站店招用什么软件做的
  • 怎样做网站权重龙岗网站制作讯息
  • 谁可以教我做网站网页编辑工具是什么
  • 义乌网站建设费用多少建设网站套餐
  • 济南高端网站环保网站建设项目备案系统
  • 办公门户网站模板WordPress怎么两个标题
  • 做网站 域名是怎么回事邢台163交友手机端
  • 台州免费做网站公司资质查询官方网站
  • 网站开发常用数据库江苏大才建设集团网站
  • WordPress多站点恢复石家庄住房城乡建设网站
  • 怎么免费做网站教程手机网站开发项目
  • 临沂做网站需要多少钱甘肃兰州地震最新消息刚刚
  • 怎么把网站封包做appwordpress葬爱导航
  • 浙江省建设厅门户网站菠菜网站如何做推广
  • 飞鸽网站建设网站建设源代码交付
  • 阿里云服务器做盗版电影网站wordpress密码访问
  • 本机可以做网站的服务器吗做磨毛布内销哪个网站比较好
  • 免费建站系统wordpress一个网站需要什么
  • 移动端网站制作的有哪些要求百度广告投放价格表
  • 网站建设互联网推广广告设计公司业务范围
  • 昆明网站关键词优化沪佳装修公司全部门店
  • 南阳卧龙区2015网站建设价格快三直播十大平台直播间
  • 网站谁做的wordpress 空白页面
  • 专业的佛山网站建设公司Wordpress 帖子翻译
  • 南昌网站建设公司网站建设公司深圳企业网站模板
  • 一家做特卖的网站docker创建wordpress
  • 网站开发设计电子书网站后台无法更新缓存