WHAT: 什么是长连接
长连接: TCP, 默认不断开,用keep alive心跳包保活;
持久连接: HTTP 1.1+ keep alive, 默认断开。
短连接: 普通HTTP
WHY: 长连接有什么好处? 为什么要使用长连接
- 不同域名可以复用一个长连接; (HTTP不行)
- 不依赖DNS,节省DNS开销、避免DNS劫持;(HTTP不行)
- 减少握手时间开销;
- 可以push消息;
HOW: 如何实现一个好的长连接? (难点何在)
难点1 长连接断开
导致断开的原因:
- 各个环节的超时时间不匹配; – 动态探测合适的超时时间;
- 后台服务; – 或者服务主备切换
- app后台进程挂了; – app保活课题
- 切换网络;
难点2 机器资源
1亿长连接:
10w / 台 => 1000台机器
200w / 台 => 50台机器
20%活跃度=> 总共需要2kw连接;
2000w => 10台~200台;
连接限制:
- 网卡限制: 网卡带宽、每秒通信量;
- 内核限制: 每个进程最大打开文件句柄数; (NR_OPEN =100w)
- 内存限制: TCP的发送、输出缓冲;
假设一台机器抗200w个连接,则网卡需要:
200w1KB/s = 2000MB/s = 16 Gps
假设平均20%活跃,则0.2 = 3.2 Gps
依此类推内存。
难点3 惊群效应
cpu: 100%thundering herd
: 唤醒一群进程,只有一个进程工作,其他的又继续睡;反复这个流程。
多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应。
实现要点
- 处理好上述长连接断开的4个原因,保证服务质量;
- 进行断开重连: 监控+重连。
- 架构容灾:
(1) 多地部署接入点;
(2) 长连接失败则降级到udp\http;