一种消息推送方法、装置、电子设备及存储介质与流程

文档序号:25596536发布日期:2021-06-22 17:15阅读:81来源:国知局
一种消息推送方法、装置、电子设备及存储介质与流程

本发明涉及消息推送技术领域,尤其涉及一种消息推送方法、装置、电子设备及存储介质。



背景技术:

当前的即时推送系统中,客户端接入服务端推送系统,主要通过tcp协议连接负载均衡器,负载均衡器再将流量随机转接至客户端代理层proxy。在房间、频道、直播间等业务场景中,订阅关系会有三个维度,分别是频道、客户端标识(即用户标识)、proxy标识。一条推往某个指定房间的消息,需要先路由到proxy,再路由到客户端。

目前主要有两种可行的方式,一种是无视与proxy的订阅关系,将推送消息广播到所有proxy,由proxy根据本地的房间、客户端的订阅关系,推送消息或是丢弃消息。这种方式简化了订阅关系的处理;但是,将消息广播到所有的proxy,对每个proxy来说大部分消息都是无效的,即无效消息放大,大量的无效消息对网络资源、cpu资源造成了极大的浪费;而且,由于消息是直接广播至所有proxy,当消息量达到单机负载瓶颈,水平扩容将失去任何效果。

另一种是由上层业务或者推送服务入口去处理订阅关系,即在推送入口处查询房间与proxy的订阅关系,然后设置消息队列(mq)路由规则,再由proxy根据本地订阅关系推送到客户端,这种方式由于订阅关系比较庞大且变化快,且频道与proxy的订阅关系不可控,一个频道可能会被多个proxy订阅,消息需要投递多次,从而提高存储成本,以及导致性能延时。



技术实现要素:

本发明提供了一种消息推送方法、装置、电子设备及存储介质,用于解决现有的消息推送方法频道与代理层的订阅关系不可控,一个频道可能会被多个代理层订阅的技术问题。

本发明提供了一种消息推送方法,包括:

通过预设的网关接收预设客户端针对预设频道的第一订阅请求,并将所述第一订阅请求发送至预设第一代理层;

通过所述第一代理层将所述第一订阅请求转化为第二订阅请求,并将所述第二订阅请求发送至预设中心化组件;

通过所述中心化组件响应所述第二订阅请求确定目标代理层,并判断所述目标代理层与所述第一代理层是否相同;

若相同,则通过所述第一代理层向所述客户端返回订阅成功消息,并生成所述目标代理层与所述频道的订阅关系;

当接收到针对所述频道的推送请求时,基于所述订阅关系将所述推送请求对应的推送消息发送至对应的客户端。

可选地,还包括;

若所述目标代理层与所述第一代理层不同,则通过所述第一代理层向所述客户端返回所述目标代理层的代理层标识;所述代理层标识用于所述客户端发起二次订阅。

可选地,所述通过所述中心化组件响应所述第二订阅请求确定目标代理层的步骤,包括:

通过所述中心化组件判断是否存在所述频道对应的订阅关系;

若是,根据所述订阅关系确定目标代理层;

若否,为所述频道分配第二代理层,将所述第二代理层作为所述频道的目标代理层。

可选地,所述当接收到针对所述频道的推送请求时,基于所述订阅关系将所述推送请求发送至所述客户端的步骤,包括:

当接收到针对所述频道的推送请求时,基于所述订阅关系获取所述频道对应的代理层标识,并将所述代理层标识发送至预设消息队列;

通过所述消息队列将所述推送请求对应的推送消息发送至所述代理层标识对应的目标代理层;以通过所述目标代理层将所述推送消息发送至所述客户端。

本发明提供了一种消息推送装置,包括:

第一订阅请求发送模块,用于通过预设的网关接收预设客户端针对预设频道的第一订阅请求,并将所述第一订阅请求发送至预设第一代理层;

第二订阅请求发送模块,用于通过所述第一代理层将所述第一订阅请求转化为第二订阅请求,并将所述第二订阅请求发送至预设中心化组件;

目标代理层确定模块,用于通过所述中心化组件响应所述第二订阅请求确定目标代理层,并判断所述目标代理层与所述第一代理层是否相同;

订阅成功消息返回模块,用于若相同,则通过所述第一代理层向所述客户端返回订阅成功消息,并生成所述目标代理层与所述频道的订阅关系;

推送模块,用于当接收到针对所述频道的推送请求时,基于所述订阅关系将所述推送请求对应的推送消息发送至对应的客户端。

可选地,还包括;

代理层标识返回模块,用于若所述目标代理层与所述第一代理层不同,则通过所述第一代理层向所述客户端返回所述目标代理层的代理层标识;所述代理层标识用于所述客户端发起二次订阅。

可选地,所述目标代理层确定模块,包括:

订阅关系判断子模块,用于通过所述中心化组件判断是否存在所述频道对应的订阅关系;

第一目标代理层确定子模块,用于若是,根据所述订阅关系确定目标代理层;

第二目标代理层确定子模块,用于若否,为所述频道分配第二代理层,将所述第二代理层作为所述频道的目标代理层。

可选地,所述推送模块,包括:

代理层标识发送子模块,用于当接收到针对所述频道的推送请求时,基于所述订阅关系获取所述频道对应的代理层标识,并将所述代理层标识发送至预设消息队列;

推送子模块,用于通过所述消息队列将所述推送请求对应的推送关系发送至所述代理层标识对应的目标代理层;以通过所述目标代理层将所述推送消息发送至所述客户端。

本发明还提供了一种电子设备,所述设备包括处理器以及存储器:

所述存储器用于存储程序代码,并将所述程序代码传输给所述处理器;

所述处理器用于根据所述程序代码中的指令执行如上任一项所述的消息推送方法。

本发明还提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质用于存储程序代码,所述程序代码用于执行如上任一项所述的消息推送方法。

从以上技术方案可以看出,本发明具有以下优点:本发明通过采用通过预设的网关接收预设客户端针对预设频道的第一订阅请求,并将第一订阅请求发送至预设第一代理层;通过第一代理层将第一订阅请求转化为第二订阅请求,并将所述第二订阅请求发送至预设中心化组件;通过中心化组件响应第一订阅请求确定目标代理层,并判断目标代理层与第一代理层是否相同;若相同,则通过第一代理层向客户端返回订阅成功消息,并生成目标代理层与频道的订阅关系;当接收针对频道的推送请求时,基于订阅关系将推送请求发送至对应的客户端。解决了现有的消息推送方法频道与代理层的订阅关系不可控,一个频道可能会被多个代理层订阅的技术问题。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。

图1为本发明实施例提供的一种消息推送方法的步骤流程图;

图2为本发明另一实施例提供的一种消息推送方法的步骤流程图;

图3为本发明实施例提供的一种消息推送过程的架构图;

图4为本发明实施例提供的一种消息推送装置的结构框图。

具体实施方式

本发明实施例提供了一种消息推送方法、装置、电子设备及存储介质,用于解决现有的消息推送方法频道与代理层的订阅关系不可控,一个频道可能会被多个代理层订阅的技术问题。

为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

请参阅图1,图1为本发明实施例提供的一种消息推送方法的步骤流程图。

本发明实施例提供了一种消息推送方法,具体可以包括以下步骤:

步骤101,通过预设的网关接收预设客户端针对预设频道的第一订阅请求,并将第一订阅请求发送至预设第一代理层;

步骤102,通过第一代理层将第一订阅请求转化为第二订阅请求,并将第二订阅请求发送至预设中心化组件;

代理层proxy,主要提供多种接入协议,同时维护客户端连接以及客户端与频道的订阅关系,消费来自消息队列的消息,并将该消息推送到客户端,同时与中心化组件controller建立长连接。其中,代理层proxy提供的接入协议可以为grpc、websocket等。grpc、websocket都是长连接,可以满足推送需要,同时其都具有http头部,网关可以通过头部信息进行路由。

中心化组件controller组件,可以根据频道号分片处理对该频道的订阅请求以及对该频道进行负载调度,同时向推送服务(push-server)同步频道-proxy的订阅关系的元数据。在本发明实施例中,多个有状态的controller组件可以组成集群,以实现对不同频道的控制。

在本发明实施例中,当通过预设的网关接收到预设客户端针对预设频道的第一订阅请求时,由于第一订阅请求没有头部信息,所以第一订阅请求会随机发到一个proxy-n处,proxy-n会将客户端对于频道的订阅请求变成proxy-n对频道的第二订阅请求,发送到中心化组件进行处理。

其中,第一代理层可以根据每个代理层的实际负载情况选定。

步骤103,通过中心化组件响应第二订阅请求确定目标代理层,并判断目标代理层与第一代理层是否相同;

在本发明实施例中,中心化组件在接收到第二订阅请求时,会获取频道对应的目标代理层。此时,需要判断目标代理层和第一代理层是否相同,用于判断频道是否订阅成功。

步骤104,若相同,则通过第一代理层向客户端返回订阅成功消息,并生成目标代理层与频道的订阅关系;

当目标代理层与第一代理层是同一个时,表示订阅成功。此时,中心化组件可以向目标代理层返回订阅成功消息,以通过目标代理层将订阅成功消息转发至客户端。此外,中心化组件还会生成并保存该频道与目标代理层之间的订阅关系,以便于后续基于订阅关系查找频道对应的目标代理层。

步骤105,当接收到针对频道的推送请求时,基于订阅关系将推送请求对应的推送消息发送至对应的客户端。

在本发明实施例中,当接收到针对该频道的推送请求时,可以基于订阅关系将推送请求对应的推送消息发送至对应的客户端。

本发明通过采用通过预设的网关接收预设客户端针对预设频道的第一订阅请求,并将第一订阅请求发送至预设第一代理层;通过第一代理层将第一订阅请求转化为第二订阅请求,并将第二订阅请求发送至预设中心化组件;通过中心化组件响应第一订阅请求确定目标代理层,并判断目标代理层与第一代理层是否相同;若相同,则通过第一代理层向客户端返回订阅成功消息,并生成目标代理层与频道的订阅关系;当接收针对频道的推送请求时,基于订阅关系将推送请求对应的推送消息发送至对应的客户端。解决了现有的消息推送方法频道与代理层的订阅关系不可控,一个频道可能会被多个代理层订阅的技术问题。

请参阅图2,图2为本发明另一实施例提供的一种消息推送方法的步骤流程图。具体可以包括以下步骤:

步骤201,通过预设的网关接收预设客户端针对预设频道的第一订阅请求,并将第一订阅请求发送至预设第一代理层;

步骤202,通过第一代理层将第一订阅请求转化为第二订阅请求,并将第二订阅请求发送至预设中心化组件;

步骤201-202与步骤101-102相同,具体内容可以参照步骤201-202的描述,此处不再赘述。

步骤203,通过中心化组件响应第二订阅请求确定目标代理层,并判断目标代理层与第一代理层是否相同;

在本发明实施例中,中心化组件在接收到第二订阅请求时,会获取频道对应的目标代理层。其中,通过中心化组件响应第二订阅请求确定目标代理层的步骤可以包括:

s31,通过中心化组件判断是否存在频道对应的订阅关系;

s32,若是,根据订阅关系确定目标代理层;

s33,若否,为频道分配第二代理层,将第二代理层作为频道的目标代理层。

在具体实现中,中心化组件在接收到第二订阅请求后,会先判断是否有代理层订阅了该频道,若是,将该频道所在的代理层确定为目标代理层;若否,为该频道动态分配一个第二代理层作为目标代理层,同时在中心化组件集群注册这条订阅关系。

接着,判断目标代理层和第一代理层是否相同,以判断频道是否订阅成功。

步骤204,若相同,则通过第一代理层向客户端返回订阅成功消息,并生成目标代理层与频道的订阅关系;

若第一代理层和目标代理层相同,则向目标代理层返回订阅成功消息,目标代理层可以将订阅成功消息和目标代理层或目标代理层所在的代理层逻辑分组的标识转发至对应的客户端。

步骤205,若目标代理层与第一代理层不同,则通过第一代理层向客户端返回目标代理层的代理层标识;代理层标识用于客户端发起二次订阅;

若目标代理层和第一代理层不同,则返回将目标代理层的代理层标识或目标代理层所在的逻辑分组的标识返回给客户端,然后断开连接;客户端可以将目标代理层或其所在的逻辑分组的标识(如id)加入到http请求的头部,生成第三订阅请求,重新发起订阅请求,网关根据头部中的id,将订阅请求转发到指定的代理层或该代理层所在的逻辑分组中,通过代理层重新向中心化组件发起订阅。以完成客户端对频道的订阅。

步骤206,当接收到针对频道的推送请求时,基于订阅关系获取频道对应的代理层标识,并将代理层标识发送至预设消息队列;

步骤207,通过消息队列将推送请求对应的推送消息发送至代理层标识对应的目标代理层;以通过目标代理层将推送消息发送至客户端。

在本发明实施例中,中心化组件通过长连接连接到推送服务(push-server),中心化组件通过增量或全量的方式将频道-proxy形式的订阅关系同步到push-server。当有一条频道推送请求进来后,push-server可以查询本地订阅关系,获得一个或多个key,key是代理层proxy或proxy逻辑分组(group)的标识,如id,以这个key作为消息队列的routing-key将推送请求进行投递,并进一步通过消息队列将推送消息转发至频道对应的目标代理层,目标代理层根据与客户端之间的连接关系将推送消息发送至对应的客户端。

需要说明的是,routing-key用于消息队列mq进行路由,生产者指定消息的routing-key,只有订阅了该routing-key的用户才能收到这条消息。在一个示例中,当一条消息投递的routing-key是proxy-1,那么只有代理层是proxy-1的这个用户能收到这条消息,而其他用户接收不到这条消息。如果routing-key是group-1,那么只有属于group-1的用户才能接收到这条消息。

为便于理解,以下通过具体示例进行说明。

请参阅图3,图3为本发明实施例提供的一种消息推送过程的架构图。

如图3所示,整个架构可以包括六大部分,包括:proxy、controller组件、gateway(网关)、mq组件(消息队列)、push-server(推送服务)和presence组件。

其中,proxy主要用于提供多种接入协议,同时维护客户端连接以及客户端与频道的订阅关系,消费来自消息队列的消息并推送到客户端,同时与controller组件建立长连接,进行状态上报,以及频道订阅行为、调度指令的接收。

在具体应用中,客户端通过grpc或websocket连接到proxy,网关根据请求头部将流量分发到proxy,当proxy接收到客户端订阅请求后,将订阅请求发送至controller,然后根据controller的响应内容,向客户端发送订阅成功消息或重定向响应;客户端可携带重定向响应中携带的代理层标识/代理层逻辑分组标识重新发起订阅请求。proxy在接收到来自mq的消息时,可以基于本地订阅关系,将该消息发送给客户端。需要说明的是,proxy在启动时会向mq订阅proxyid、groupid和all三个routing-key。

controller组件,可以由多个有状态的controller组件组成集群,每个controller组件根据频道号分片处理频道的订阅请求以及进行负载调度。同时向push-serververy同步频道-proxy订阅关系的元数据。

在具体应用中,controller组件可以接收来自proxy的订阅请求,根据负载情况选择一个合适的proxy,然后通过该proxy向客户端回复订阅成功消息或回复一个带有proxyid的重定向响应。此外,还可以同步订阅关系以及proxy负载状态到其他的controller组件。

mq组件:rabbitmq集群,负责消息从push-server到proxy的路由。

push-server:与controller组件建立长连接同步频道-proxy订阅关系,接收推送请求,根据订阅关系将推送请求投递至mq。

在具体应用中,push-server的功能如下:

1、通过流式grpc从controller组件同步频道的订阅关系,以及频道调度的策略。

2、单推:从presence服务查询到proxyid。

3、广播:用频道id从本地频道订阅关系中查询出proxyid或groupid,如果未查到,则使用调度策略计算出proxyid或groupid。

4、用proxyid或groupid将消息发送至mq。

presence组件:主要是单推用的组件,用来存储用户id-proxy订阅关系。

在本发明实施例中,本发明实施例还可以对频道进行调度。其中,调度过程可以包括扩容、缩容、驱逐等。

驱逐过程:中心化组件会向代理层发送一条指令,驱逐某个房间全部或指定数量的客户端,并且带上驱逐后调度的代理层/逻辑分组的标识,代理层根据指令内容,向对应的客户端发送驱逐指令和新的代理层/逻辑分组的标识,并设置超时时间(超时时间用于防止客户端不处理,超时后会自动断开与客户端之间的连接),客户端根据驱逐指令的内容重新发起订阅请求,订阅成功后,断开旧的连接。需要说明的是,新建一条连接再断开旧的连接是为了防止订阅失败。缩容过程与驱逐过程类似,此处不作具体描述。

扩容过程:中心化组件会根据订阅情况、代理层负载情况、频道人数等指标,判断一个代理层或频道是否需要扩容,如果需要扩容,会先把一个新的代理层或者代理层逻辑分组写入订阅关系中,并且设定一个触发阈值,同步到中心化组件集群及push-server中,往后所有新的订阅都会转到新的代理层中。需要说明的是,扩容操作可以通过设置不同指标各自对应的阈值,在达到阈值的时候自动触发,也可以是外部人工操作触发。

请参阅图4,图4为本发明实施例提供的一种消息推送装置的结构框图。

本发明实施例提供了一种消息推送装置,包括:

第一订阅请求发送模块401,用于通过预设的网关接收预设客户端针对预设频道的第一订阅请求,并将第一订阅请求发送至预设第一代理层;

第二订阅请求发送模块402,用于通过第一代理层将第一订阅请求转化为第二订阅请求,并将第二订阅请求发送至预设中心化组件;

目标代理层确定模块403,用于通过中心化组件响应第二订阅请求确定目标代理层,并判断目标代理层与第一代理层是否相同;

订阅成功消息返回模块404,用于若相同,则通过第一代理层向客户端返回订阅成功消息,并生成目标代理层与频道的订阅关系;

推送模块405,用于当接收到针对频道的推送请求时,基于订阅关系将推送请求对应的推送消息发送至对应的客户端。

在本发明实施例中,装置还包括;

代理层标识返回模块,用于若目标代理层与第一代理层不同,则通过第一代理层向客户端返回目标代理层的代理层标识;代理层标识用于客户端发起二次订阅。

在本发明实施例中,目标代理层确定模块403,包括:

订阅关系判断子模块,用于通过中心化组件判断是否存在频道对应的订阅关系;

第一目标代理层确定子模块,用于若是,根据订阅关系确定目标代理层;

第二目标代理层确定子模块,用于若否,为频道分配第二代理层,将第二代理层作为频道的目标代理层。

在本发明实施例中,推送模块405,包括:

代理层标识发送子模块,用于当接收到针对频道的推送请求时,基于订阅关系获取频道对应的代理层标识,并将代理层标识发送至预设消息队列;

推送子模块,用于通过消息队列将推送请求对应的推送消息发送至代理层标识对应的目标代理层;以通过目标代理层将推送消息发送至客户端。

本发明实施例还提供了一种电子设备,设备包括处理器以及存储器:

存储器用于存储程序代码,并将程序代码传输给处理器;

处理器用于根据程序代码中的指令执行本发明任一实施例的消息推送方法。

本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质用于存储程序代码,程序代码用于执行本发明任一实施例的消息推送方法。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

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