go-zero如何应对海量定时/延迟任务-创新互联

一个系统中存在着大量的调度任务,同时调度任务存在时间的滞后性,而大量的调度任务如果每一个都使用自己的调度器来管理任务的生命周期的话,浪费cpu的资源而且很低效。

站在用户的角度思考问题,与客户深入沟通,找到韶山网站设计与韶山网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、网站制作、企业官网、英文网站、手机端网站、网站推广、域名注册网站空间、企业邮箱。业务覆盖韶山地区。

本文来介绍 go-zero 中 延迟操作,它可能让开发者调度多个任务时,只需关注具体的业务执行函数和执行时间「立即或者延迟」。而 延迟操作,通常可以采用两个方案:

Timer:定时器维护一个优先队列,到时间点执行,然后把需要执行的 task 存储在 map 中collection 中的 timingWheel ,维护一个存放任务组的数组,每一个槽都维护一个存储task的双向链表。开始执行时,计时器每隔指定时间执行一个槽里面的tasks。

方案2把维护task从 优先队列 O(nlog(n)) 降到 双向链表 O(1),而执行task也只要轮询一个时间点的tasks O(N),不需要像优先队列,放入和删除元素 O(nlog(n))

我们先看看 go-zero 中自己对 timingWheel 的使用 :

cache 中的 timingWheel

首先我们先来在 collectioncache 中关于 timingWheel 的使用:

timingWheel, err := NewTimingWheel(time.Second, slots, func(k, v interface{}) {
 key, ok := k.(string)
 if !ok {
  return
 }
 cache.Del(key)
})
if err != nil {
 return nil, err
}

cache.timingWheel = timingWheel

文章名称:go-zero如何应对海量定时/延迟任务-创新互联
文章路径:http://bzwzjz.com/article/gjjcs.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 手机网站制作 高端品牌网站建设 成都网站建设公司 营销网站建设 广安网站设计 成都网站建设 成都h5网站建设 成都网站制作 定制网站设计 重庆网站制作 品牌网站建设 攀枝花网站设计 成都做网站建设公司 成都网站设计 网站建设 成都网站设计 成都定制网站建设 成都营销网站建设 盐亭网站设计 成都网站设计 成都网站建设 手机网站建设套餐