前端ios+websocket导致服务器无法响应

1,452 阅读1分钟

问题:

  • 前端使用ios+内嵌webview+vue+websocket实现。
  • 早期项目后台使用tomcat部署。
  • 当服务器运行一段时间,tomcat会出现连接数过多,导致后续的请求无法响应。

原因:

  1. app 每个tab 页签都会实例化一个webView ,每个webView都会独立创建websocket,用户切换账户,原来的webView依然保留。
  2. app 确认支付,取消订单,款式详情,独立单独打开的webView都会建立websocket。

以上方式,除了app 杀死,其他情况均会一直保留创建的webView的socket,导致服务端连接数超过负荷。

解决方案:

1.vue项目优化

取消所有全局的websocket 连接,按需执行websocket的连接。并在返回或取消操作,退出时取消websocket连接。

2.原生优化

  1. 优化多个tab 页签都会实例化一个webView,只保留一个webView,减少socket创建。
  2. 在用户切换时候,把tab页面对应的webView对象销毁
  3. app 确认支付,取消订单,款式详情,所有原生弹出的webView 页面在访问结束后,都统一销毁

3.服务端优化

  1. 调整为nginx做服务
  2. 增加tomcat服务的连接数
  3. 建议引入回收机制,回收长期无响应的websocket连接

备注:

  1. websocket 在关闭网页时,会自动发起断开websocket操作,即使没有主动发起close()。
  2. 如果是同一个tab 页面下重复刷新,浏览器会自动断开,并重新连接,所有只有一次连接。