上文我们已经利用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集群的解决方式的更多相关文章
-
Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比(转)
摘要: redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性 ...
-
基于已有集群动态发现方式部署 Etcd 集群
etcd提供了多种部署集群的方式,在「通过静态发现方式部署etcd集群」 一文中我们介绍了如何通过静态发现方式部署集群. 不过很多时候,你只知道你要搭建一个多大(包含多少节点)的集群,但是并不能事先知 ...
-
springBoot+websocket集群系列知识
WebSocket简介和spring boot集成简单消息代理 Spring Boot 集成 websocket,使用RabbitMQ做为消息代理 Spring Websocket实现向指定的用户发送 ...
-
关于websocket集群中不同服务器的用户间通讯问题
最近将应用部署到集群时遇到一个问题,即用户命中不同的服务器导致的用户间无法进行websocket通讯,在网上搜索到类似问题但都没有具体解决方案. 于是用redis的订阅发布功能解决了该问题,具体流程如 ...
-
ehcache 集群使用 rmi方式 有图有真想
来源:http://www.tuicool.com/articles/MJzYZbR ehcache 有几种方式集群 ,rmi,jgroup还有jms:这里讲一下ehcache的使用 ehcache ...
-
springboot websocket集群(stomp协议)连接时候传递参数
最近在公司项目中接到个需求.就是后台跟前端浏览器要保持长连接,后台主动往前台推数据. 网上查了下,websocket stomp协议处理这个很简单.尤其是跟springboot 集成. 但是由于开始是 ...
-
NetCore下搭建websocket集群方案
介绍 最近在做一个基于netcore的实时消息服务.最初选用的是ASP.NET Core SignalR,但是后来发现目前它并没有支持IOS的客户端,所以自己只好又基于websocket重新搭建了一套 ...
-
【二】Kubernetes 集群部署-kubeadm方式(亲测)
一.概述 本次部署 Kubernetes 集群是通过 kubeadm 工具来进行部署, kubeadm 是 Kubernetes 官⽅提供的⽤于快速部署 Kubernetes 集群的⼯具,利⽤其来部署 ...
-
Spring 4.3.2+quartz2.2.3单机、集群+websocket集群实现文本或图片推送、接收及显示
相关环境 Nginx,Spring4.x当前(要选择4.0+),tomcat8.x,Quartz 2.x集群 测试面页:http://sms.reyo.cn/socket.html 测试面页是文本和图 ...
随机推荐
-
Ubuntu 16.04应用布署小记
本系列文章记录了升级Ubuntu 16.04的布署过程 回到目录 10. Dokuwiki 将虚拟目录配置文件链接到Apache2的可用的配置文件库中 sudo ln -s /opt/dokuwiki ...
-
mysql 行转列 和 列转行
我们有时会将一些数据已逗号的连接方式存在数据库,当取出时我们又想单独一个个取出来 利用help_topic 的自增性 LENGTH(wu.`password`) - length(replace(wu ...
-
项目总结笔记系列 Social Hub KT Session2
KT Session2: 主要是代码的实现(KT is knowledge Transfer) 如图所示,在整个Social Hub项目中,我们的项目Data Feed Service处于承上启下的作 ...
-
转:Configure your eclipse for C++
from: http://omtlab.com/configure-your-eclipse-for-c/ Configure your eclipse for C++ July 7, 2013 Th ...
-
C#面向对象学习笔记概要
1.面向对象不是取代面向过程的. 2.面向对象的三个特性:封装.继承.多态. 3.字段.方法.属性(后面讲)都可以叫做类的成员,他们都需要定义访问级别.访问级别的用处在于控制成员在哪些地方可以被访问, ...
-
同一个主机上的JVM实例之间通信
hadoop yarn里用了RPC调用.NM里面文件本地化类ContainerLocalizer用RPC心跳方式跟本机的ResourceLocalizationService通信. 用shared m ...
-
用U盘作为启动盘,安装Yosemite
1.选择一个存贮空间大于Yosemite系统(Yosemite系统大概5.1G左右)的U盘,用磁盘工具(Disk Utility)对此磁盘进行分区,可以参照此链接处对U盘进行分区.如果用磁盘工具进行分 ...
-
java 中 正则 正则表达式 匹配 url
不多说 [http|https]+[://]+[0-9A-Za-z:/[-]_#[?][=][.][&]]* 这个就是匹配 网络上的网址 又称 url . 最起码 绝大部分的taobao ur ...
-
Linux中最受欢迎的邮件传输代理(MTA)
MTA(Mail transfer Agent) -对于服务器管理员来说,邮件传输代理是最为重要的工具.MTA的主要工作就是将电子邮件从一台主机发送到另一台主机.MTA使用SMTP(简单邮件传输协议) ...
-
文本挖掘预处理之TF-IDF
在文本挖掘预处理之向量化与Hash Trick中我们讲到在文本挖掘的预处理中,向量化之后一般都伴随着TF-IDF的处理,那么什么是TF-IDF,为什么一般我们要加这一步预处理呢?这里就对TF-IDF的 ...