到底是定时请求还是WebSocket?
针对究竟使用定时请求还是WebSocket,从是否会引起内存泄露、需要水平扩展/负载均衡怎么处理,会话管理方面进行分析。
内存泄露
定时请求
定时请求是否会导致内存泄漏?
内存泄漏是指程序中动态分配的内存空间未被及时释放,导致该内存空间无法再被程序使用,最终导致程序运行时消耗的内存越来越多,直到达到系统可用内存的上限而崩溃。
通过setTimeout()或setInterval()来创建定时器时,如果不及时清除定时器会导致内存泄漏。
WebSocket
WebSocket是否会导致内存泄漏情况?
springboot整合Tomcat9可能出现CPU过高,OOM情况。同时,后端使用tomcat里面的设置每次通讯都会new一个buffer,要调整buffer大小,避免频繁gc等。
负载均衡
如果需要考虑水平扩展/启动一个新的服务实例,对于无状态的微服务非常有效,有状态的微服务来说,扩展并不像这么简单。
WebSocket
+Nginx:将每个路径反向代理到其对应的服务器,将连接从HTTP升级到WebSocket。
会话管理
WebSocket
WebSocket是有状态连接,如果断开需要考虑重连等情况。做不做心跳连接
WebSocket断开的原因
- 网络问题:网络不稳定、掉线延迟大
- 服务器问题:服务器宕机、服务器过载过大、服务器资源不足
- 没有正确处理WebSocket断开的情况。
- 协议问题,WebSocket协议版本不兼容,握手失败等。
- 防火墙设置不当等其他。
WebSocket断网重连三个步骤:
- 确定合适需要重连
- 断开旧连接
- 发起新连接
重连时需要采用一些退避算法,延迟一段时间再发起重连,避免所有设备立即同时向服务器发起连接。
参考