多台服务器怎么共享websocket

zhangdifeng 2016-07-17 03:48:55
【需求】
实现1对1的聊天系统。

【现状】
客户端发起websocket请求,tomcat后端通过Map<String key, List websockets>保存websocket连接。
p.s. String key代表聊天组,List websockets代表聊天成员

客户端发送信息时,服务器在同一聊天组内把信息广播给其他成员。

至今在1台tomcat上面运行良好。

【问题】
为了提高可用性,需要部署2台tomcat。
同一聊天组的user1的websocket保存在tomcat1中,user2的websocket保存在tomcat2中。
这样的话,上面描述 的方案将无法正常通讯。

请问有什么解决方案???

...全文
12070 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
重口味码农 2019-07-08
  • 打赏
  • 举报
回复
引用 20 楼 殇城林 的回复:
[quote=引用 19 楼 重口味AC 的回复:] [quote=引用 18 楼 qq_36159216 的回复:] Redis 序列化之后存进去,然后两个服务器共享
这和http session不一样,webSocketSession一是无法序列化,二是它是在一台服务器保持TCP连接,另一台服务器拿到数据也不能通信。所以上面那些说共享session的都是不行的。 我试了,两个办法,一个是用redis作发布、订阅,所有socket都订阅一个消息。第二种方法是用jgroups作集群组播通信,互相通知。类似的还有MQ等等。[/quote] 我们2台应用服务器, 现在就是用的nginx iphash转发到对应的服务器上。 可以保证客户端推送消息到对应的客户端吧?[/quote] iphash是一种办法,只要能保证同一个客户端的请求打到同一个服务器就可以
in the way 2019-07-07
  • 打赏
  • 举报
回复
引用 19 楼 重口味AC 的回复:
[quote=引用 18 楼 qq_36159216 的回复:] Redis 序列化之后存进去,然后两个服务器共享
这和http session不一样,webSocketSession一是无法序列化,二是它是在一台服务器保持TCP连接,另一台服务器拿到数据也不能通信。所以上面那些说共享session的都是不行的。 我试了,两个办法,一个是用redis作发布、订阅,所有socket都订阅一个消息。第二种方法是用jgroups作集群组播通信,互相通知。类似的还有MQ等等。[/quote] 我们2台应用服务器, 现在就是用的nginx iphash转发到对应的服务器上。 可以保证客户端推送消息到对应的客户端吧?
重口味码农 2019-04-04
  • 打赏
  • 举报
回复
引用 18 楼 qq_36159216 的回复:
Redis 序列化之后存进去,然后两个服务器共享
这和http session不一样,webSocketSession一是无法序列化,二是它是在一台服务器保持TCP连接,另一台服务器拿到数据也不能通信。所以上面那些说共享session的都是不行的。 我试了,两个办法,一个是用redis作发布、订阅,所有socket都订阅一个消息。第二种方法是用jgroups作集群组播通信,互相通知。类似的还有MQ等等。
qq_36159216 2018-12-29
  • 打赏
  • 举报
回复
Redis 序列化之后存进去,然后两个服务器共享
weixin_40787000 2017-11-02
  • 打赏
  • 举报
回复
通信什么情况 会自动断开连接,用jemter 测试怎么有问题 ,怎么提高并发量
qiu_xs 2017-08-18
  • 打赏
  • 举报
回复
参考一下我的实现,图有点,不可描述
c19967346 2017-07-11
  • 打赏
  • 举报
回复
使用MQ介入吧,每个server收到来自自己维护的websocket客户端发来的内容的时候,广播一个TOPIC类型的消息出去,这样每个server都能收到这个消息,然后在消息接收里面实现业务逻辑
  • 打赏
  • 举报
回复
关键TMD StandardWebSocketSession 不能被序列化,这什么卵设计,要不然就缓存以丢就可以了!
ITyangzi 2017-04-30
  • 打赏
  • 举报
回复
楼主问题解决了吗?我遇到相同的问题
javaersummer 2017-04-06
  • 打赏
  • 举报
回复
引用 9 楼 u013582808 的回复:
我也遇到这样的问题 一开始也想把websocketSession放到redis里 结果发现根本放不进去
websocketSession 对象没有序列化 不能放入redis中
WPersevere 2017-03-30
  • 打赏
  • 举报
回复
求大神解答!!
一颗卤蛋啊啊 2017-01-11
  • 打赏
  • 举报
回复
我也遇到这样的问题 一开始也想把websocketSession放到redis里 结果发现根本放不进去
  • 打赏
  • 举报
回复
引用 7 楼 tangjinxm 的回复:
[quote=引用 3 楼 du363867842 的回复:] 其实你可以想一下, 你的登陆是怎样做的, 如果user1在tomcat1上登陆了,那么下一次请求到了tomcat2上, 如何去判断这个用户已经登陆了呢?原理相同.....
你这样实现过吗? 这个与http连接还是不一样的,http连接我们保存到共享容器(如mencahce)里的相当于是数据,下次用于发出请求,服务端调用这个数据做一个校验就行,而websocket是一直保持的一个连接,我们将服务器A的websocketSession直接拿道服务器B上用,是否就真的可用呢?[/quote] ================================================ 遇到同样的问题,http的session可以存到共享容器(memcache/redis),但是 websocket的长连接,是有状态的,也能这么干? 希望楼主搞定后,来这里分享一下 持续关注中。。。
terry10000 2016-11-28
  • 打赏
  • 举报
回复
引用 3 楼 du363867842 的回复:
其实你可以想一下, 你的登陆是怎样做的, 如果user1在tomcat1上登陆了,那么下一次请求到了tomcat2上, 如何去判断这个用户已经登陆了呢?原理相同.....
你这样实现过吗? 这个与http连接还是不一样的,http连接我们保存到共享容器(如mencahce)里的相当于是数据,下次用于发出请求,服务端调用这个数据做一个校验就行,而websocket是一直保持的一个连接,我们将服务器A的websocketSession直接拿道服务器B上用,是否就真的可用呢?
terry10000 2016-11-28
  • 打赏
  • 举报
回复
我也遇到同样的问题,还没有找到好的解决办法。求大神解答!!!
tianfang 2016-07-27
  • 打赏
  • 举报
回复
还是用xmpp吧 openfire/tigase做服务器,有各种语言的xmpp客户端,包括js的都有 聊天室有现成的组件, 可以通过接口创建/加入删除成员/关闭聊天室
du363867842 2016-07-22
  • 打赏
  • 举报
回复
引用 1 楼 autfish 的回复:
可以考虑在前面加一层nginx,根据ip哈希,一个ip的请求按规则只会发到某一台tomcat上
这是个思路, 我个人不建议, 我举个例子, 咱们有个hash规则, 说单数1、3、5...到tomcat1上, 双数2、4、6到tomcat2上, 那么某一天,单数用户特别多, 那么所有的压力是否都会压在tomcat1上呢? 而tomcat2的压力就没有那么大,是否是浪费了呢..... 个人见解哈。
du363867842 2016-07-22
  • 打赏
  • 举报
回复
其实你可以想一下, 你的登陆是怎样做的, 如果user1在tomcat1上登陆了,那么下一次请求到了tomcat2上, 如何去判断这个用户已经登陆了呢?原理相同.....
du363867842 2016-07-22
  • 打赏
  • 举报
回复
部署一个单独的缓存, 例如memcache,所有的websocket连接都放在缓存里, 不管是几台服务, 公用一个缓存容器,读、取都在一个容器中
大雨将至 2016-07-19
  • 打赏
  • 举报
回复
可以考虑在前面加一层nginx,根据ip哈希,一个ip的请求按规则只会发到某一台tomcat上

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧