springboot + websocket + redis实现多服务器消息主动推送

集成的东西就不多讲了,导入依赖jar包,然后codeing就行了,主要说说过程中遇到的几个坑。

第一个坑就是多服务器的问题,由于项目是多节点通过nginx分发请求来实现的,所以会导致长连接建立在一台服务器上,后续的请求回被分发到另一台服务器上,但是当前服务器并没有建立长连接,导致消息发送不到前端。

首先想到的方法是websocket的session共享,通过将session序列化到redis里来实现,但是websocket的session不支持序列化,这个方法pass。然后想到队列来解决,通过发布消息,然后订阅的流程,这样多台服务器都能订阅到消息,然后都去发送消息,这样就能解决了。但是感觉这个用消息队列太大材小用了,就想到了redis的订阅/发布功能,将消息发不到redis的指定频道上面,然后再redis的配置文件中配置订阅就可以,这样多台服务器定拿到了消息内容,都去发送,只有建立了长连接的那台服务器才能发送成功,这样就解决了多服务器消息发送不准确的问题了。

 

第二个坑是建立长连接在一台服务器上,前端调用send给后台发送消息有可能被分发到另一台服务器上,由于前端隔一分钟会发送一次请求,来确认长连接有没有断,断了的话会进行重连,如果请求被分发到了另一台服务器上的话,这样消息就会发送失败,前台就不能确定是请求分发的问题还是真的是长连接断了。最后采取的解决办法是,nignx固定ip请求到一台服务器上。

 

第三个坑是springboot部署到服务器上启动之后,主程序的run方法之后的代码没有执行,导致websocket需要的应用上下文对象没有注入进去,导致连接websocket报错了。在本地启动项目,主程序的run方法后面的代码是可以执行的,不知道为什么到服务器上就不能执行了,最后采用了远程调试jar包的方法,定位到了错误。解决办法是既然后面的代码不能执行,那就把代码写到run方法的前面去,给springApplication对象添加了一个监听,实现ApplicationListener接口,这样就能在启动的同时拿到应用上下文对象了。

解决了这三个坑之后,websocket多服务器下实现消息的主动推送就完成了。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值