上文我们已经利用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. 其它 搭建https服务器

    原因是这样的,做了个淘宝的数据管理系统(仅供自己使用),然后需要淘宝卖家的生意参谋里面的一些数据,比如实时访客,里面有每个用户搜索什么关键字进来的,这些信息. 自己基于CefSharp开发了一个win ...

  2. 孤儿进程VS僵尸进程

    我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成 ...

  3. ssh登录locale报错:cannot change locale (zh_CN.UTF-8): No such file or directory

    一.登录ssh报错: Last :: from 172.28.146.109 -bash: warning: setlocale: LC_ALL: cannot change locale (en_C ...

  4. 获取BDC 消息文本的2种方式

    第一种 LOOP AT MESSTAB. MOVE MESSTAB-MSGNR TO MSGNO. CALL FUNCTION 'WRITE_MESSAGE' EXPORTING MSGID = ME ...

  5. DVWA中low级的sql注入漏洞的简单复现

    第一次成功复现一个简单漏洞,于是写下这篇随笔记录一下 首先我们来看dvwa中low级的sql注入的源码 源码文件路径如下图: 源码如下: <?php if(isset($_GET['Submit ...

  6. java程序启动redis报错ERR Client sent AUTH, but no password is set

    配置文件中注释掉password一句 重启程序即可

  7. AS3语法和UNITY C#语法的异同

      AS3 UNITY Sprite a = new Sprite(); trace(a.paent); 此时a.parent为null,还未AddChild到屏幕上, 一般用这个来判断在不在屏幕上 ...

  8. [BZOJ2252]矩阵距离(BFS)

    题意 输入矩阵m行n列(m<=500,n<=500),只含0.1,输出离每个元素距离最近的1的距离,其中距离定义为D(aij,akl)=abs(i-k)+abs(j-l). 示例: 输入: ...

  9. [Spring实战笔记]4面向切面编程的Spring-代理

    代理 代理(Proxy)是一种设计模式,可以在目标对象实现的基础上,扩展目标对象的功能. 代理对象是对目标对象的扩展,并会调用目标对象. 三种代理模式 静态代理 100% 代理对象与目标对象要实现相同 ...

  10. spring-boot的Hello World案例,最简单的spring-boot项目

    Spring Boot HelloWorld 一个功能: 浏览器发送hello请求,服务器接收请求并处理,响应Hello World字符串. 1.创建一个maven项目 2.导入依赖spring-bo ...