3712486 博客园 首页 新随笔 联系 订阅 管理 socket心跳超时检测,快速处理新思路(适用于超大量TCP连接情况下)

 假设一种情景:TCP服务器有1万个客户端连接,如果客户端5秒钟不发数据,则要断开。服务端如何检测客户端是否超时?这看起来是一个非常简单的问题,其实不然!

最简单的处理方法是:启动一个线程,每隔一段时间,检查每个连接是否超时。每次处理需要1万次检查。计算量太大!检查的时间间隔不能太小,否则大大增加计算量;如果间隔时间太大,超时误差会增大。

本文提出一种新颖的处理方法,就是针对这个看似简单而不易解决的问题!(以下用socket表示一个客户端连接)

 1 内存布局图

  

 

 假设socket3有新的数据到达,需要更新socket3所在的时间轴,处理逻辑如下:

 

2 处理过程分析:

基本的处理思路就是增加时间轴概念。将socket按最后更新时间排序。因为时间是连续的,不可能将时间分割太细。首先将时间离散,比如属于同一秒内的更新,被认为是属于同一个时间点。离散的时间间隔称为时间刻度,该刻度值可以根据具体情况调整。刻度值越小,超时计算越精确;但是计算量增大。如果时间刻度为10毫秒,则一秒的时间长度被划分为100份。所以需要对更新时间做规整,代码如下:

复制代码
     DateTime CreateNow()         {             DateTime now = DateTime.Now;             int m = 0;              if(now.Millisecond != 0)             {                 if(_minimumScaleOfMillisecond == 1000)                 {                     now = now.AddSeconds(1); //尾数加1,确保超时值大于 给定的值                }                 else                 {                     //如果now.Millisecond为16毫秒,精确度为10毫秒。则转换后为20毫秒                    m = now.Millisecond - now.Millisecond % _minimumScaleOfMillisecond + _minimumScaleOfMillisecond;                     if(m>=1000)                     {                         m -= 1000;                         now = now.AddSeconds(1);                     }                 }             }             return new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second,m);         }
复制代码

属于同一个时间刻度的socket,被放入在一个哈希表中(见图中Group)。存放socket的类如下:

复制代码
 class SameTimeKeyGroup<T>     {         DateTime _timeStamp;         public DateTime TimeStamp => _timeStamp;         public SameTimeKeyGroup(DateTime time)         {             _timeStamp = time;         }         public HashSet<T> KeyGroup { get; set; } = new HashSet<T>();          public bool ContainKey(T key)         {             return KeyGroup.Contains(key);         }          internal void AddKey(T key)         {             KeyGroup.Add(key);         }         internal bool RemoveKey(T key)         {            return  KeyGroup.Remove(key);         }     }
复制代码

 定义一个List表示时间轴:

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信