HTTP or WebSocket

235 阅读2分钟

到底是定时请求还是WebSocket?

针对究竟使用定时请求还是WebSocket,从是否会引起内存泄露、需要水平扩展/负载均衡怎么处理,会话管理方面进行分析。

内存泄露

定时请求

定时请求是否会导致内存泄漏?

内存泄漏是指程序中动态分配的内存空间未被及时释放,导致该内存空间无法再被程序使用,最终导致程序运行时消耗的内存越来越多,直到达到系统可用内存的上限而崩溃。

通过setTimeout()或setInterval()来创建定时器时,如果不及时清除定时器会导致内存泄漏。

WebSocket

WebSocket是否会导致内存泄漏情况?

springboot整合Tomcat9可能出现CPU过高,OOM情况。同时,后端使用tomcat里面的设置每次通讯都会new一个buffer,要调整buffer大小,避免频繁gc等。

负载均衡

如果需要考虑水平扩展/启动一个新的服务实例,对于无状态的微服务非常有效,有状态的微服务来说,扩展并不像这么简单。

WebSocket

+Nginx:将每个路径反向代理到其对应的服务器,将连接从HTTP升级到WebSocket。

会话管理

WebSocket

WebSocket是有状态连接,如果断开需要考虑重连等情况。做不做心跳连接

WebSocket断开的原因

  1. 网络问题:网络不稳定、掉线延迟大
  2. 服务器问题:服务器宕机、服务器过载过大、服务器资源不足
  3. 没有正确处理WebSocket断开的情况。
  4. 协议问题,WebSocket协议版本不兼容,握手失败等。
  5. 防火墙设置不当等其他。

WebSocket断网重连三个步骤:

  1. 确定合适需要重连
  2. 断开旧连接
  3. 发起新连接

重连时需要采用一些退避算法,延迟一段时间再发起重连,避免所有设备立即同时向服务器发起连接。

参考

  1. www.geeksforgeeks.org/what-is-web…
  2. www.zhihu.com/question/41…
  3. Create multiple websocket server with one port number