如果今天不努力,明天也不努力,那么人生只是在重复而已。(心不定,难成事)

时间轮片(Timing Wheel)实现心跳机制

编程算法 Sam 289℃

在使用长连接的时候,我们通常需要使用心跳机制来防止意外断开的无效连接浪费系统资源。

心跳机制的实现常用的有两种:

第一:每一个客户端连接上时,就创建一个定时器,如果在指定时间内没有收到客户端发来的心跳,那么该定时器就将连接断开。如果收到,则重置定时器,重新计时。

但是在连接数量上万,甚至数十万百万时,定时器的数量也将有数十万甚至百万个,极大的耗费系统资源,甚至拖垮整个系统,因此这种方式适用于连接数量不多的情况。

第二:使用时间轮片(Timing Wheel)算法来实现心跳。具体实现如下:

假设心跳时长为60秒,那么我们就创建一个长度为60的循环队列(实际上就是个数组),队列中每个位置标号为1-60。

然后设置一个定时器,从标号为1的位置开始,像时钟一样顺时针行走,1秒走1格。

假设现在时钟已经走到了3的位置,此时有一个连接连上时,就将该连接放置于一圈之后的位置(即2的位置),60秒后时钟将走到这个位置,将该连接断开。

如果在60秒内(假设时钟此时走到了30的位置),该连接有心跳发来,那么我们就将这个连接从2的位置取出来,放到29的位置。

按照这样的步骤,只要客户端在每60秒内都发来一次心跳,那么该连接永远不会被定时器给断开。反之,定时器时钟走到连接所在的位置就会断开这个位置上所有的连接。

用这种方式,无论有多少个连接,都只需要一个定时器。并且不需要循环所有连接一个个去判断是否需要断开。

转载请注明:PHP笔记 » 时间轮片(Timing Wheel)实现心跳机制

喜欢 (1)