V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
guch99999
V2EX  ›  Java

求教 springcloud 集成 websocket 报错 1009.

  •  
  •   guch99999 · 148 天前 · 1020 次点击
    这是一个创建于 148 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求教 springcloud 集成 websocket 报错 1009.

    现在请求链路是前端 websocket-client->springcloud gateway(7000)-> websocket server ( port:7100 ) 我通过 gateway 进行转发,我的 websocket 主要推送的是视频流数据, 如果直接前端访问 websocket server 服务没有问题,但是访问网关服务 前端 websocket 会断开,会报下面错误 'No async message support and buffer too small. Buffer size: [8,192], Message size: [11,296]'

    8 条回复
    kivmi
        1
    kivmi  
       148 天前
    gateway 是 spring cloud 的 gateway 么?首先得看 websocket 是谁跟谁建立的连接吧
    guch99999
        2
    guch99999  
    OP
       147 天前
    @kivmi 是 springcloud 的 gateway ,websocket 是直接访问 gateway ,gateway 转发给对应的服务
    jov1
        3
    jov1  
       147 天前
    WebSocket 缓冲区小,传入数据太大,试试找的例子,构建 websocket 客户端连接的时候,配置下大小

    WebSocketContainer container = new WsWebSocketContainer();
    // 设置二进制消息缓冲区大小(以字节为单位)
    container.setDefaultMaxBinaryMessageBufferSize(5120000);
    // 设置文本消息缓冲区大小(以字节为单位)
    container.setDefaultMaxTextMessageBufferSize(5120000);
    // 设置会话空闲超时时间(以毫秒为单位)
    container.setDefaultMaxSessionIdleTimeout(15 * 60000L);
    StandardWebSocketClient client = new StandardWebSocketClient(container);
    coala
        4
    coala  
       147 天前
    好熟悉.. websocket 走 SpringCloudGateway 传大量的数据是有不少问题的,

    我之前遇到过不支持压缩的问题,不知道现在好没有, 见 https://www.v2ex.com/t/938806

    1009 是服务端的问题,我之前是设置 session 最大值解决的, 我的原因是单个包太大。

    session.setBinaryMessageSizeLimit(WebSocketConfig.MAX_SIZE);
    session.setTextMessageSizeLimit(WebSocketConfig.MAX_SIZE);

    好像是和#3 类似的解决办法,我用的是 org.springframework.web.socket.WebSocketSession , 你测下类似的思路呢?
    coala
        5
    coala  
       147 天前
    另外 TCP 因为不能丢包的原因,视频流支持的其实很烦,我之前测试了 WebRTC 的方案, 效果还挺不错的,可惜没机会实战。

    直接用 Nginx 负载 Websocket 坑应该会少写,SpringCloudGateway 首先要保证业务的可用性, 视频的流量和 HTTP 的在一起, 带宽和负载都可能影响到业务。 感觉分开比较好。
    guch99999
        6
    guch99999  
    OP
       147 天前
    @coala 找到问题了。 看了下 gateway 转发 websocket 的源码以及做了测试发现,gateway 用的是 webflux 其实代理了一个 websocket 客户端和我的服务端进行通信,gateway 默认用的是 ReactorNettyWebSocketClient 其中默认的 netty buffer 缓存区大小是 maxFramePayloadLength 65536 (这也是网上好多教程让我设置这个参数的原因,但是我没有用), 我之前转发 websocket 出现了错误,改成了 TomcatWebSocketClient (这时候就是用 tomcat 默认的缓存大小 org.apache.tomcat.websocket.DEFAULT_BUFFER_SIZE 即 8*1024 ),所以我就奇怪了明明我大小没有超过 65536 就报错。。。
    guch99999
        7
    guch99999  
    OP
       147 天前
    @coala 至于兄弟你说的 nginx 负载后面我也可以试下
    guch99999
        8
    guch99999  
    OP
       147 天前
    现在还有其他坑, 擦 gateway 支持 websocket 这么多坑吗。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5484 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:51 · PVG 14:51 · LAX 22:51 · JFK 01:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.