上文我们已经利用websocket实现微信二维码支付的业务。

  上述实现在单机环境中实现是没有什么问题的,无非就是客户端连接服务端,首先将连接的websocketsession存在一个map里面,当异步响应的时候,

根据流水号获取map里面对于的websocketSession,给指定的客户端发送消息。

但实际生产环境中,服务器一般是采用集群模式,首先,比方支付来说,接收第三方响应的服务器可能是有多台,然后具体是根据nginx随机路由转发,

假设异步响应的服务器有2台,A和B,而且连接websocket的代码是写在响应工程里面的,这时p1客户端去连接websocket的时候,通过域名实现websocket协议

,具体可在nginx里面配置,是随机转发到某一台,假设连接到A,这时session信息保存在A服务器,假设用户支付完成后,第三方异步通知也是随机转发A和B,

如果运气好,转发到A,此时异步响应能拿到session值,则能成功通知到客户端。如果不巧,转发到了B,则异步通知逻辑是执行了,但发现客户端一直没有收到

消息,因为B服务器根本拿不到这个session值。

解决上面的问题,首先考虑websocket是否可以在两台机器上共享,实现数据共享,当时想到的是是否可以将websocketsession序列化后存储到redis里面,然后

从redis里面获取给用户发送通知,最终发现不可行,因为websocketsession没有实现序列化接口,不能存在redis里面,另外就算能存储,客户端连接的是A,B就算拿到

session,但不能保证推送过去能成功,所以想到是否可以将上次连接的服务端记录下来,只要连接A,我就让A去发送,连接B,我就让B发送,既然不能将session存到redis

里,我可以考虑将流水号连接的服务端的ip存到redis里面,然后将发送消息的代码转移到一个controller,在异步通知的地方本来是直接执行发送消息的业务代码,改成调用

Http请求同时传递一个参数,根据这个参数可由流水号获取之前连接的服务器的ip,然后配置nginx解析参数指定转发到那一台。

通过上面的程序问题其实已经解决,其实如果从架构上优化的话,可以将websocket工程单独拆分成一个工程,不和异步通知的代码整在一起,由于异步通知的代码需要在

外网部署多套,而websocket可以只部署一套,这样nginx也不需要做指定参数转发的处理,比上述的方案更加优化。

然而实际中,如果websocket真的集群了,那么这个问题依然还是会出现,当然依靠redis和nginx指定参数转发,还是能做到点对点,只要所有websocket工程都不会宕机,

上述实现方案其实并没有实现websocketsession的共享,假设p1连接到A,异步的时候A宕机,这时p1就收不到消息,实际中集群按理说B还是可以给p1发送成功的消息,这就

可以利用消息队列的订阅发布的功能来模拟发送这个消息。

谈谈websocket集群的解决方式的更多相关文章

  1. Websocket集群解决方案

    最近在项目中在做一个消息推送的功能,比如客户下单之后通知给给对应的客户发送系统通知,这种消息推送需要使用到全双工的websocket推送消息. 所谓的全双工表示客户端和服务端都能向对方发送消息.不使用 ...

  2. Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比(转)

    摘要: redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性 ...

  3. 基于已有集群动态发现方式部署 Etcd 集群

    etcd提供了多种部署集群的方式,在「通过静态发现方式部署etcd集群」 一文中我们介绍了如何通过静态发现方式部署集群. 不过很多时候,你只知道你要搭建一个多大(包含多少节点)的集群,但是并不能事先知 ...

  4. springBoot+websocket集群系列知识

    WebSocket简介和spring boot集成简单消息代理 Spring Boot 集成 websocket,使用RabbitMQ做为消息代理 Spring Websocket实现向指定的用户发送 ...

  5. 关于websocket集群中不同服务器的用户间通讯问题

    最近将应用部署到集群时遇到一个问题,即用户命中不同的服务器导致的用户间无法进行websocket通讯,在网上搜索到类似问题但都没有具体解决方案. 于是用redis的订阅发布功能解决了该问题,具体流程如 ...

  6. ehcache 集群使用 rmi方式 有图有真想

    来源:http://www.tuicool.com/articles/MJzYZbR ehcache 有几种方式集群 ,rmi,jgroup还有jms:这里讲一下ehcache的使用 ehcache ...

  7. springboot websocket集群(stomp协议)连接时候传递参数

    最近在公司项目中接到个需求.就是后台跟前端浏览器要保持长连接,后台主动往前台推数据. 网上查了下,websocket stomp协议处理这个很简单.尤其是跟springboot 集成. 但是由于开始是 ...

  8. NetCore下搭建websocket集群方案

    介绍 最近在做一个基于netcore的实时消息服务.最初选用的是ASP.NET Core SignalR,但是后来发现目前它并没有支持IOS的客户端,所以自己只好又基于websocket重新搭建了一套 ...

  9. 【二】Kubernetes 集群部署-kubeadm方式(亲测)

    一.概述 本次部署 Kubernetes 集群是通过 kubeadm 工具来进行部署, kubeadm 是 Kubernetes 官⽅提供的⽤于快速部署 Kubernetes 集群的⼯具,利⽤其来部署 ...

随机推荐

  1. RPC web service

    ---------------------------------------------------------------------------------------------------- ...

  2. Win10 远程桌面连接出现“要求的函数不受支持”的解决办法之修改注册表

    问题起因 笔者自己在阿里云上搞服务器,有一台 Windows Server 必须通过远程桌面连接来管理,由于没能完全关掉 Win10 自带的烦人的系统更新,导致昨天安装完更新后出现了连接远程桌面时“要 ...

  3. CHROME浏览器清缓存

  4. Maven模块化开发

    Maven模块化开发 多人协同开发时,特别是规模较大的项目,为方便日后代码维护管理会将每个人的工作细分到具体的功能和模块上.随着项目的不断扩大,模块会越来越多,后续更加难以维护和扩展,为应对这种情况后 ...

  5. AVL树实现记录

    https://github.com/xieqing/avl-tree An AVL Tree Implementation In C There are several choices when i ...

  6. 其他封装ui的平台

      mint平台 http://mint-ui.github.io/#!/zh-cn

  7. SpringMVC的执行流程

    解析SpringMVC执行流程 SpringMVC的执行图大概如下所示 1.首先它是由客户端发起请求,到DispatcherServlet,被拦截后到HandlerMapping这里充当一个路由器,通 ...

  8. HTML5代码段

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 桥接模式和nat模式的区别

    桥接模式:VMware虚拟的系统就想局域网中独立的主机一样(有独立的IP)它可以访问网内任何一台机器 Nat模式:可以通过宿主机访问互联网(宿主机联网,虚拟机就能联网)它不能和本局域网中的其他主机进行 ...

  10. ASP.Net的工作线程与请求队列

    当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程. 一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求.如果一个同步请求成为 I/O bo ...