一种基于Redis订阅服务的分布式实时聊天系统及方法与流程

文档序号:14953037发布日期:2018-07-17 22:58阅读:316来源:国知局

本发明涉及一种实时聊天系统及其实现方法,具体涉及一种基于redis订阅服务的分布式实时聊天系统及方法,属于互联网技术领域。



背景技术:

现有技术中的聊天系统中,系统的架构普遍采用典型的单机程序结构,即聊天推送服务部署在一台单独的服务器上,通过tcp服务对外提供端口和连接支持,所有需要聊天服务的客户端也通过tcp协议连接到改聊天服务器上,某个客户端发出消息后,经过聊天服务器的中转,转发到其他所有连接到该服务器的客户端上。

传统的单机程序的聊天服务,存在以下三方面缺点,

第一:单节点问题,由于传统技术方案中采用的是单服务器节点的架构,如果聊天服务器出现故障无法访问时,将会造成整个聊天服务的瘫痪;

第二:无法横向扩展的问题,在传统技术方案中,由于各个客户端之间的消息需要互相传递,所以所有客户端必须连上同一台聊天服务器,这就会导致在系统负载变大的时候,我们无法通过再增加一台聊天服务器来增加系统的处理容量,限制了系统的并发规模;

第三:无法为客户端提供就近接入的问题,因为是整个系统是一个单机程序结构,只能部署在一个机房,这就导致处于不同地域的客户端在连接时跨地域较大,连接质量也难以保证。

本提案提供的实时聊天系统分部署方法,通过将系统进行分层,借助redis消息订阅服务来传递系统内部消息,可以达到聊天服务节点的分部署部署,从而解决上述存在的三个问题。

因此,研制一种分布式结构、可横向扩展和易于实现客户端就近接入的聊天系统及方法是非常必要的,并且该发明也有重要的应用前景。



技术实现要素:

本发明针对上述现有技术存在的问题作出改进,即本发明的第一个目的在于公开一种基于redis订阅服务的分布式实时聊天系统的实现方法,本发明的第二个目的在于公开基于redis订阅服务的分布式实时聊天系统,采用分布式结构、可横向扩展和易于实现客户端就近接入。

为了实现上述目标,本发明所采用的技术方案是:

一种基于redis订阅服务的分布式实时聊天系统的实现方法,其特征在于,包括以下步骤:

s1、建立每一个后端节点与redis数据库之间的消息订阅/发布通道;

建立每一个前端节点与redis数据库之间的消息订阅/发布公共通道;

s2、客户端与前端节点建立连接,通过连接发送聊天数据到前端节点;

s3、前端节点检查维护在自身内存中的后端节点可用列表,剔除其中不可用的节点,仅保留可用的后端节点;

s4、前端节点从后端节点可用列表中随机选择一个可用的后端节点,根据步骤s1中建立的后端节点与redis数据库之间的消息订阅/发布通道,向redis数据库发布从客户端收到的聊天数据;

s5、后端节点通过订阅的redis的消息订阅通道收到聊天数据,然后由后端节点对该聊天数据进行处理;

s6、后端节点通过步骤s1中建立的消息订阅/发布公共通道向所有的前端节点发布本条聊天数据;

s7、前端节点收到本条聊天消息后轮询获取所有连接到自己并处于同一聊天会话的客户端,依次将聊天数据发送到客户端;

s8、所有处于同一聊天会话的客户端收到聊天数据。

前述的基于redis订阅服务的分布式实时聊天系统的实现方法,其特征在于,所述步骤s2中,客户端与前端节点建立的连接为http长连接。

前述的基于redis订阅服务的分布式实时聊天系统的实现方法,其特征在于,所述步骤s3中,前端节点根据zookeeper的实时心跳探测机制,剔除不可用的节点,保留可用节点。

前述的基于redis订阅服务的分布式实时聊天系统的实现方法,其特征在于,所述步骤s5中,后端节点对消息的处理包括但不限于以下各项:关键词过滤、存储。

一种基于redis订阅服务的分布式实时聊天系统,其特征在于,包括:若干个后端节点(1)、redis数据库(2)、若干个前端节点(3)和若干个客户端(4);

每个所述客户端(4)与一个所述前端节点(3)之间建立连接,每一个所述后端节点(1)与所述redis数据库(2)之间建立消息订阅/发布通道,每一个所述前端节点(3)与所述redis数据库(2)之间建立消息订阅/发布通道;

发送端所述客户端(4)收到的聊天信息通过所述前端节点(3)发送到所述redis数据库(2),然后通过所述redis数据库(2)的订阅/发布通道发送到所述前端节点(3)选择的可用的所述后端节点(1),所述后端节点(1)将收到的聊天信息通过所述redis数据库(2)与所有所述前端节点(3)之间的订阅/发布通道发送给所有的所述前端节点(3),所述前端节点(3)轮询所有与其连接的所述客户端(4),将聊天信息发送到与发送端所述客户端(4)处于同一会话的所述客户端(4)。

前述的基于redis订阅服务的分布式实时聊天系统,其特征在于,所述客户端(4)与所述前端节点(3)之间的连接为http长连接。

前述的基于redis订阅服务的分布式实时聊天系统,其特征在于,所述前端节点(3)还包括:后端节点可用列表,所述前端节点(3)根据所述后端节点可用列表随机选择一个可用的所述后端节点(1)。

前述的基于redis订阅服务的分布式实时聊天系统,其特征在于,所述前端节点(4)根据zookeeper的实时心跳探测机制维护后端节点可用列表。

与现有技术相比,本发明的有益之处在于:

(1)无单节点问题,本发明架构中的所有节点都是分布式部署的,并且使用了zookeeper来实时监控可用性和调整,不会出现一个节点故障的情况下影响整体聊天服务;

(2)可横向扩展,节点都是分布式的,可以快速的增加节点来提升处理能力,减少系统性能瓶颈;

(3)能够让客户端就近接入,前端节点分布在各个地理位置,配合调度逻辑能够让客户端接入到离自己最近的前端节点,提升连接质量。

附图说明

图1是现有技术中聊天系统的系统架构示意图;

图2是本发明的基于redis订阅服务的分布式实时聊天系统的一个具体实施例的系统结构图;

图3是本发明的基于redis订阅服务的分布式实时聊天系统的实现方法的流程图。

其中:

1-后端节点2-redis数据库

3-前端节点4-客户端。

具体实施方式

以下结合附图和具体实施例对本发明作具体的介绍。

参照图1和图3,本发明的基于redis订阅服务的分布式实时聊天系统的实现方法,包括以下步骤:

s1、建立每一个后端节点与redis数据库之间的消息订阅/发布通道;

建立每一个前端节点与redis数据库之间的消息订阅/发布公共通道;

redis数据库是一个开源的使用ansic语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的api,当redis数据库作为一个发布订阅服务使用时,其在订阅者和发布者之间起到了消息路由的功能,订阅者可以通过subscribe和psubscribe命令向redisserver订阅自己感兴趣的消息类型;redis数据库将消息类型称为通道(channel),当发布者通过publish命令向redis数据库发送特定类型的消息时,订阅该消息类型的全部客户端都会收到此消息,这里消息的传递是多对多的,一个客户端可以订阅多个通道,也可以向多个通道发送消息。

s2、客户端与前端节点建立连接,通过连接发送聊天数据到前端节点;

s3、前端节点检查维护在自身内存中的后端节点可用列表,剔除其中不可用的节点,仅保留可用的后端节点;

s4、前端节点从后端节点可用列表中随机选择一个可用的后端节点,根据步骤s1中建立的后端节点与redis数据库之间的消息订阅/发布通道,向redis数据库发布从客户端收到的聊天数据;

s5、后端节点通过订阅的redis的消息订阅通道收到聊天数据,然后由后端节点对该聊天数据进行处理;

s6、后端节点通过步骤s1中建立的消息订阅/发布公共通道向所有的前端节点发布本条聊天数据;

s7、前端节点收到本条聊天消息后轮询获取所有连接到自己并处于同一聊天会话的客户端,依次将聊天数据发送到客户端;

s8、所有处于同一聊天会话的客户端收到聊天数据。

作为一种优选的方案,步骤s2中,客户端与前端节点建立的连接为http长连接。

作为一种优选的方案,步骤s3中,前端节点根据zookeeper的实时心跳探测机制,剔除不可用的节点,保留可用节点;zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,基于其对各后端节点1的探测心跳功能,将整个实时聊天系统中的后端节点1可用状态进行维护,保存在内存中,让每个前端节点3都知道其他各个后端节点1的可用状态。

作为一种优选的方案,步骤s5中,后端节点对消息的处理包括但不限于以下各项:关键词过滤、存储。

参照图2,本发明的基于redis订阅服务的分布式实时聊天系统,包括:两个后端节点1、redis数据库2、三个前端节点3和四个客户端4;

每个客户端4与一个前端节点3之间建立连接,每一个后端节点1与redis数据库2之间建立消息订阅/发布通道,每一个前端节点3与redis数据库2之间建立消息订阅/发布通道;

发送端客户端4收到的聊天信息通过前端节点3发送到redis数据库2,然后通过redis数据库2的订阅/发布通道发送到前端节点3选择的可用的后端节点1,后端节点1将收到的聊天信息通过redis数据库2与所有前端节点3之间的订阅/发布通道发送给所有的前端节点3,前端节点3轮询所有与其连接的客户端4,将聊天信息发送到与发送端客户端4处于同一会话的客户端4;

客户端4:指分布在各地连接到本发明的基于redis订阅服务的分布式实时聊天系统的所有客户端4,单个客户端4可以发送聊天数据,并且也能接收其他客户端4实时发送过来的聊天数据,在实际应用中,客户端4a、b、c、d加入到了同一个聊天室中,a发送一条聊天数据,b、c、d能够马上收到该条消息。

前端节点3:指代承载客户端连接连接的节点,可以分布在各个不同的地理位置,同一个会话里的多个客户端4可以连接到不同的前端节点3上面,前端节,3收到客户端4发送的聊天数据后,会通过redis数据库2订阅服务将聊天数据向后传递,同时,前端节点3还会通过redis数据库2订阅其他客户端4发送的聊天数据,将其转发给连接到自己并且属于同一个会话的客户端4。

redis数据库2:应用其消息订阅发布服务,来完成聊天数据在不同节点之间的传递与解耦合;

后端节点1:指代接收前端节点3聊天数据,进行处理与转发的节点,后端节点1会通过redis数据库2订阅前端节点3发布过来的聊天数据,进行处理,再将该聊天数据通过redis数据库2发布给所有的前端节点3,以达到推送聊天数据的目的。

作为一种优选的方案,客户端4与前端节点3之间的连接为http长连接。

作为一种优选的方案,前端节点3还包括:后端节点可用列表,前端节点3根据后端节点可用列表随机选择一个可用的后端节点1。

作为一种更加优选的方案,前端节点4根据zookeeper的实时心跳探测机制维护后端节点可用列表。

综上所述,本发明的基于redis订阅服务的分布式实时聊天系统及方法,采用了分层的思想,通过将传统的聊天系统分为前端节点和后端节点,并且将前端节点和后端节点通过redis的订阅服务来进行连接;前端节点和后端节点都可以支持多实例横向扩展,如此一来便构成了整个分布式的聊天系统架构;同时,通过zookeeper的心跳机制,快速的排除集群中存在问题的节点,达到整体服务的高可用。

需要说明的是,以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1