CN112118266A - 一种HTTP与WebSocket协同的分布式状态同步方法 - Google Patents
一种HTTP与WebSocket协同的分布式状态同步方法 Download PDFInfo
- Publication number
- CN112118266A CN112118266A CN202011012551.1A CN202011012551A CN112118266A CN 112118266 A CN112118266 A CN 112118266A CN 202011012551 A CN202011012551 A CN 202011012551A CN 112118266 A CN112118266 A CN 112118266A
- Authority
- CN
- China
- Prior art keywords
- websocket
- session
- client
- service
- server
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/02—Protocols based on web technology, e.g. hypertext transfer protocol [HTTP]
- H04L67/025—Protocols based on web technology, e.g. hypertext transfer protocol [HTTP] for remote control or remote monitoring of applications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/1095—Replication or mirroring of data, e.g. scheduling or transport for data synchronisation between network nodes
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/1097—Protocols in which an application is distributed across nodes in the network for distributed storage of data in networks, e.g. transport arrangements for network file system [NFS], storage area networks [SAN] or network attached storage [NAS]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/14—Session management
- H04L67/146—Markers for unambiguous identification of a particular session, e.g. session cookie or URL-encoding
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/16—Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
- H04L69/161—Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields
- H04L69/162—Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields involving adaptations of sockets based mechanisms
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer Security & Cryptography (AREA)
- Computer And Data Communications (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明公开了一种HTTP与WebSocket协同的分布式状态同步方法,其特征在于,包括:步骤1:WebSocket服务器集群初始化,步骤2:重构WebSocket服务器集群URL,步骤3:为每个客户端分配一个WebSocket会话,步骤4:检测长连接是否正常,步骤5:确定本次业务状态变更请求;步骤6:调用业务服务器处理请求,并将结果反馈至客户端,步骤7:将请求发送至WebSocket服务器节点,步骤8:关闭长连接。以WebSocket服务器替代原有的客户端发送心跳检测,不使用消息或者外部存储,具有部署简单,扩展容易的效果,同时解决不同场景的使用功能需求。
Description
技术领域
本发明涉及数据通讯技术领域,特别是涉及一种HTTP与WebSocket协同的分布式状态同步方法。
背景技术
在音视频、屏幕共享等实时通讯领域,为了用户之间的高效协同,需要一种实时状态同步***,同时兼容浏览器与APP。WebSocket使用长连接,可以实现服务端到客户端的即时通讯,但是客户端请求服务端,由于使用异步消息无法实时感知操作结果,操作可能出错;而单独使用WebSocket协议,需要额外的鉴权机制。
在WebSocket长连接方面,现有技术多使用客户端发送心跳且只能发送文本,需要客户端与服务端同时实现,有一定复杂度;当前分布式WebSocket服务器集群依然使用分布式场景下常见的外部存储或消息机制,架构较为复杂。
专利CN201811429767-一种新型实时信息流交互方法,给出了一种通过配合WebSocket协议,建立客户端和服务器的长连接,利用多通道的多并发通信,使用心跳检测进行信息交互的技术方案;相似专利CN201811622417-一种基于Websocket长连接的数据处理方法及***和CN2019103628180-一种无业务数据交换下保持websocket长连接的方法,也同样明确采用了客户端心跳检测,这样会增加客户端的负担。
专利CN2019104677729-基于websocket的单用户多地登录分布式推送的方法、CN2019113338150-基于WebSocket的分布式服务器集***互方法及装置,均给出了基于分布式场景下的技术方案,但需要使用消息或者存储,实际应用时不够简洁。同时,现有技术在同一时间仅使用一种协议,扩展性受限。
因此,需要一种能实现简单部署的分布式状态同步方法,用于解决多终端分布式实时通讯问题。
发明内容
本发明所要解决的技术问题是克服现有技术的不足,提供一种HTTP协议与WebSocket协议协同的分布式状态同步方法,本发明通过鉴权过的HTTP请求获取WebSocket服务器节点地址;用户发起操作时使用HTTP请求保证结果实时感知且不易出错,状态更新之后通知其他用户使用WebSocket协议保证实时送达;在长连接方面,通过由服务端首发基于WebSocket协议定义的WebSocket Ping包,实现WebSocket协议的客户端不需要额外处理;WebSocket服务器集群不再依赖任何外部存储或消息机制,部署及扩展简单。
本发明提供一种HTTP与WebSocket协同的分布式状态同步方法,具体步骤包括:
步骤1:WebSocket服务器集群初始化,具体为:部署WebSocket服务器集群,配置WebSocket服务器集群初始URL,WebSocket服务器集群内每个WebSocket服务器节点启动时初始化生成并发散列表和心跳检测线程;所述WebSocket服务器集群初始URL包含适用于浏览器端的WSS协议、适用于APP端的WSS协议及WS协议;所述并发散列表采用Key-Value存储结构,包含会话散列表和心跳检测散列表;所述会话散列表用于记录客户端与WebSocket服务器节点间的连接信息,所述连接信息包括WebSocket会话信息和连接标识符;所述WebSocket会话是指客户端和某一个WebSocket服务器节点间建立的连接通道,所述WebSocket会话包含经重构的WebSocket服务器集群URL、用户ID、消息发送及回调方法、错误回调方法;所述用户ID为自动生成的用户身份唯一标识;所述WebSocket会话生成时分配一个会话标识符;所述连接标识符由WebSocket服务器节点IP和会话标识符组成;所述心跳散列表用于记录WebSocket服务器节点和客户端之间的心跳检测信息;所述心跳散列表包含会话标识符及WebSocket服务器节点上一次发送心跳检测的时间;所述心跳检测线程每隔10秒启动对会话散列表的遍历;
步骤2:重构WebSocket服务器集群URL:客户端首次访问应用服务器时,获取客户端访问请求参数写入WebSocket服务器集群初始URL,形成附带客户鉴权的WebSocket服务器集群URL;所述客户端访问请求参数包含客户端访问IP及访问身份标识;所述客户端访问IP的格式为IPv4或IPv6;所述应用服务器用于处理HTTP请求;
步骤3:待客户端与WebSocket服务器节点之间的长连接建立后,为每个客户端分配一个WebSocket会话;在WebSocket服务器节点的会话散列表中,以连接标识符为Key值,以WebSocket会话为Value值,记录本次建立的长连接;从WebSocket会话中提取用户ID,建立用户ID与连接标识符之间的对应关系,并将所述对应关系通过业务服务器存入数据库服务器中,所述业务服务器用于实际业务逻辑处理;
步骤4:在长连接保持过程中检测长连接是否正常:每隔10秒,WebSocket服务器节点通过步骤2建立的WebSocket会话,向客户端发送心跳检测数据包,同时依次遍历会话散列表中的Value值,即WebSocket会话,遍历时获取每个WebSocket会话建立时自动生成的会话标识符;根据连接标识符,在心跳散列表中查找是否有匹配的数据记录,如若没有,将会话标识符作为Key值,当前时间作为Value值存入心态散列表中;如若有,获取会话标识符对应的WebSocket服务器节点上一次发送心跳检检测包的时间,取当前时间与该值的差,判断差值是否大于20秒,若差值大于20秒,在心跳散列表中删除会话标识符对应的数据记录,关闭WebSocket会话的同时,在会话散列表中删除WebSocket会话对应的数据记录;若差值小于20秒,继续遍历会话散列表中下一个Value值,直至遍历完会话散列表;
步骤5:根据业务的处理结果类型确定本次业务状态变更请求是用户主动操作还是用户被动操作;所述业务状态包括业务逻辑的状态,所述业务的处理结果类型包括业务处理结果需告知用户和业务处理结果无需告知用户;若业务处理结果需告知用户,则本次业务状态变更请求视为用户主动操作,基于HTTP协议,客户端将业务状态变更请求发送至应用服务器处理,执行步骤6;若业务处理结果无需告知用户,则本次业务状态变更请求视为用户被动操作,基于WebSocket协议,客户端将业务状态变更请求发送至WebSocket服务器节点处理,执行步骤7;
步骤6:待应用服务器接收到业务状态变更请求时,调用业务服务器处理请求,并将结果反馈至客户端;业务服务器在处理业务状态变更请求时,找出需同步变更业务状态的其他用户ID;根据所述用户ID在数据库服务器中寻找与用户ID对应的连接标识符,通过解析连接标识符获取WebSocket服务器节点IP,WebSocket服务器节点根据连接标识符确定WebSocket会话,业务状态变更通知经WebSocket会话发送至客户端,告知用户业务状态已变更;
步骤7:获取登录客户端的用户ID,找到包含所述用户ID的WebSocket会话,通过WebSocket会话,业务状态变更通知请求发送至WebSocket服务器节点;WebSocket服务器节点在会话散列表中获取所述WebSocket会话对应的连接标识符,并连同WebSocket服务器集群URL、当前时间及业务状态变更通知发送至业务服务器处理;
步骤8:关闭客户端与WebSocket服务器节点之间的长连接,具体为:待WebSocket服务器节点收到客户端发送的长连接关闭请求,在并发散列表中删除相关与所述长连接匹配的WebSocket会话及连接标识符;WebSocket服务器节点以单向调用的形式向业务服务器发起长连接关闭请求,请求参数包括WebSocket服务器集群URL和连接标识符;业务服务器根据连接标识符,在数据库服务器中查找连接标识符与用户ID的对应关系,并删除该对应关系的数据记录;
所述步骤2具体为:用户首次登录访问,通过客户端以HTTP协议访问应用服务器时,应用服务器调用业务服务器获取WebSocket服务器集群初始URL;应用服务器获取客户端访问请求参数,在WebSocket服务器集群初始URL的尾部追加客户端访问IP及访问身份标识,生成最终的WebSocket服务集群URL;
所述步骤2中的客户端访问IP如若是IPv4格式,将IP转成32位整数后,再转成8字节的16进制数字字母格式;所述客户端访问IP如若是IPv6格式,将IP转成128位整数后,再转成32字节的16进制数字字母格式。
所述步骤3中,WebSocket服务器节点在会话散列表中记录包含连接标识符及WebSocket会话信息的长连接信息,具体为:根据WebSocket服务器集群URL,按照与客户端类型匹配的WebSocket协议,向WebSocket服务器集群发起连接请求,如若客户端为浏览器,按照WSS协议向WebSocket服务器集群发起连接请求;如若客户端为APP端,按照WSS协议或WS协议,向WebSocket服务器集群发起连接请求;WebSocket服务器集群将请求转发至集群中任一WebSocket服务器节点,建立客户端与WebSocket服务器节点之间的连接;如若连接失败,提示网络异常,客户端重新发起连接请求;如若连接成功,由WebSocket服务器节点为客户端分配一个WebSocket会话,并自动生成64位会话标识符;获取WebSocket服务器节点IP地址,将WebSocket服务器节点IP与会话标识符前后拼接形成连接标识符;将WebSocket会话和连接标识符写入会话散列表存储,其中连接标识符为Key值,WebSocket会话为Value值;
所述步骤3中连接标识符形成具体包括:将WebSocket服务器节点IP转成32位整数并左移32位后形成的数值,作为连接标识符的前64位;会话连接符作为连接标识符的后64位;
在所述步骤4的遍历过程中,如果WebSocket服务器节点收到某个客户端发出的心跳检测包,在心跳散列表中找到该客户端所对应WebSocket会话的会话标识符,并删除会话标识符对应的心跳检测数据记录;
所述步骤6具体包括:
步骤601:业务服务器在处理业务状态变更请求时,组建JSON格式的业务状态变更通知,同时找出所有需同步变更业务状态的其他用户ID;
步骤602:取连接标识符前8位,转成32位整数为WebSocket服务器节点IP;根据IP,以单向调用形式将业务状态变更通知和连接标识符发送WebSocket服务器节点;
步骤603:待WebSocket服务器节点收到业务服务器发送的业务状态变更通知后,根据连接标识符在会话散列表WebSocket中查找相应的WebSocket会话WebSocket,提取WebSocket会话信息中的用户ID,通过WebSocket会话向用户ID所在的客户端发送业务状态变更通知,告知状态已同步变更;如果无法找到相应的WebSocket会话,记录日志并通知异常;
在所述步骤603中,若通过WebSocket会话向用户ID所在的客户端发送业务状态变更通知时出现传输错误,WebSocket服务器节点从会话散列表中删除连接标识符对应的数据记录;同时调用业务服务器删除数据库服务器中存储的用户ID和连接标识符的对应关系;
所述步骤7中,经业务服务器处理完毕,若需变更其他用户的业务状态,按照步骤601-603多用户的业务状态同步;
所述步骤1-步骤8中的当前时间,取当前自1970年1月1日0点0分0秒后的秒数。
本发明所达到的有益效果是:
(1)本发明通过构建Websocket服务器集群,实现HTTP与WebSocket协同,任一用户通过客户端发起的业务状态变更请求不仅能基于HTTP实时获取请求反馈结果,也能利用WebSocket连接通道实时通知其他受业务状态变更影响的用户,同时解决不同场景的使用功能需求;
(2)本发明通过附加客户端访问参数的形式,完成对WebSocket服务器节点URL地址的重构,并基于HTTP协议返回URL地址至客户端,解决现有WebSocket无法实现的用户鉴权及客户端IP追踪的问题;
(3)本发明通过在WebSocket服务器节点启动时初始化生成心跳散列表,包含会话散列表的配置、与心跳检测的适配、连接状态检测的实际应用参数配置,以WebSocket服务器发送心跳检测替代原有的客户端发送心跳检测,不使用消息或者外部存储,极大简化了客户端接入成本;
(4)本发明通过绑定并存储WebSocket服务器节点IP、WebSocket会话与用户ID之间的关系,使业务服务器在业务处理过程中,直接从数据库服务器中调用绑定关系,实现对WebSocket服务器集群中的特定节点的直接访问,业务服务器可直接访问分布式WebSocket服务器集群中的特定节点,简化了分布式WebSocket服务器,部署简单,扩展容易。
附图说明
图1为本发明实施例中HTTP与WebSocket协同的分布式状态同步方法流程图;
图2为本发明实施例中HTTP与WebSocket协同的分布式状态同步***结构示意图;
图3所示为本发明实施例中客户端首次打开页面建立长连接示意图;
图4所示为本发明实施例中用户A业务状态同步至用户B的流程图;
图5所示为本发明实施例中WebSocket服务器心跳检测流程示意图。
具体实施方式
下面结合附图和示例性实施例对本发明作进一步的说明:
如图1所示为本发明实施例中一种HTTP与WebSocket协同的分布式状态同步方法流程图,具体步骤包括:
步骤S1:WebSocket服务器集群初始化,每个WebSocket服务器节点初始化生成并发散列表和心跳检测线程:部署WebSocket服务器集群,配置服务器集群初始URL,集群内每个WebSocket服务器节点启动时初始化生成并发散列表和心跳检测线程;所述服务器集群初始URL包含适用于浏览器端的WSS协议、适用于APP端的WSS协议及WS协议;所述并发散列表采用Key-Value存储结构,包含会话散列表session和心跳检测散列表pinged;
所述会话散列表session用于记录客户端与WebSocket服务器节点间的连接信息,包括WebSocket会话和连接标识符channelId;所述WebSocket会话是指客户端和某一个WebSocket服务器节点间建立的连接通道,包含WebSocket服务器集群URL、用户ID、消息发送方法send、会话关闭方法close及回调方法,比如onError(),onMessage(),onClose()等,所述用户ID为自动生成的***用户身份唯一标识;所述WebSocket会话生成时分配一个会话标识符sessionId;所述连接标识符用于标识建立WebSocket连接的双方身份,由WebSocket服务器节点IP和会话标识符sessionId组成;
所述心跳散列表pinged中记录了WebSocket服务器节点和客户端之间的心跳检测信息,所述心跳检测是WebSocket服务器通过向客户端发送连接确认通知,检测是否与客户端连接正常;所述心跳散列表pinged包含会话标识符及WebSocket服务器节点上一次发送心跳检测的时间;所述心跳检测线程每隔10秒启动对会话散列表的遍历;通过在WebSocket服务器节点启动时初始化生成心跳散列表,以WebSocket服务器发送心跳检测替代原有的客户端发送心跳检测,极大简化了客户端接入成本
步骤S2:重构WebSocket服务器集群URL:用户通过客户端以HTTP协议首次访问应用服务器时,应用服务器调用业务服务器获取WebSocket服务器集群初始URL;应用服务器获取客户端访问IP及访问身份标识,在WebSocket服务器集群初始URL的尾部追加客户端访问IP及访问身份标识,生成最终的WebSocket服务集群URL;若客户端访问IP是IPv4格式,将IP转成32位整数后,再转成8字节的16进制数字字母格式;若客户端访问IP是IPv6格式,将IP转成128位整数后,再转成32字节的16进制数字字母格式;
如若客户端是浏览器,浏览器访问WEB应用服务器获取WebSocket服务器URL,WEB应用服务器服务调用业务服务器,业务服务器返回适用于浏览器WSS协议的地址,并在地址后追客户端访问IP及访问身份标识;
如果客户端是APP,APP访问APP应用服务器获取WebSocket服务器URL时,APP应用服务器服务调用业务服务器,业务服务器返回适用于APP的WSS或WS协议地址,并在地址后追客户端访问IP及访问身份标识;
步骤S3:建立客户端与WebSocket服务器节点之间的长连接,并将连接信息与用户ID的对应关系存入数据库服务器中,具体为:
步骤S301:客户端通过WebSocket协议发起WebSocket连接,连到远程WebSocket服务器节点,实现双向通讯。目前主流浏览器均已支持WebSocket协议,如若客户端为APP应用,使用第三方WebSocket库来支持WebSocket协议。;
步骤S302:根据WebSocket服务器集群URL,客户端按照WSS协议向WebSocket服务器集群发起连接请求,并由WebSocket服务器集群将请求转发至集群中任一WebSocket服务器节点;如若请求连接失败,提示网络异常,客户端重新发起连接请求;如若WebSocket服务器节点与客户端连接成功,由WebSocket服务器节点为客户端分配一个WebSocket会话并自动生成64位会话标识符sessionId;获取WebSocket服务器节点IP地址,将WebSocket服务器节点IP与会话标识符sessionId前后拼接形成连接标识符channelId;将WebSocket会话和连接标识符写入会话散列表(即原文session散列表)存储,其中连接标识符为Key值,WebSocket会话为Value值;
步骤S303:从WebSocket会话信息中提取用户ID,建立用户ID与连接标识符之间的对应关系,并将所述对应关系告知业务服务器存入数据库服务器中;通过绑定并存储WebSocket服务器节点IP、WebSocket会话与用户ID之间的关系,使业务服务器在业务处理过程中,直接从数据库服务器中调用绑定关系,实现对WebSocket服务器集群中的特定节点的直接访问,简化了分布式WebSocket服务器的部署,扩展容易。
步骤S4:在长连接保持过程中,WebSocket服务器节点周期性向客户端发送心跳检测包,心跳散列表pinged中记录发送时间,通过判断当前时间与发送时间的间隔,检测长连接是否正常保持,具体为:
步骤S401:利用WebSocket的Ping/Pong机制,每隔10秒,WebSocket服务器节点通过步骤2建立的连接通道,向客户端发送Ping包,同时依次遍历会话散列表session中的Value值,即WebSocket会话,遍历时获取每个WebSocket会话建立时自动生成的会话标识符sessionId;
步骤S402:根据会话标识符sessionId,在心跳散列表中查找是否有对应的数据记录,如若没有,将会话标识符sessionId作为Key值,当前时间作为Value值存入心跳散列表中;如若有,获取sessionId对应的WebSocket服务器节点上一次发送Ping包的时间,取当前时间与上一次发送Ping包的时间的差,判断差值是否大于20秒,若差值大于20秒,在心跳散列表中删除sessionId对应的数据记录,关闭会话连接通道的同时,在会话散列表中删除会话对应的数据记录;若差值小于20秒,继续遍历会话散列表中下一个Value值,直至遍历完会话散列表;
步骤S403:在遍历过程中,如果WebSocket服务器节点收到某个客户端发出的WebSocket Pong包,则从心跳散列表pinged中移除该客户端所对应WebSocket会话的sessionId对应的数据记录;
步骤S5:根据业务类型确定本次业务状态变更请求是用户主动操作还是用户被动操作,进而选择是以HTTP协议还是WebSocket协议发起请求;若业务处理结果需告知用户,则为用户主动操作,比如进入主页面的等待响应,基于HTTP协议,客户端将业务状态变更请求发送至应用服务器处理,执行步骤S6;若业务处理结果无需告知用户,则为用户被动操作,比如会议室页面中的音视频开关状态,基于WebSocket协议,客户端将业务状态变更请求发送至WebSocket服务器节点处理,执行步骤S7;
步骤S6:应用服务器处理业务状态变更请求反馈至客户端,同时确定需同步告知业务状态变更的其他客户端,通过各客户端与WebSocket服务器节点间的WebSocket会话,告知其他客户端业务状态已变更,具体包括:
步骤S601:业务服务器在处理业务状态变更请求时,组建JSON格式的业务状态变更通知,同时找出所有需同步变更业务状态的其他用户ID;
步骤S602:取连接标识符前8位,转成32位整数为WebSocket服务器节点IP;根据IP,以单向调用形式将业务状态变更通知和连接标识符发送WebSocket服务器节点;
步骤S603:待WebSocket服务器节点收到业务服务器发送的业务状态变更通知后,根据连接标识符在会话散列表session中查找相应的WebSocket会话,提取WebSocket会话中的用户ID,通过WebSocket会话向用户ID所在的客户端发送业务状态变更通知,告知状态已同步变更;如果无法找到相应的WebSocket会话,记录日志并通知异常;
在步骤S603中,若WebSocket会话向用户ID所在的客户端发送业务状态变更通知时出现传输错误,WebSocket服务器节点从会话散列表session中删除连接标识符对应的数据记录;同时调用业务服务器执行清除数据库服务器中用户ID和连接标识符对应关系;
步骤S7:获取与客户端已建立WebSocket会话的WebSocket服务器节点,经WebSocket服务器节点将业务变更请求发送业务服务器处理;具体为:获取登录客户端的用户ID,找到包含所述用户ID的WebSocket会话,通过WebSocket会话,业务状态变更请求发送至WebSocket服务器节点;WebSocket服务器节点在会话散列表session散列表中获取所述WebSocket会话对应的连接标识符channelId,以连接标识符channelId、WebSocket服务器集群URL、当前时间及业务状态变更通知为参数,单向调用业务服务器的deliverMessage()方法发送业务状态变更请求;经业务服务器处理完毕,若需变更其他用户的业务状态,按照步骤S601-S603执行同步;
步骤S8:客户端与WebSocket服务器节点之间的长连接关闭,清除会话散列表中的长连接信息,清除数据库服务器中存储的长连接与用户的对应关系,具体为:待WebSocket服务器节点收到客户端发送的长连接关闭请求,在并发散列表session中删除相关与所述长连接匹配的WebSocket会话及连接标识符;以WebSocket服务器集群URL及连接标识符为参数,单向调用业务服务器的connectionClosed()发送长连接关闭请求;业务服务器从WebSocket服务器集群URL提取用户信息,在数据库服务器中删除连接标识符与用户信息对应的数据记录;
在步骤S1-步骤S8中的当前时间,取当前自1970年1月1日0点0分0秒后的秒数。
如图2所示为本发明实施例中HTTP与WebSocket协同的分布式状态同步***结构示意图,主要包含客户端、WebSocket服务器集群、应用服务器集群、业务服务器集群及数据库服务器;所述客户端包括浏览器端和APP端;所述应用服务器包含浏览器访问的Web应用服务器集群和APP访问的APP应用服务器集群;所述客户端通过HTTP协议与应用服务器集群建立通讯;客户端通过WebSocket协议与WebSocket服务器集群建立双向通讯;所述应用服务器集群通过服务调用的形式,与业务服务器进行通讯;所述WebSocket服务器集群通过单向服务调用的形式,与业务服务器进行双向通讯;所述业务服务器集群访问数据库服务器获取预先存储的。
如图3所示为本发明实施例中客户端首次打开页面建立长连接示意图,以用户A首次进入音视频共享页面为例,用户A通过浏览器(如图中客户端)首次获取音视频共享页面时,客户端基于Http协议请求访问应用服务器获取音视频共享主页面,应用服务器接收请求,从业务服务器中获取WebSocket服务器集群初始URL,将客户端访问请求参数写入WebSocket服务器集群初始URL,所述请求参数包含eip参数、pid参数及ts参数等,形成附带客户鉴权的WebSocket服务器集群URL返回至客户端A;所述eip参数为客户端访问应用服务器时的IP,pid参数为客户端访问应用服务器时的唯一身份标识;ts参数为应用服务器当前自1970年1月1日0点0分0秒后的秒数。通过在WebSocket服务器集群初始URL附加客户端参数,解决了普通WebSocket无法实现的用户IP及用户身份等信息追踪;
客户端根据附带客户鉴权的WebSocket服务器集群URL发送建立长连接的请求,连接远程WebSocket服务器;待连接成功后,WebSocket服务器自动每隔10s发送Ping包至客户端,客户端会回复Pong包;
待连接成功后,用户A通过浏览器(如图中客户端)请求打开音视频开关,由于请求打开音视频开关的请求无需将处理结果告知用户A,隶属于用户被动操作,基于WebSocket协议,客户端以消息的形式,将打开音视频开关的请求发送至WebSocket服务器处理;WebSocket服务器在会话散列表session中获取用户A客户端与WebSocket服务器的连接标识符channelId-A,将连接标识符channelId-A、包含eip、pid等客户端参数的WebSocket服务器集群URL、当前时间及打开视音频开关作为请求内容,单向调用业务服务器的deliverMessage()方法发送至业务服务器处理,由业务服务器处理用户A的音视频开关状态,将用户A的音视频关闭状态更改为打开状态,完成消息处理;
待用户A和用户B均进入同一个视频共享页面时,以A用户开启音频开关这一事务请求为例,所述业务状态变更请求为将处于关闭状态的音频开关变更为打开状态;图4为本发明实施例中用户A的业务状态变更同步至用户B的流程图。用户A在浏览器(即图中客户端A)中操作开启音频开关,客户端A将开启音频开关的请求发送至Web应用服务器,Web应用服务器按照预设的业务逻辑调用业务服务器处理请求,业务处理器获取与用户A同在一个视频共享页面的用户B的ID,进一步地从数据库服务器中获取与用户B的ID所对应的连接标识符channelId-B;业务服务器解析channelId-B获取WebSocket服务器节点IP,将用户A开启音频开关的通知,以WebSocket文本消息的形式告知WebSocket服务器节点,经WebSocket服务器节点与用户B所在浏览器(及图中客户端B)之间的连接通道,告知用户B;通过实现HTTP与WebSocket协同,任一用户通过客户端发起的业务状态变更请求不仅能基于HTTP实时获取请求反馈结果,也能利用WebSocket连接通道实时通知其他受业务状态变更影响的用户;
如图5所示为本发明实施例中WebSocket服务器心跳检测流程示意图,以用户A通过浏览器(见图中客户端A)进入音视频共享页面为例,在长连接保持过程中,WebSocket服务器节点周期性地向客户端发送心跳检测Ping包,心跳散列表pinged中记录发送时间,通过判断当前时间与发送时间的间隔,检测长连接是否正常保持,具体为:WebSocket服务器节点每隔10s,通过已建立的连接通道,向客户端发送Ping包;客户端接收到ping包后,若立即向WebSocket服务器节点返回pong包至Websocket服务器节点,Websocket服务器节点在心跳散列表中删除用户A与WebSocket服务器节点间的心跳记录;
WebSocket服务器节点向客户端发送Ping包的同时,依次遍历会话散列表session中的Value值,即WebSocket会话,遍历时获取每个WebSocket会话建立时自动生成的会话标识符sessionId;根据会话标识符sessionId,在心跳散列表中查找是否有对应会话记录,如若没有,将会话标识符sessionId作为Key值,当前时间作为Value值存入心跳散列表中;如若有,获取sessionId对应的WebSocket服务器节点上一次发送Ping包的时间,取当前时间与上一次发送Ping包的时间的差,判断差值是否大于20秒,若差值大于20秒,在心跳散列表中删除sessionId对应的数据记录,关闭会话连接通道的同时,在会话散列表中删除会话对应的数据记录;业务服务器发起长连接关闭请求;若差值小于20秒,继续遍历会话散列表中下一个Value值,直至遍历完会话散列表。
本发明所达到的有益效果是:
(1)本发明通过构建Websocket服务器集群,实现HTTP与WebSocket协同,任一用户通过客户端发起的业务状态变更请求不仅能基于HTTP实时获取请求反馈结果,也能利用WebSocket连接通道实时通知其他受业务状态变更影响的用户,同时解决不同场景的使用功能需求;
(2)本发明通过附加客户端访问参数的形式,完成对WebSocket服务器节点URL地址的重构,并基于HTTP协议返回URL地址至客户端,解决现有WebSocket无法实现的用户鉴权及客户端IP追踪的问题;
(3)本发明通过在WebSocket服务器节点启动时初始化生成心跳散列表,包含会话散列表的配置、与心跳检测的适配、连接状态检测的实际应用参数配置,以WebSocket服务器发送心跳检测替代原有的客户端发送心跳检测,不使用消息或者外部存储,极大简化了客户端接入成本;
(4)本发明通过绑定并存储WebSocket服务器节点IP、WebSocket会话与用户ID之间的关系,使业务服务器在业务处理过程中,直接从数据库服务器中调用绑定关系,实现对WebSocket服务器集群中的特定节点的直接访问,业务服务器可直接访问分布式WebSocket服务器集群中的特定节点,简化了分布式WebSocket服务器,部署简单,扩展容易。
以上实施例不以任何方式限定本发明,凡是对以上实施例以等效变换方式做出的其它改进与应用,都属于本发明的保护范围。
Claims (8)
1.一种HTTP与WebSocket协同的分布式状态同步方法,其特征在于,具体步骤包括:
步骤1:WebSocket服务器集群初始化,具体为:部署WebSocket服务器集群,配置WebSocket服务器集群初始URL,WebSocket服务器集群内每个WebSocket服务器节点启动时初始化生成并发散列表和心跳检测线程;所述WebSocket服务器集群初始URL包含适用于浏览器端的WSS协议、适用于APP端的WSS协议及WS协议;所述并发散列表采用Key-Value存储结构,包含会话散列表和心跳检测散列表;所述会话散列表用于记录客户端与WebSocket服务器节点间的连接信息,所述连接信息包括WebSocket会话信息和连接标识符;所述WebSocket会话是指客户端和某一个WebSocket服务器节点间建立的连接通道,所述WebSocket会话包含经重构的WebSocket服务器集群URL、用户ID、消息发送及回调方法、错误回调方法;所述用户ID为自动生成的用户身份唯一标识;所述WebSocket会话生成时分配一个会话标识符;所述连接标识符由WebSocket服务器节点IP和会话标识符组成;所述心跳散列表用于记录WebSocket服务器节点和客户端之间的心跳检测信息;所述心跳散列表包含会话标识符及WebSocket服务器节点上一次发送心跳检测的时间;所述心跳检测线程每隔10秒启动对会话散列表的遍历;
步骤2:重构WebSocket服务器集群URL:客户端首次访问应用服务器时,获取客户端访问请求参数写入WebSocket服务器集群初始URL,形成附带客户鉴权的WebSocket服务器集群URL;所述客户端访问请求参数包含客户端访问IP及访问身份标识;所述客户端访问IP的格式为IPv4或IPv6;所述应用服务器用于处理HTTP请求;
步骤3:待客户端与WebSocket服务器节点之间的长连接建立后,为每个客户端分配一个WebSocket会话;在WebSocket服务器节点的会话散列表中,以连接标识符为Key值,以WebSocket会话为Value值,记录本次建立的长连接;从WebSocket会话中提取用户ID,建立用户ID与连接标识符之间的对应关系,并将所述对应关系通过业务服务器存入数据库服务器中,所述业务服务器用于实际业务逻辑处理;
步骤4:在长连接保持过程中检测长连接是否正常:每隔10秒,WebSocket服务器节点通过步骤2建立的WebSocket会话,向客户端发送心跳检测数据包,同时依次遍历会话散列表中的Value值,即WebSocket会话,遍历时获取每个WebSocket会话建立时自动生成的会话标识符;根据连接标识符,在心跳散列表中查找是否有匹配的数据记录,如若没有,将会话标识符作为Key值,当前时间作为Value值存入心态散列表中;如若有,获取会话标识符对应的WebSocket服务器节点上一次发送心跳检检测包的时间,取当前时间与该值的差,判断差值是否大于20秒,若差值大于20秒,在心跳散列表中删除会话标识符对应的数据记录,关闭WebSocket会话的同时,在会话散列表中删除WebSocket会话对应的数据记录;若差值小于20秒,继续遍历会话散列表中下一个Value值,直至遍历完会话散列表;
步骤5:根据业务的处理结果类型确定本次业务状态变更请求是用户主动操作还是用户被动操作;所述业务状态包括业务逻辑的状态,所述业务的处理结果类型包括业务处理结果需告知用户和业务处理结果无需告知用户;若业务处理结果需告知用户,则本次业务状态变更请求视为用户主动操作,基于HTTP协议,客户端将业务状态变更请求发送至应用服务器处理,执行步骤6;若业务处理结果无需告知用户,则本次业务状态变更请求视为用户被动操作,基于WebSocket协议,客户端将业务状态变更请求发送至WebSocket服务器节点处理,执行步骤7;
步骤6:待应用服务器接收到业务状态变更请求时,调用业务服务器处理请求,并将结果反馈至客户端;业务服务器在处理业务状态变更请求时,找出需同步变更业务状态的其他用户ID;根据所述用户ID在数据库服务器中寻找与用户ID对应的连接标识符,通过解析连接标识符获取WebSocket服务器节点IP,WebSocket服务器节点根据连接标识符确定WebSocket会话,业务状态变更通知经WebSocket会话发送至客户端,告知用户业务状态已变更;
步骤7:获取登录客户端的用户ID,找到包含所述用户ID的WebSocket会话,通过WebSocket会话,业务状态变更通知请求发送至WebSocket服务器节点;WebSocket服务器节点在会话散列表中获取所述WebSocket会话对应的连接标识符,并连同WebSocket服务器集群URL、当前时间及业务状态变更通知发送至业务服务器处理;
步骤8:关闭客户端与WebSocket服务器节点之间的长连接,具体为:待WebSocket服务器节点收到客户端发送的长连接关闭请求,在并发散列表中删除相关与所述长连接匹配的WebSocket会话及连接标识符;WebSocket服务器节点以单向调用的形式向业务服务器发起长连接关闭请求,请求参数包括WebSocket服务器集群URL和连接标识符;业务服务器根据连接标识符,在数据库服务器中查找连接标识符与用户ID的对应关系,并删除该对应关系的数据记录。
2.如权利要求1所述的一种HTTP与WebSocket协同的分布式状态同步方法,其特征在于:所述步骤2具体为:用户首次登录访问,通过客户端以HTTP协议访问应用服务器时,应用服务器调用业务服务器获取WebSocket服务器集群初始URL;应用服务器获取客户端访问请求参数,在WebSocket服务器集群初始URL的尾部追加客户端访问IP及访问身份标识,生成最终的WebSocket服务集群URL;
所述步骤2中的客户端访问IP如若是IPv4格式,将IP转成32位整数后,再转成8字节的16进制数字字母格式;所述客户端访问IP如若是IPv6格式,将IP转成128位整数后,再转成32字节的16进制数字字母格式。
3.如权利要求2所述的一种HTTP与WebSocket协同的分布式状态同步方法,其特征在于:所述步骤3中,WebSocket服务器节点在会话散列表中记录包含连接标识符及WebSocket会话信息的长连接信息,具体为:根据WebSocket服务器集群URL,按照与客户端类型匹配的WebSocket协议,向WebSocket服务器集群发起连接请求,如若客户端为浏览器,按照WSS协议向WebSocket服务器集群发起连接请求;如若客户端为APP端,按照WSS协议或WS协议,向WebSocket服务器集群发起连接请求;WebSocket服务器集群将请求转发至集群中任一WebSocket服务器节点,建立客户端与WebSocket服务器节点之间的连接;如若连接失败,提示网络异常,客户端重新发起连接请求;如若连接成功,由WebSocket服务器节点为客户端分配一个WebSocket会话,并自动生成64位会话标识符;获取WebSocket服务器节点IP地址,将WebSocket服务器节点IP与会话标识符前后拼接形成连接标识符;将WebSocket会话和连接标识符写入会话散列表存储,其中连接标识符为Key值,WebSocket会话为Value值。
4.如权利要求3所述的一种HTTP与WebSocket协同的分布式状态同步方法,其特征在于:所述步骤3中连接标识符形成具体包括:将WebSocket服务器节点IP转成32位整数并左移32位后形成的数值,作为连接标识符的前64位;会话连接符作为连接标识符的后64位。
5.如权利要求4所述的一种HTTP与WebSocket协同的分布式状态同步方法,其特征在于:在所述步骤4的遍历过程中,如果WebSocket服务器节点收到某个客户端发出的心跳检测包,在心跳散列表中找到该客户端所对应WebSocket会话的会话标识符,并删除会话标识符对应的心跳检测数据记录。
6.如权利要求5所述的一种HTTP与WebSocket协同的分布式状态同步方法,其特征在于:所述步骤6具体包括:
步骤601:业务服务器在处理业务状态变更请求时,组建JSON格式的业务状态变更通知,同时找出所有需同步变更业务状态的其他用户ID;
步骤602:取连接标识符前8位,转成32位整数为WebSocket服务器节点IP;根据IP,以单向调用形式将业务状态变更通知和连接标识符发送WebSocket服务器节点;
步骤603:待WebSocket服务器节点收到业务服务器发送的业务状态变更通知后,根据连接标识符在会话散列表WebSocket中查找相应的WebSocket会话WebSocket,提取WebSocket会话信息中的用户ID,通过WebSocket会话向用户ID所在的客户端发送业务状态变更通知,告知状态已同步变更;如果无法找到相应的WebSocket会话,记录日志并通知异常。
7.如权利要求6所述的一种HTTP与WebSocket协同的分布式状态同步方法,其特征在于:在所述步骤603中,若通过WebSocket会话向用户ID所在的客户端发送业务状态变更通知时出现传输错误,WebSocket服务器节点从会话散列表中删除连接标识符对应的数据记录;同时调用业务服务器删除数据库服务器中存储的用户ID和连接标识符的对应关系;
所述步骤7中,经业务服务器处理完毕,若需变更其他用户的业务状态,按照步骤601-603多用户的业务状态同步。
8.如权利要求7所述的一种HTTP与WebSocket协同的分布式状态同步方法,其特征在于:所述步骤1-步骤8中的当前时间,取当前自1970年1月1日0点0分0秒后的秒数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011012551.1A CN112118266B (zh) | 2020-09-24 | 2020-09-24 | 一种HTTP与WebSocket协同的分布式状态同步方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011012551.1A CN112118266B (zh) | 2020-09-24 | 2020-09-24 | 一种HTTP与WebSocket协同的分布式状态同步方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112118266A true CN112118266A (zh) | 2020-12-22 |
CN112118266B CN112118266B (zh) | 2022-05-31 |
Family
ID=73800544
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011012551.1A Active CN112118266B (zh) | 2020-09-24 | 2020-09-24 | 一种HTTP与WebSocket协同的分布式状态同步方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112118266B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112788144A (zh) * | 2021-01-19 | 2021-05-11 | 深圳市位元领航科技有限公司 | 一种通信方式的实现方法、服务器以及客户端 |
CN113342492A (zh) * | 2021-06-08 | 2021-09-03 | 杭州遥望网络科技有限公司 | 一种任务指令下发方法、装置、***、电子设备和介质 |
CN113472748A (zh) * | 2021-05-31 | 2021-10-01 | 四川万益能源科技有限公司 | 一种基于非阻塞输入输出的审计日志***通信方法 |
CN113923249A (zh) * | 2021-10-12 | 2022-01-11 | 工银科技有限公司 | 一种高性能网络长连接建立方法及装置 |
CN115334066A (zh) * | 2022-10-13 | 2022-11-11 | 飞天诚信科技股份有限公司 | 一种分布式集群***及其处理同步请求响应的方法 |
CN116233233A (zh) * | 2023-03-13 | 2023-06-06 | 霞智科技有限公司 | 一种基于ws协议的后台推送的开发方法和*** |
CN116881984A (zh) * | 2023-09-08 | 2023-10-13 | 云筑信息科技(成都)有限公司 | 一种数据监测方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108111634A (zh) * | 2018-02-28 | 2018-06-01 | 北京焦点新干线信息技术有限公司 | 一种基于websocket协议与http协议的即时数据传输方法及*** |
CN109936601A (zh) * | 2017-12-18 | 2019-06-25 | 厦门本能管家科技有限公司 | 一种基于WebSocket连接的区块链双工通信网络 |
CN111211934A (zh) * | 2019-12-25 | 2020-05-29 | 曙光信息产业(北京)有限公司 | 集群远程通信测试方法以及*** |
EP3678348A1 (en) * | 2019-01-04 | 2020-07-08 | Ping Identity Corporation | Methods and systems for data traffic based adpative security |
-
2020
- 2020-09-24 CN CN202011012551.1A patent/CN112118266B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109936601A (zh) * | 2017-12-18 | 2019-06-25 | 厦门本能管家科技有限公司 | 一种基于WebSocket连接的区块链双工通信网络 |
CN108111634A (zh) * | 2018-02-28 | 2018-06-01 | 北京焦点新干线信息技术有限公司 | 一种基于websocket协议与http协议的即时数据传输方法及*** |
EP3678348A1 (en) * | 2019-01-04 | 2020-07-08 | Ping Identity Corporation | Methods and systems for data traffic based adpative security |
CN111211934A (zh) * | 2019-12-25 | 2020-05-29 | 曙光信息产业(北京)有限公司 | 集群远程通信测试方法以及*** |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112788144A (zh) * | 2021-01-19 | 2021-05-11 | 深圳市位元领航科技有限公司 | 一种通信方式的实现方法、服务器以及客户端 |
CN113472748A (zh) * | 2021-05-31 | 2021-10-01 | 四川万益能源科技有限公司 | 一种基于非阻塞输入输出的审计日志***通信方法 |
CN113342492A (zh) * | 2021-06-08 | 2021-09-03 | 杭州遥望网络科技有限公司 | 一种任务指令下发方法、装置、***、电子设备和介质 |
CN113923249A (zh) * | 2021-10-12 | 2022-01-11 | 工银科技有限公司 | 一种高性能网络长连接建立方法及装置 |
CN115334066A (zh) * | 2022-10-13 | 2022-11-11 | 飞天诚信科技股份有限公司 | 一种分布式集群***及其处理同步请求响应的方法 |
CN115334066B (zh) * | 2022-10-13 | 2023-02-24 | 飞天诚信科技股份有限公司 | 一种分布式集群***及其处理同步请求响应的方法 |
CN116233233A (zh) * | 2023-03-13 | 2023-06-06 | 霞智科技有限公司 | 一种基于ws协议的后台推送的开发方法和*** |
CN116881984A (zh) * | 2023-09-08 | 2023-10-13 | 云筑信息科技(成都)有限公司 | 一种数据监测方法 |
CN116881984B (zh) * | 2023-09-08 | 2024-02-23 | 云筑信息科技(成都)有限公司 | 一种数据监测方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112118266B (zh) | 2022-05-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112118266B (zh) | 一种HTTP与WebSocket协同的分布式状态同步方法 | |
US11172023B2 (en) | Data synchronization method and system | |
CN109889762B (zh) | 一种会议控制方法和装置 | |
US11316909B2 (en) | Data transmission method and apparatus, and computer storage medium | |
US9432408B2 (en) | Signalling gateway, method, computer program and computer program product for communication between HTTP and SIP | |
WO2018166415A1 (zh) | 云存储***、媒体数据存储方法及*** | |
US10182086B2 (en) | Method and apparatus for transmitting streaming media data | |
WO2010072081A1 (zh) | 一种实现流媒体服务器大量终端接入的方法及*** | |
CN109634988B (zh) | 一种监控轮询方法和装置 | |
US11323661B2 (en) | Multi-device recording synchronization method and system, and conference system | |
CN110022456A (zh) | 邀请终端入会的方法和装置 | |
WO2023061060A1 (zh) | 音视频码流的调度方法、***、介质及电子装置 | |
CN110557612B (zh) | 一种监控设备的控制方法和视联网*** | |
CN110113558B (zh) | 数据处理方法、装置、***及计算机可读存储介质 | |
CN109347856A (zh) | 一种视联网终端的登录方法和*** | |
CN108810475A (zh) | 一种基于Onvif标准及Sip协议的Android视频监控装置 | |
CN114900707B (zh) | 一种直播方法及*** | |
US8036141B2 (en) | Apparatus and method for managing a network | |
CN112054953B (zh) | 多媒体即时通信方法、***及终端设备、计算机存储介质 | |
CN111385324A (zh) | 一种数据通信方法、装置、设备和存储介质 | |
CN110120937B (zh) | 资源获取方法、***、设备和计算机可读存储介质 | |
CN110191092B (zh) | 一种视频通话的处理方法和视联网*** | |
JP6807952B2 (ja) | 通信サービスを端末通信装置に提供する通信ネットワークを決定する方法及び装置 | |
CN113904860A (zh) | 数据传输方法、装置、设备、***及存储介质 | |
CN107317786B (zh) | 一种转发会话初始协议消息的方法、装置及网元 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |