本文是想记录日常开发WebSocket遇到的疑难杂症
问题描述
最近在开发WebSocket发送实时消息的时候,推送的数据转为字节大约290kb左右。推送的时候,postman就会断开链接。
排查思路
问题1
开始的时候能想到,webSocket推送数据大小是有限制的。跟了一下代码发现,它本身默认的字节缓存区为8kb
解决思路
打开session源码 直接有设置缓存区大小的方法
设置之后,第一个问题就可以解决了
问题2
因为是SpringCloud项目,用到了gateway
通过gateway转发传送数据大于64kb时会报错,查看资料发现netty中默认websocket限制大小是64k
报错信息
An exception has been observed post termination, use DEBUG level to see the full stack: io.netty.handler.codec.http.websocketx.CorruptedWebSocketFrameException: Max frame length of 65536 has been exceeded.
默认设置
解决思路
在网上遨游了好久,解决方式一般都重写方法,覆盖默认方法,比较繁琐
由于我的版本如下
<spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
可以配置websocket最大网块,本着试一试的心态做了如下配置
spring:
cloud:
gateway:
httpclient:
websocket:
max-frame-payload-length: 5242880
然后尝试重新发送,问题就顺利解决了
注意
我数据大小是290kb,配置的话都是设置了5M。这个还是根据需求,自定义设置对应的大小。以避免OOM问题