部署Saber到测试环境,浏览器点击刷新会后,导致mqtt(走的ws协议)连接失败,重连不上

Saber 未结 1 1235
294604621
294604621 剑圣 2021-03-27 16:52

一、该问题的重现步骤是什么?

  1. 测试环境:Saber中连接mqtt broker服务,在main.js进行全局初始化连接后,连接成功,我在其他Vue页面就可以直接调用到 client对象,发送,订阅消息,但是在页面点击浏览器的刷新,连接就中断了,重连一直失败( WebSocket connection to 'ws://xxx.xxx.xxx.xxx:59001/' failed: Connection closed before receiving a handshake response)

  2. 本地环境:运行前端Saber项目,同样的操作进入页面,在浏览器点击刷新,无论在那个页面刷新,都能正常重连上去

  3.


二、你期待的结果是什么?实际看到的又是什么?

    我期待的结果是:Saber部署在线上后,也能向本地一样刷新,连接断开后,mqtt client 能正常重连到 服务器上去。


三、你正在使用的是什么产品,什么版本?在什么操作系统上?


        前端使用的是 Saber 。后端是Bladex 2.7,,运行在Linux  环境centos7 系统中,通过  docker 部署的


四、请提供详细的错误堆栈信息,这很重要。

        代码信息:

                mqtt配置信息:

= = =

                option信息:

                    

: {
  : ,
  : ,
  : returnCitySN++v4, : MQTT_USERNAME,
  : MQTT_PASSWORD,
  : ,
  : ,
  : ,
  : ,
  },

    

            mqtt连接方法:

{
  console...;= mqtt.MQTT_SERVICE, .

            

            

        网页加载初始化:

            image.png



        线上的环境:刷新后的结果

            

1222.png



        本地环境:刷新后的结果


            33.png





五、若有更多详细信息,请在下面提供。

        本地和线上连的都是同一个 mqtt broker(不是部署在docker中的),然后broker 该设置,该开启的东西,都开启了,NGINX也加了关于 websocket相关的配置信息。没有得到想要的结果,所以无奈只能来这里咨询一下,个人猜测是,前端路由还是NGINX 需要配置什么东西 ,还望回复,谢谢



1条回答
  • 2021-03-28 23:21

    经过一系列的排查,问题暂时采用了粗暴的解决方式,注释掉

    setRefreshToken(refreshToken)

    这个保存r刷新的token到cookie中的方法。


    排查到的问题是:

        mqtt 走的是ws协议,Vue中采用websocket去连接的 mqtt的broker,通过抓包得到websocket连接之前会发http请求握手,携带了域中的cookie,导致broker服务验证tcp的时候,超过了长度(这个可能是broker的bug还是什么原因,暂时没有去查看源码),主动断开了websocket连接,所以前端一直提示Connection closed before receiving a handshake response。

    这是抓包图:mqtt.png


    加上当时登陆了定时任务后台,cookie总长度达到了 4000多,超过了mosquitto(broker) 的 1400多


    所以简单的解决方式,退出定时任务后台登陆,注释了上面的代码部分,在浏览器刷新页面,就能正常重连了。上面是目前的解决方式,后续查看mosquitto源码




    0 讨论(0)
提交回复