时间轮
类似于时钟,秒针走一圈,分针前进一格
skynet、netty与kafka用的是时间轮
单层级的时间轮
用于实现时间窗口(如tcp滑动窗口)的限流与熔断
假设检测5秒内是否有100次操作
限流: 每秒都查看最近五秒是否有100次操作
熔断:每过五秒查看这五秒有没有100次操作
显而易见的,限流更加准确,但是很耗费时间,熔断没那么准确,但是相对来说没那么耗时间
熔断的应用:
DDos攻击:
客户端不断发送大量数据给服务器的过程为DDos攻击
解决办法:
在网络底层用DPDK判断
在应用层用熔断机制判断规定时间内客户端发送的数据包是否大于最大上限
单层级时间轮应用场景(以下例子为简单假设)
场景:
客户端每五秒发送心跳包,服务端10秒内没收到心跳数据就清除连接。假设使用map<int,conn*>来存储所有连接数,每秒遍历map,检测出失效的连接。但如果有上万条数据,那么很容易做出很多无效操作,如:刚添加连接的客户端,刚好遇到遍历map,那么就是无效的,正确操作应该是10秒后检测。
时间轮应用:
考虑的点:时间轮的大小,时间精度
在上述场景中实现如下图的时间轮,数组长度为8,数组中的元素为链表,链表指向客户端连接,假设现在处理的是第四组客户端链表,新加进来的客户端放在第6((4+10)%8)组客户端链表中,等处理到数组下标为6的客户端链表是进行心跳包检测。

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

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

最低0.47元/天 解锁文章
1613

被折叠的 条评论
为什么被折叠?



