上文我们已经利用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. nginx入门之编译安装

    nginx是什么 nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件.它是一个俄罗斯人lgor sysoev开发的,作者将源代码开源出来供全球使用. nginx比它大哥apache性 ...

  2. 小A的位运算-(前缀和+位运算)

    https://ac.nowcoder.com/acm/contest/549/D 题意:从N个数里面选出N-1个数要让它们或起来的值最大. 解题: 假设n个数分别存在a数组里. 从左到右连续或运算结 ...

  3. 判断序列B是否是序列A的连续子序列

    算法思想:因为两个整数序列已存入两个链表中,操作从两个链表的第一个结点开始,若对应得数据相等,则后移指针,若对应的数据不等,则A列表从上次开始比较结点的后继开始,B链表仍从第一个结点开始,直到B链表到 ...

  4. react 关闭eslint 配置

    在 package.json 中修改为一下 "eslintConfig": { "extends": "react-app", " ...

  5. centos中pipelinedb安装及初步使用

    安装 下载安装包 https://www.pipelinedb.com/download 创建系统文件目录和日志目录 pipelinedb安装 使用非root用户,初始化pipelinedb 修改配置 ...

  6. 关于AVL树的思考

    AVL树即平衡二叉树,每个结点有一个平衡因子,即左子树高度减去右子树高.每插入一个结点时,从根部开始按二叉排序树的方法,与节点不断比较,按大小向左右子树插入.在与最后的节点比较后插入时,若有兄弟节点, ...

  7. tensorflow实现二分类

    读万卷书,不如行万里路.之前看了不少机器学习方面的书籍,但是实战很少.这次因为项目接触到tensorflow,用一个最简单的深层神经网络实现分类和回归任务. 首先说分类任务,分类任务的两个思路: 如果 ...

  8. 认识socket

    socket socket也称套接字,网络编程的基础.一般情况下我不喜欢直接去说socket的函数都是怎么用的,那个很多人都写出来了,而且肯定比我好的有的是. 但是今天想写的是我的理解中,产生sock ...

  9. mysql中文查询问题

    alter table t_foo change `str` `str` varchar(100) character set utf8 not null ;

  10. 数据如何输入输出_Spark

    1)输入:在Spark程序运行中,数据从外部数据空间(如分布式存储:textFile读取HDFS等,parallelize方法输入Scala集合或数据)输入Spark,数据进入Spark运行时数据空间 ...