长连接相关

WHAT: 什么是长连接

长连接: TCP, 默认不断开,用keep alive心跳包保活;
持久连接: HTTP 1.1+ keep alive, 默认断开。
短连接: 普通HTTP

WHY: 长连接有什么好处? 为什么要使用长连接

  1. 不同域名可以复用一个长连接; (HTTP不行)
  2. 不依赖DNS,节省DNS开销、避免DNS劫持;(HTTP不行)
  3. 减少握手时间开销;
  4. 可以push消息;

HOW: 如何实现一个好的长连接? (难点何在)

难点1 长连接断开

导致断开的原因:

  1. 各个环节的超时时间不匹配; – 动态探测合适的超时时间;
  2. 后台服务; – 或者服务主备切换
  3. app后台进程挂了; – app保活课题
  4. 切换网络;

难点2 机器资源

1亿长连接:
10w / 台 => 1000台机器
200w / 台 => 50台机器

20%活跃度=> 总共需要2kw连接;
2000w => 10台~200台;

连接限制:

  1. 网卡限制: 网卡带宽、每秒通信量;
  2. 内核限制: 每个进程最大打开文件句柄数; (NR_OPEN =100w)
  3. 内存限制: TCP的发送、输出缓冲;

假设一台机器抗200w个连接,则网卡需要:
200w1KB/s = 2000MB/s = 16 Gps
假设平均20%活跃,则
0.2 = 3.2 Gps
依此类推内存。

难点3 惊群效应

cpu: 100%
thundering herd: 唤醒一群进程,只有一个进程工作,其他的又继续睡;反复这个流程。

多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应。

实现要点

  1. 处理好上述长连接断开的4个原因,保证服务质量;
  2. 进行断开重连: 监控+重连。
  3. 架构容灾: (1) 多地部署接入点;
    (2) 长连接失败则降级到udp\http;

推荐文章