本发明属于消息处理技术领域,尤其涉及一种分布式高并发实时消息推送方法及系统。
背景技术:
目前,web实时推送技术主要采用两种方法,一种是采用http轮询的方式实现,该方法主要通过浏览器xhr技术,定时地向web服务器发送http请求,根据web服务器返回的结果重新渲染用户界面,以达到数据刷新的目的,从而达到即时推送的效果,但是,这种方法存在很多比较严重的缺陷,如推送数据延迟时间较长、服务器和浏览器资源开销都比较大、传输数据量存在瓶颈等;另一种方式是采用一个单独的websocket服务器用来传输数据,该方法是搭建一个单独的websocket服务器,然后所有的websocket连接请求该服务器,从而实现所有websocket全部都连接到该服务器,这样只需要管理单个websocket服务器从而实现消息对所有的用户的分发,这种方式造成扩展性较差,用户过多时需要对用户分区进行隔离,已达到不超过服务器的负载。
因此,如何降低websocket即时通讯在高并发的场景下的延迟性以及提高可扩展性是一项亟待解决的问题。
技术实现要素:
有鉴于此,本发明提供了一种分布式高并发实时消息推送方法,能够降低websocket即时通讯在高并发的场景下的延迟性以及提高可扩展性。
为了实现上述目的,本发明提供如下技术方案:
一种分布式高并发实时消息推送方法,包括:
建立第一用户与web服务器之间的消息连接;
接收第二用户进行web登录后发送到web服务器的消息;
验证所述消息是否合法,若否,则结束非法访问,若是,则:
进行redis数据高速并发处理;
进行kafka分区消息处理;
web服务器同时消费kafka消息,多台web服务器同时推送相同数据到对应websocket连接分组用户中;
所述第一用户接收web服务器发送的消息。
优选地,所述建立第一用户与web服务器之间的消息连接包括:
接收所述第一用户的web登录请求;
基于所述登录请求建立连接,产生认证cookie信息,携带所述cookie信息发起websocket长连接请求,解析所述websocket中的所述cookie信息,判断是否合法,若否,则非法访问结束,若是,则:
建立websocket连接,将该连接加入相应分组中。
优选地,所述基于所述登录请求建立连接,产生认证cookie信息,携带所述cookie信息发起websocket长连接请求,解析所述websocket中的所述cookie信息,判断是否合法包括:
所述第一用户登录成功后,浏览器访问即时推送页面;
所述浏览器执行js,发起ws或wss连接请求;
web服务器解析接收到的所述ws或wss连接请求,并获取cookie信息;
将对应的cookie信息利用web服务器对应的key进行des解密;
将得到的明文字符串进行拆分成6个部分;
将拆分的6个部分信息进行比对,判断是否全部合法。
优选地,所述验证所述消息是否合法包括:
接收所述第二用户携带验证信息发起推送数据的http请求;
所述web服务器接收到http请求,验证cookie信息是否合法,若否,则结束非法访问,若是,则:
验证请求签名sign字段是否合法,若否,则结束非法访问,若是,则:
对所述请求进行重复性校验是否允许推送数据,若否,则结束非法访问,若是,则:
进行redis数据高速并发处理。
优选地,所述kafka分区消息处理包括:
web服务器对处理好的数据进行封装,同时序列化成json数据,生产消息到kafka服务器对用的topic上;
web服务器集群上的所有实例同时订阅所述topic,其中,所有的web服务器根据redis分布式锁实现处于不同的group中。
一种分布式高并发实时消息推送系统,包括:
建立模块,用于建立第一用户与web服务器之间的消息连接;
第一接收模块,用于接收第二用户进行web登录后发送到web服务器的消息;
验证模块,用于验证所述消息是否合法;
结束模块,用于当所述消息不合法时,结束非法访问;
第一处理模块,用于当所述消息合法时,进行redis数据高速并发处理;
第二处理模块,用于进行kafka分区消息处理;
推送模块,用于web服务器同时消费kafka消息,多台web服务器同时推送相同数据到对应websocket连接分组用户中;
第二接收模块,用于所述第一用户接收web服务器发送的消息。
优选地,所述建立模块具体用于:
接收所述第一用户的web登录请求;
基于所述登录请求建立连接,产生认证cookie信息,携带所述cookie信息发起websocket长连接请求,解析所述websocket中的所述cookie信息,判断是否合法,若否,则非法访问结束,若是,则:
建立websocket连接,将该连接加入相应分组中。
优选地,所述建立模块在执行基于所述登录请求建立连接,产生认证cookie信息,携带所述cookie信息发起websocket长连接请求,解析所述websocket中的所述cookie信息,判断是否合法时,具体用于:
所述第一用户登录成功后,浏览器访问即时推送页面;
所述浏览器执行js,发起ws或wss连接请求;
web服务器解析接收到的所述ws或wss连接请求,并获取cookie信息;
将对应的cookie信息利用web服务器对应的key进行des解密;
将得到的明文字符串进行拆分成6个部分;
将拆分的6个部分信息进行比对,判断是否全部合法。
优选地,所述验证模块具体用于:
接收所述第二用户携带验证信息发起推送数据的http请求;
所述web服务器接收到http请求,验证cookie信息是否合法,若否,则结束非法访问,若是,则:
验证请求签名sign字段是否合法,若否,则结束非法访问,若是,则:
对所述请求进行重复性校验是否允许推送数据,若否,则结束非法访问,若是,则:
进行redis数据高速并发处理。
优选地,所述第二处理模块具体用于:
web服务器对处理好的数据进行封装,同时序列化成json数据,生产消息到kafka服务器对用的topic上;
web服务器集群上的所有实例同时订阅所述topic,其中,所有的web服务器根据redis分布式锁实现处于不同的group中。
从上述技术方案可以看出,本发明提供了一种分布式高并发实时消息推送方法,当需要进行消息推送时,首先建立第一用户与web服务器之间的消息连接,然后接收第二用户进行web登录后发送到web服务器的消息,并验证所述消息是否合法,若否,则结束非法访问,若是,则:进行redis数据高速并发处理,然后进行kafka分区消息处理,web服务器同时消费kafka消息,多台web服务器同时推送相同数据到对应websocket连接分组用户中,最后所述第一用户接收web服务器发送的消息。本发明通过html5前端与分布式web服务器建立连接,利用kafka消息生产和消费的原理,同时使用redis进行消息同步处理,实时稳定接收分布式web全局消息,实现分布式web消息的推送,具有健壮性、可扩展性、全局性、一致性、高并发等优点。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明公开的一种分布式高并发实时消息推送方法实施例1的方法流程图;
图2为本发明公开的一种分布式高并发实时消息推送系统实施例1的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,为本发明公开的一种分布式高并发实时消息推送方法实施例1的流程图,所述方法包括:
s101、建立第一用户与web服务器之间的消息连接;
当需要通过web服务器进行消息推送时,首先建立第一用户与web服务器之间的消息连接。其中,所述的第一用户即为接收web服务器推送消息的用户。
s102、接收第二用户进行web登录后发送到web服务器的消息;
当建立第一用户与web服务器之间的消息连接后,第二用户进行web登录,第二用户成功进行web登录后,向web服务器发送消息,其中,第二用户是提前在后台录入的用户,采用图形采用手机号和姓名以及图形短信验证码的方式进行登录系统,向web服务器发送消息则是第二用户登录后操作自己的账号产生的信息推送到web服务器。web服务器接收第二用户进行web登录后发送到web服务器的消息。
s103、验证所述消息是否合法,若否,则进入s104,若是,则进入s105:
当web服务器接收到消息后,会经过cookie、sign合法校验,重复校验,判断是否推送消息。
s104、结束非法访问;
当经过验证消息不合法时,则结束非法访问。
s105、进行redis数据高速并发处理;
当经过验证消息合法时,则进行多进程数据同步处理,主要采用redis中的incrby、decrby、decr、incr、append等高并发api处理。
s106、进行kafka分区消息处理;
web服务器生产json格式的数据到kafka服务器,json数据采用的是java中的对象封装,然后进行json序列化产生json格式的数据,通过kafka生产者api推送到kafka服务器。
s107、web服务器同时消费kafka消息,多台web服务器同时推送相同数据到对应websocket连接分组用户中;
web服务器的所有实例同时消费相同的消息采用的是利用redis分布式锁让所有web服务器的实例订阅的kafka消息group全不两两相同,从而全局消费相同的消息。第一用户经过与web服务器之间建立消息连接,此时该请求是连接到整个web服务器集群中的一个实例上,对于多个相同组别的用户会均匀分布在多个web服务器实例上,此时需要整个web服务器集群中的所有实例对连接的对应组的第一用户进行推送websocket消息,因此需要整个web服务器集群推送相同的消息,从而实现消息的全局分发。
s108、第一用户接收web服务器发送的消息。
综上所述,当需要进行消息推送时,首先建立第一用户与web服务器之间的消息连接,然后接收第二用户进行web登录后发送到web服务器的消息,并验证所述消息是否合法,若否,则结束非法访问,若是,则:进行redis数据高速并发处理,然后进行kafka分区消息处理,web服务器同时消费kafka消息,多台web服务器同时推送相同数据到对应websocket连接分组用户中,最后所述第一用户接收web服务器发送的消息。本发明通过html5前端与分布式web服务器建立连接,利用kafka消息生产和消费的原理,同时使用redis进行消息同步处理,实时稳定接收分布式web全局消息,实现分布式web消息的推送,具有健壮性、可扩展性、全局性、一致性、高并发等优点。
具体的,在上述实施例中,步骤s101建立第一用户与web服务器之间的消息连接的其中一种实现方式可以是:
s1、接收第一用户的web登录请求;
当需要建立第一用户与web服务器之间的消息连接时,第一用户进行web登录,web服务器接收第一用户的web登录请求。
s2、基于登录请求建立连接,产生认证cookie信息,携带cookie信息发起websocket长连接请求,解析websocket中的cookie信息,判断是否合法,若否,则非法访问结束,若是,则:建立websocket连接,将该连接加入相应分组中。
根据接收到的登录请求,建立websocket连接,web服务器将websocket请求转化为http请求类型,同时提取对应的预先加密的cookie信息,解密分析cookie信息是否合法,若合法则建立websocket连接,否则,拒绝此次连接请求。其中,cookie加密使用特殊的分隔符号将多个用户信息按照一定顺序排列并采用des加密算法以及cbc加密模式的方式加密整个cookie信息。第一用户请求经过nginx反向代理以及通过负载均衡算法将连接请求均匀分布到web服务器集群中,第一用户的长连接均匀的建立在web服务器上。其中,第一用户在进行websocket长连接时,在请求的uri地址中携带分组参数,利用uri地址中的参数进行分组管理,实现单独对不同组用户的消息传递。websocket的分组连接信息存储结构的安全性,采用线程安全的快速查找map结构concurrenthashmap和高性能线程安全集合copyonwritearrayset结构。
具体的,在基于登录请求建立连接,产生认证cookie信息,携带cookie信息发起websocket长连接请求,解析websocket中的cookie信息,判断是否合法时,可以采用以下方式:
第一用户登录成功后,浏览器访问即时推送页面;
浏览器执行js,发起ws或wss连接请求;
web服务器解析接收到的ws或wss连接请求,并获取cookie信息;
将对应的cookie信息利用web服务器对应的key进行des解密;
将得到的明文字符串进行拆分成6个部分;
将拆分的6个部分信息进行比对,判断是否全部合法,若合法则建立连接,若不合法,则拒绝连接。
具体的,在上述实施例中,步骤s103验证消息是否合法其中一种实现方式可以是:
接收第二用户携带验证信息发起推送数据的http请求;
web服务器接收到http请求,验证cookie信息是否合法,若否,则结束非法访问,若是,则:
验证请求签名sign字段是否合法,若否,则结束非法访问,若是,则:
对请求进行重复性校验是否允许推送数据,若否,则结束非法访问,若是,则:
进行redis数据高速并发处理。
具体的,在上述实施例中,步骤s106进行kafka分区消息处理其中一种实现方式可以是:
web服务器对处理好的数据进行封装,同时序列化成json数据,生产消息到kafka服务器对用的topic上;
web服务器集群上的所有实例同时订阅所述topic,其中,所有的web服务器根据redis分布式锁实现处于不同的group中。
综上所述,本发明利用websocket、redis、kafka进行即时消息推送,充分利用服务器的cpu、内存、网络带宽资源,有效的解决了推送延迟、实现了推送并发高以及推送消耗资源少。
如图2所示,为本发明公开的一种分布式高并发实时消息推送系统实施例1的结构示意图,所述系统包括:
建立模块201,用于建立第一用户与web服务器之间的消息连接;
当需要通过web服务器进行消息推送时,首先建立第一用户与web服务器之间的消息连接。其中,所述的第一用户即为接收web服务器推送消息的用户。
第一接收模块202,用于接收第二用户进行web登录后发送到web服务器的消息;
当建立第一用户与web服务器之间的消息连接后,第二用户进行web登录,第二用户成功进行web登录后,向web服务器发送消息,其中,第二用户是提前在后台录入的用户,采用图形采用手机号和姓名以及图形短信验证码的方式进行登录系统,向web服务器发送消息则是第二用户登录后操作自己的账号产生的信息推送到web服务器。web服务器接收第二用户进行web登录后发送到web服务器的消息。
验证模块203,用于验证所述消息是否合法;
当web服务器接收到消息后,会经过cookie、sign合法校验,重复校验,判断是否推送消息。
结束模块204,用于当所述消息不合法时,结束非法访问;
当经过验证消息不合法时,则结束非法访问。
第一处理模块205,用于当消息合法时,进行redis数据高速并发处理;
当经过验证消息合法时,则进行多进程数据同步处理,主要采用redis中的incrby、decrby、decr、incr、append等高并发api处理。
第二处理模块206,用于进行kafka分区消息处理;
web服务器生产json格式的数据到kafka服务器,json数据采用的是java中的对象封装,然后进行json序列化产生json格式的数据,通过kafka生产者api推送到kafka服务器。
推送模块207,用于web服务器同时消费kafka消息,多台web服务器同时推送相同数据到对应websocket连接分组用户中;
web服务器的所有实例同时消费相同的消息采用的是利用redis分布式锁让所有web服务器的实例订阅的kafka消息group全不两两相同,从而全局消费相同的消息。第一用户经过与web服务器之间建立消息连接,此时该请求是连接到整个web服务器集群中的一个实例上,对于多个相同组别的用户会均匀分布在多个web服务器实例上,此时需要整个web服务器集群中的所有实例对连接的对应组的第一用户进行推送websocket消息,因此需要整个web服务器集群推送相同的消息,从而实现消息的全局分发。
第二接收模块208,用于第一用户接收web服务器发送的消息。
综上所述,当需要进行消息推送时,首先建立第一用户与web服务器之间的消息连接,然后接收第二用户进行web登录后发送到web服务器的消息,并验证所述消息是否合法,若否,则结束非法访问,若是,则:进行redis数据高速并发处理,然后进行kafka分区消息处理,web服务器同时消费kafka消息,多台web服务器同时推送相同数据到对应websocket连接分组用户中,最后所述第一用户接收web服务器发送的消息。本发明通过html5前端与分布式web服务器建立连接,利用kafka消息生产和消费的原理,同时使用redis进行消息同步处理,实时稳定接收分布式web全局消息,实现分布式web消息的推送,具有健壮性、可扩展性、全局性、一致性、高并发等优点。
具体的,在上述实施例中,建立模块201建立第一用户与web服务器之间的消息连接的其中一种实现方式可以是:
s1、接收第一用户的web登录请求;
当需要建立第一用户与web服务器之间的消息连接时,第一用户进行web登录,web服务器接收第一用户的web登录请求。
s2、基于登录请求建立连接,产生认证cookie信息,携带cookie信息发起websocket长连接请求,解析websocket中的cookie信息,判断是否合法,若否,则非法访问结束,若是,则:建立websocket连接,将该连接加入相应分组中。
根据接收到的登录请求,建立websocket连接,web服务器将websocket请求转化为http请求类型,同时提取对应的预先加密的cookie信息,解密分析cookie信息是否合法,若合法则建立websocket连接,否则,拒绝此次连接请求。其中,cookie加密使用特殊的分隔符号将多个用户信息按照一定顺序排列并采用des加密算法以及cbc加密模式的方式加密整个cookie信息。第一用户请求经过nginx反向代理以及通过负载均衡算法将连接请求均匀分布到web服务器集群中,第一用户的长连接均匀的建立在web服务器上。其中,第一用户在进行websocket长连接时,在请求的uri地址中携带分组参数,利用uri地址中的参数进行分组管理,实现单独对不同组用户的消息传递。websocket的分组连接信息存储结构的安全性,采用线程安全的快速查找map结构concurrenthashmap和高性能线程安全集合copyonwritearrayset结构。
具体的,在基于登录请求建立连接,产生认证cookie信息,携带cookie信息发起websocket长连接请求,解析websocket中的cookie信息,判断是否合法时,可以采用以下方式:
第一用户登录成功后,浏览器访问即时推送页面;
浏览器执行js,发起ws或wss连接请求;
web服务器解析接收到的ws或wss连接请求,并获取cookie信息;
将对应的cookie信息利用web服务器对应的key进行des解密;
将得到的明文字符串进行拆分成6个部分;
将拆分的6个部分信息进行比对,判断是否全部合法,若合法则建立连接,若不合法,则拒绝连接。
具体的,在上述实施例中,验证模块203验证消息是否合法其中一种实现方式可以是:
接收第二用户携带验证信息发起推送数据的http请求;
web服务器接收到http请求,验证cookie信息是否合法,若否,则结束非法访问,若是,则:
验证请求签名sign字段是否合法,若否,则结束非法访问,若是,则:
对请求进行重复性校验是否允许推送数据,若否,则结束非法访问,若是,则:
进行redis数据高速并发处理。
具体的,在上述实施例中,第二处理模块206进行kafka分区消息处理其中一种实现方式可以是:
web服务器对处理好的数据进行封装,同时序列化成json数据,生产消息到kafka服务器对用的topic上;
web服务器集群上的所有实例同时订阅所述topic,其中,所有的web服务器根据redis分布式锁实现处于不同的group中。
综上所述,本发明利用websocket、redis、kafka进行即时消息推送,充分利用服务器的cpu、内存、网络带宽资源,有效的解决了推送延迟、实现了推送并发高以及推送消耗资源少。
为了更加特定地强调实施的独立性,本说明书涉及许多模块或单元。举例而言,模块或单元可由硬件电路实现,该硬件电路包括特制vlsi电路或门阵列,比如逻辑芯片、晶体管,或其它组件。模块或单元也可在可编程的硬设备中实现,比如场效可编程门阵列、可编程阵列逻辑、可编程逻辑设备等等。
模块或单元也可在藉由各种形式的处理器所执行的软件中实现。比如说,一可执行码模块可包括一个或多个实体的或逻辑的计算机指令区块,该区块可能形成为,比如说,对象、程序或函数。然而,鉴别模块或单元的可执行部分不需要物理上放置在一起,但可由存于不同位置的不同指令所组成,当逻辑上组合在一起时,形成模块或单元且达到该模块或单元所要求的目的。
实际上,可执行码模块或单元可以是一单一指令或多个指令,甚至可以分布在位于不同的程序的数个不同的码区段,并且横跨数个存储设备。同样地,操作数据可被辨识及显示于此模块或单元中,并且可以以任何合适的形式实施且在任何合适的数据结构形式内组织。操作数据可以集合成单一数据集,或可分布在具有不同的存储设备的不同的位置,且至少部分地只以电子信号方式存在于一系统或网络。
本说明书所提及的“实施例”或类似用语表示与实施例有关的特性、结构或特征,包括在本发明的至少一实施例中。因此,本说明书所出现的用语“在一实施例中”、“在实施例中”以及类似用语可能但不必然都指向相同实施例。
再者,本发明所述特性、结构或特征可以以任何方式结合在一个或多个实施例中。以下说明将提供许多特定的细节,比如编程序、软件模块、用户选择、网络交易、数据库查询、数据库结构、硬件模块、硬件电路、硬件芯片等例子,以提供对本发明实施例的了解。然而相关领域的普通技术人员将看出本发明,即使没有利用其中一个或多个特定细节,或利用其它方法、组件、材料等亦可实施。另一方面,为避免混淆本发明,公知的结构、材料或操作并没有详细描述。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。