标签「go-zero系列文章,搬自 微服务实践」下的文章
如何让gRPC具备微服务治理能力
基于gRPC的注册发现与负载均衡的原理和实战
熔断原理与实现Golang版
go-zero 如何应对海量定时/延迟任务?
go-zero 如何应对海量定时/延迟任务?
[TOC]
一个系统中存在着大量的调度任务,同时调度任务存在时间的滞后性,而大量的调度任务如果每一个都使用自己的调度器来管理任务的生命周期的话,浪费cpu的资源而且很低效。
本文来介绍 go-zero
中 延迟操作,它可能让开发者调度多个任务时,只需关注具体的业务执行函数和执行时间「立即或者延迟」。而 延迟操作,通常可以采用两个方案:
Timer
:定时器维护一个优先队列,到时间点执行,然后把需要执行的 task 存储在 map 中collection
中的timingWheel
,维护一个存放任务组的数组,每一个槽都维护一个存储task的双向链表。开始执行时,计时器每隔指定时间执行一个槽里面的tasks。
方案2把维护task从 优先队列 O(nlog(n))
降到 双向链表 O(1)
,而执行task也只要轮询一个时间点的tasks O(N)
,不需要像优先队列,放入和删除元素 O(nlog(n))
。