定时器方案(二)之时间轮原理 详解

时间轮原理与应用
本文详细介绍了时间轮数据结构的工作原理及其在限流与熔断等场景中的应用。通过单层级与多层级时间轮的对比,阐述了如何选择合适的时间精度和时间轮大小,以及如何解决空推进问题。

img

时间轮

类似于时钟,秒针走一圈,分针前进一格
skynet、netty与kafka用的是时间轮

单层级的时间轮

用于实现时间窗口(如tcp滑动窗口)的限流与熔断
假设检测5秒内是否有100次操作
限流: 每秒都查看最近五秒是否有100次操作
熔断:每过五秒查看这五秒有没有100次操作
显而易见的,限流更加准确,但是很耗费时间,熔断没那么准确,但是相对来说没那么耗时间
熔断的应用:
 DDos攻击:
  客户端不断发送大量数据给服务器的过程为DDos攻击
 解决办法:
  在网络底层用DPDK判断
  在应用层用熔断机制判断规定时间内客户端发送的数据包是否大于最大上限

单层级时间轮应用场景(以下例子为简单假设)

场景:
 客户端每五秒发送心跳包,服务端10秒内没收到心跳数据就清除连接。假设使用map<int,conn*>来存储所有连接数,每秒遍历map,检测出失效的连接。但如果有上万条数据,那么很容易做出很多无效操作,如:刚添加连接的客户端,刚好遇到遍历map,那么就是无效的,正确操作应该是10秒后检测。
时间轮应用:
考虑的点:时间轮的大小,时间精度
 在上述场景中实现如下图的时间轮,数组长度为8,数组中的元素为链表,链表指向客户端连接,假设现在处理的是第四组客户端链表,新加进来的客户端放在第6((4+10)%8)组客户端链表中,等处理到数组下标为6的客户端链表是进行心跳包检测。
在这里插入图片描述

 时间轮大小即数组大小,时间精度即数组元素占的时间大小(上面是一秒处理一个)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值