问题:
- 前端使用ios+内嵌webview+vue+websocket实现。
- 早期项目后台使用tomcat部署。
- 当服务器运行一段时间,tomcat会出现连接数过多,导致后续的请求无法响应。
原因:
- app 每个tab 页签都会实例化一个webView ,每个webView都会独立创建websocket,用户切换账户,原来的webView依然保留。
- app 确认支付,取消订单,款式详情,独立单独打开的webView都会建立websocket。
以上方式,除了app 杀死,其他情况均会一直保留创建的webView的socket,导致服务端连接数超过负荷。
解决方案:
1.vue项目优化
取消所有全局的websocket 连接,按需执行websocket的连接。并在返回或取消操作,退出时取消websocket连接。
2.原生优化
- 优化多个tab 页签都会实例化一个webView,只保留一个webView,减少socket创建。
- 在用户切换时候,把tab页面对应的webView对象销毁
- app 确认支付,取消订单,款式详情,所有原生弹出的webView 页面在访问结束后,都统一销毁
3.服务端优化
- 调整为nginx做服务
- 增加tomcat服务的连接数
- 建议引入回收机制,回收长期无响应的websocket连接
备注:
- websocket 在关闭网页时,会自动发起断开websocket操作,即使没有主动发起close()。
- 如果是同一个tab 页面下重复刷新,浏览器会自动断开,并重新连接,所有只有一次连接。