时钟轮 TimingWheel ~ 延迟队列 ~ 将每个定时任务放到对应的时间槽位上,这样可以减少扫描任务时对其它时间槽位定时任务的额外遍历操作
不好的实践:每个请求对应一个线程sleep or 一个线程定时扫描所有
用在哪儿 ~ 调用端请求超时处理,调用端与服务端超时,定时心跳等
~ kafka中配置了 acks=all 的生产者发送的请求可能一时无法完成,因为 Kafka 必须确保 ISR 中的所有副本都要成功响应这次写入。因此,通常情况下,这些请求没法被立即处理。只有满足了条件或发生了超时,Kafka 才会把该请求标记为完成状态。这就是所谓的延时请求
类型 ~ 简单的 or 分层的(下一层的时间轮中每个槽位的单位时间是当前时间轮整个周期的时间,当时钟轮的第一个周期所有槽位跳动完之后,就会从下一个时钟轮取出一个槽位的任务,重新分布到当前时钟轮中,当前时钟轮则从第0槽位重新开始跳动)
Bucket(每个桶下是双向循环链表保存延迟请求)、tick