一种数据传输方法、装置、设备及可读存储介质与流程

文档序号:26278237发布日期:2021-08-13 19:34阅读:75来源:国知局
一种数据传输方法、装置、设备及可读存储介质与流程

本申请涉及计算机技术领域,尤其涉及一种数据传输方法、装置、设备以及可读存储介质。



背景技术:

消息队列遥测传输(messagequeuingtelemetrytransport,mqtt)是一个即时通信协议,采用发布/订阅的模式,可以适用于低功耗和网络带宽有限的物联网设备。作为物联网的重要传输协议,mqtt支持几乎所有平台。

发布和订阅模式中,发布者向mqtt服务器发送一条带有特定主题的消息,订阅者通过向服务器订阅这一主题,从而接收从服务器发来的消息。

现有方案中,大部分是mqtt单节点方案,即是单机的mqtt服务,并不支持集群化部署,存在单点故障;而一部分集群方案是将订阅信息存储在redis数据库中,该集群方案中各个mqtt服务器保存各自的订阅信息,在接收到发布消息时需要将该发布消息广播到所有的mqtt服务器,大大浪费了传输流量。



技术实现要素:

本申请实施例提供一种数据传输方法、装置、设备以及可读存储介质,可以实现代理节点同步订阅信息,减少数据传输中的传输流量。

本申请实施例一方面提供了一种数据传输方法,包括:

第一目标代理节点接收目标发布客户端针对目标消息的发布请求;发布请求包括目标消息的主题信息;

基于发布请求遍历订阅树;订阅树用于基于层级结构存储方式存储订阅客户端、订阅客户端所订阅的订阅主题信息以及订阅客户端对应的代理节点之间的关联关系;

基于目标消息的主题信息,在订阅树所存储的代理节点中获取待传输代理节点;待传输代理节点对应的待传输订阅客户端所订阅的订阅主题信息,与目标消息的主题信息相匹配;订阅客户端包括待传输订阅客户端;

将目标消息发送至待传输代理节点,以使待传输代理节点将目标消息转发至待传输代理节点对应的待传输订阅客户端。

本申请实施例一方面提供了一种数据传输装置,包括:

请求接收模块,用于接收目标发布客户端针对目标消息的发布请求;发布请求包括目标消息的主题信息;

数据遍历模块,用于基于发布请求遍历订阅树;订阅树用于基于层级结构存储方式存储订阅客户端、订阅客户端所订阅的订阅主题信息以及订阅客户端对应的代理节点之间的关联关系;

节点查询模块,用于基于目标消息的主题信息,在订阅树所存储的代理节点中获取待传输代理节点;待传输代理节点对应的待传输订阅客户端所订阅的订阅主题信息,与目标消息的主题信息相匹配;订阅客户端包括待传输订阅客户端;

消息发送模块,用于将目标消息发送至待传输代理节点,以使待传输代理节点将目标消息转发至待传输代理节点对应的待传输订阅客户端。

在一个实施例中,订阅树包括根节点、历史父节点以及历史子节点;历史父节点用于存储历史主题信息对应的第一主题层级内容,历史子节点用于存储历史主题信息对应的第二主题层级内容;第一主题层级内容对应的层级高于第二主题层级内容对应的层级;存储同一历史主体信息的历史父节点与历史子节点具有连接关系;历史主体信息包括目标消息的主题信息;

节点查询模块,还具体用于根据第一主题层级内容中目标消息的主题信息的层级内容、以及第二主题层级内容中目标消息的主题信息的层级内容,在订阅树中所存储的代理节点中获取待传输代理节点。

在一个实施例中,目标消息的主题信息包括第一层级与第二层级;第一层级高于第二层级;目标消息的主题信息的层级内容包括第一层级对应的第一层级内容,以及第二层级对应的第二层级内容;

节点查询模块包括:

节点遍历单元,用于遍历订阅树中的历史父节点,将包括第一层级内容的历史父节点,确定为待传输父节点;

节点遍历单元,还用于遍历订阅树中,待传输父节点所对应的历史子节点,将包括第二层级内容的历史子节点,确定为待传输子节点;

节点确定单元,用于获取待传输子节点中所包括的历史节点标识,将历史节点标识所对应的代理节点确定为待传输代理节点。

在一个实施例中,该数据传输装置还包括:

订阅请求接收模块,用于在第一时刻时,接收第一订阅客户端针对目标消息的主题信息的第一订阅请求;

订阅信息确定模块,用于基于第一订阅请求,获取第一订阅客户端的第一客户端标识与第一目标代理节点的第一节点标识;

订阅信息确定模块,还用于将第一客户端标识、目标消息的主题信息以及第一节点标识所组成的三元组,确定为第一订阅信息;

树构建模块,用于将第一订阅信息存储至消息队列;

树构建模块,还用于根据消息队列构建订阅树。

在一个实施例中,消息队列中还包括第二目标代理节点在第二时刻时存储的第二订阅信息;第二订阅信息由第二目标代理节点基于第二订阅客户端在第二时刻时发送的第二订阅请求所确定;第二订阅信息包括第二订阅客户端的第二客户端标识、目标消息的主题信息以及第二目标代理节点的第二节点标识;

树构建模块包括:

时刻获取单元,用于当到达订阅树更新时间时,获取消息队列中的第一订阅信息、第二订阅信息、第一订阅信息对应的第一时刻以及第二订阅信息对应的第二时刻;

树构建单元,用于若第一时刻早于第二时刻,则根据第一订阅信息构建初始订阅树;

树构建单元,还用于根据第二订阅信息对初始订阅树进行更新,得到订阅树。

在一个实施例中,目标消息的主题信息包括第一层级与第二层级;第一层级高于第二层级;

树构建单元包括:

节点生成子单元,用于在目标消息的主题信息中,获取第一层级对应的第一层级内容,以及第二层级对应的第二层级内容;

节点生成子单元,还用于根据第一层级内容生成父节点;

节点生成子单元,还用于根据第二层级内容、第一客户端标识以及第一节点标识,生成父节点对应的子节点;

节点连接子单元,用于将父节点与子节点进行连接,得到初始订阅树。

在一个实施例中,节点生成子单元,还具体用于遍历订阅树中的历史父节点;

节点生成子单元,还具体用于若历史父节点中存在目标父节点,则将目标父节点确定为父节点;目标父节点所包括的层级内容与第一层级内容相同;

节点生成子单元,还具体用于若历史父节点中不存在目标父节点,则根据第一层级内容,生成第一新节点,将第一新节点确定为父节点。

在一个实施例中,节点生成子单元,还具体用于遍历订阅树中父节点所对应的历史子节点;

节点生成子单元,还具体用于若历史子节点中存在目标子节点,则将目标子节点确定为子节点;目标子节点所包括的层级内容与第二层级内容相同;

节点生成子单元,还具体用于若历史子节点中不存在目标子节点,则根据第二层级内容、第一客户端标识以及第一节点标识生成第二新节点,将第二新节点确定为子节点。

在一个实施例中,树构建单元包括:

节点更新子单元,用于将第二订阅信息对应的第二客户端标识,以及第二节点标识添加至子节点中,得到更新后的子节点;

树确定子单元,用于将包含更新后的子节点的初始订阅树,确定为订阅树。

在一个实施例中,该数据传输装置还包括:

规则库获取模块,用于获取检测规则库;检测规则库中包括异常文本与异常音频;

数据匹配模块,用于将目标消息与检测规则库中的异常文本、异常音频进行匹配;

提示信息生成模块,用于若目标消息中存在与异常文本相同的文本内容,或存在与异常音频相同的音频内容,则将目标消息确定为违规消息,生成违规提示信息,将违规提示信息发送至目标发布客户端以及待传输代理节点;

步骤执行模块,用于若目标消息中不存在与异常文本相同的文本内容,且不存在与异常音频相同的音频内容,则执行将目标消息发送至待传输代理节点的步骤。

在一个实施例中,该数据传输装置还包括:

拉取请求接收模块,用于接收上线代理节点发送的数据拉取请求;

序列处理模块,用于基于数据拉取请求,获取订阅树,将订阅树进行序列化处理,得到序列订阅树;

树发送模块,用于将序列订阅树发送至上线代理节点,以使上线代理节点将序列订阅树进行反序列化,得到订阅树,并存储订阅树。

本申请实施例一方面提供了一种计算机设备,包括:处理器和存储器;

存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行本申请实施例中的方法。

本申请实施例一方面提供了一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,计算机程序包括程序指令,程序指令当被处理器执行时,执行本申请实施例中的方法。

本申请的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本申请实施例中一方面提供的方法。

在本申请实施例中,各个代理节点可通过订阅树共同保存订阅的主题信息,也可以保存其他代理节点所需要订阅的主题信息(即实现代理节点之间的订阅信息的同步),那么当某个代理节点接收到某个消息的发布请求时,可遍历自身的订阅树,查找到订阅了该消息的主题信息的代理节点,可直接将该消息发送至这些订阅了该消息的主题信息的代理节点;也就是说,无需将消息广播至所有的代理节点,只需要发送至部分订阅了该消息的主题信息的代理节点即可,由此可减少消息的传递节点的数量,有效减少传输流量。综上,本申请可以通过订阅树存储订阅信息的方式,实现代理节点同步订阅信息,从而可以在传输数据(如目标消息)时,减少传输的代理节点数量,从而可以减少数据传输中的传输流量。

附图说明

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

图1是本申请实施例提供的一种网络架构图;

图2a-图2c是本申请实施例提供的一种发布/订阅消息的场景示意图;

图3是本申请实施例提供的一种数据传输方法的流程示意图;

图4是本申请实施例提供的一种订阅树存储订阅信息的示意图;

图5是本申请实施例提供的一种代理节点发送消息至其他代理节点的流程示意图;

图6是本申请实施例提供的一种构建订阅树的流程示意图;

图7是本申请实施例提供的一种构建订阅树的流畅示意图;

图8是本申请实施例提供的一种数据传输装置的结构示意图;

图9是本申请实施例提供的一种计算机设备的结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

请参见图1,图1是本申请实施例提供的一种网络架构示意图。如图1所示,该网络架构可以包括服务器1000、代理节点集群100以及用户终端集群10,用户终端集群10可以包括一个或者多个用户终端,这里将不对用户终端的数量进行限制;代理节点集群100可以包括一个或者多个代理节点(客户端代理,也可称之为broker),这里将不对代理节点的数量进行限制。如图1所示,多个用户终端可以包括用户终端10a、用户终端10b、用户终端10c、…、用户终端10n;多个代理节点可包括代理节点100a、代理节点100b、代理节点100c、…、代理节点100n。如图1所示,用户终端10a、用户终端10b、用户终端10c、…、用户终端10n可以分别与代理节点100中的任一代理节点进行网络连接,以便于每个用户终端可以通过该网络连接与代理节点100之间进行数据交互;代理节点100中的代理节点之间可以进行网络连接,以便于代理节点之间可以通过该网络连接进行数据交互;代理节点100a、代理节点100b、代理节点100c、…、代理节点100n可以分别与服务器1000之间进行网络连接,以便于每个代理节点可以通过该网络连接与服务器1000之间进行数据交互。

当每个用户终端与某个代理节点进行网络连接,且该代理节点与该服务器1000之间进行网络连接时,该用户终端可通过该网络连接、该代理节点以及该服务器1000与其他用户终端进行数据交互,以发布或订阅消息等。

如图1所示,本申请实施例中的服务器1000可以为提供各种服务的服务器,例如对用户终端10a、用户终端10b、…、用户终端10n通过代理节点集群100所订阅的消息提供存储或转发功能的后台云端服务器,可按时间对接收到的订阅信息进行存储并按时间进行排序,再按序依次将订阅信息转发至各个代理节点,使得各个代理节点可以按序依次存储各个订阅信息。该服务器1000可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统(如,kafka分布式系统),还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、cdn、以及大数据和人工智能平台等基础云计算服务的云服务器。

为便于理解,本申请实施例可以在图1所示的多个用户终端中选择一个用户终端作为目标用户终端,该用户终端可以包括:智能手机、平板电脑、笔记本电脑、桌上型电脑、智能电视、智能音箱、台式计算机、智能手表等携带数据处理功能的智能终端,但并不局限于此。例如,本申请实施例可以将图1所示的用户终端100a作为目标用户终端。

本申请实施例中,用户终端可理解为客户端,代理节点集群100以及服务器1000可进行mqtt服务,用户可通过用户终端集群10、代理节点集群100以及服务器100订阅感兴趣的主题,同时也可以接收发布客户端所发布的消息。当用户对应的用户终端连接到代理节点,用户可通过用户终端订阅感兴趣的主题;同理,当用户对应的用户终端连接到代理节点,也可以在一个主题上发布消息,则其他用户可通过其对应的用户终端订阅该主题并接收到该用户所发布的消息。

例如,以用户终端10a、用户终端10b以及用户终端10c为目标用户终端为例,用户终端10a对应的用户为用户a,用户终端10b对应的用户为用户b,用户终端10c对应的用户为用户c。用户终端10a所连接的代理节点为代理节点100a,用户终端10b所连接的代理节点为代理节点10b,用户终端10c所连接的代理节点为代理节点10c。用户a可通过用户终端10a订阅主题a,用户终端10a所连接的代理节点100a可将该用户终端10a针对主题a的订阅信息发送至服务器1000;用户b也可通过用户终端10b订阅主题a,用户终端10b所连接的代理节点100b也可将该用户终端10b针对主题a的订阅信息发送至服务器1000。

进一步地,在服务器1000中,可根据用户终端10a订阅该主题a的订阅时刻(即订阅时间)t1(本申请中,将代理节点100a接收到用户终端10a的订阅请求的时间,确认为该用户终端10a订阅主题a的订阅时间)与用户终端10b订阅该主题a的订阅时刻t2(本申请中,将代理节点100b接收到用户终端10b的订阅请求的时间,确认为该用户终端10b订阅主题a的订阅时间),对用户终端10a的订阅信息与用户终端10b的订阅信息进行排序(例如,订阅时刻t1早于订阅时刻t2,可将订阅时刻早的订阅信息排于订阅时刻晚的订阅信息之前,则得到的排序结果为{用户终端10a的订阅信息,用户终端10b的订阅信息})。进一步地,服务器1000可按序(例如,从前至后的顺序即按照订阅时间由早到晚的顺序)将用户终端10a的订阅信息以及用户终端10b的订阅信息先后发送至代理节点100a、代理节点100b以及代理节点100c,而代理节点100a、代理节点100b以及代理节点100c可先后将用户终端10a的订阅信息以及用户终端10c的订阅信息,存储至本机所维护的订阅树中。也就是说,代理节点100a、代理节点100b以及代理节点100c所维护的订阅树中,所存储的订阅信息是同步一致的。

应当理解,用户a可通过用户终端10c在主题a上发布消息,此时,用户终端10c所对应的代理节点100c可查阅本机维护的订阅树,查询到订阅了该主题a的用户终端包括用户终端10a与用户终端10b,该用户终端10a对应的代理节点为代理节点100a,该用户终端10b对应的代理节点为代理节点100b,则代理节点100c可将该用户a所发布的主题a的消息转发至代理节点100a与代理节点100b,而代理节点100a可将该主题a的消息发送至用户终端10a,代理节点100b可将该主题a的消息发送至用户终端10b。

本申请中,用户终端、代理节点以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。

为便于理解,请一并参见图2a-图2c,图2a-图2c是本申请实施例提供的一种发布/订阅消息的场景示意图。本申请中的服务器1000可为上述图1所对应实施例中的服务器1000。

如图2a-图2c所示的场景以教育场景中的教师分发试卷至学生为例,用户a与用户b可均为某个学生。如图2a所示,用户a可通过用户终端10a订阅“教师2/英语”主题,应当理解,用户终端10a所连接的代理节点为代理节点100a,则可以理解为代理节点100a也订阅了“教师2/英语”主题,用户终端10a、代理节点100a订阅了“教师2/英语”主题的这一订阅信息可称之为订阅信息1;代理节点100a可将该订阅信息1发送至服务器1000;同理,用户b可通过用户终端10b订阅某一主题,如,用户b可通过用户终端10b订阅“教师1/数学”主题,用户终端10b所连接的代理节点为代理节点100b,则可以理解为代理节点100b也订阅了“教师2/英语”主题,用户终端10b、代理节点100b订阅了“教师1/数学”主题的这一订阅信息可称之为订阅信息2;代理节点100b可将该订阅信息2发送至服务器1000。

进一步地,在服务器1000中,可获取该用户终端10a订阅该“教师2/英语”主题的订阅时刻(即订阅时间)1,同时获取该用户终端10b订阅该“教师1/数学”主题的订阅时刻2。以订阅时刻1小于订阅时刻2为例,服务器1000可按照该订阅时刻由小到大的顺序,将订阅信息1与订阅信息2排序,得到排序结果为{订阅信息1,订阅信息2}。

进一步地,所有代理节点(可包括代理节点100a、代理节点100b以及代理节点100c)均可以根据该排序结果{订阅信息1,订阅信息2},对本机维护的订阅树进行构建或更新。例如,以各个代理节点100a根据排序结果{订阅信息1,订阅信息2}对本机维护的订阅树进行更新为例,代理节点100a可按序(如从前至后的顺序)先存储订阅信息1至订阅树中。其中,代理节点100a可按层级存储方式来存储订阅信息1。应当理解,每个主题可包括有一个或多个层级,每两个层级之间可用符号“/”来进行分隔,例如,针对“教师2/英语”这一主题,就可包括两个层级,“教师2”为一个层级,“英语”一个层级,且“教师2”这一层级高于“英语”这一层级。那么代理节点100a在存储订阅信息1时,可根据一个层级生成一个节点,另一低层级的可生成该节点的下一个子节点,那么高层级所生成的节点可称之为父节点。例如,如图2b所示,在根据“教师2/英语”这一主题生成树节点之前,可先遍历订阅树中,查询是否已存在“教师2”这一层级所对应的父节点,在遍历后,查询到该订阅树并不存在“教师2”这一层级所对应的父节点,则可根据“教师2”这一层级内容生成一个新节点,并将该新节点作为父节点;进一步地,可根据“英语”这一层级内容生成一个新节点,并将该新节点作为上述“教师2”这一节点下的子节点。由此根据“教师2/英语”这一主题信息对订阅树进行更新后,即可得到如图2b所示的订阅树2a,其中,订阅树2a中的“教师2”节点以及“英语”节点为新生成的节点。需要说明的是,该“英语”节点为叶子节点,可在该“英语”节点中添加订阅了该“教师2/英语”这一主题的用户终端10a的终端标识、以及代理节点100a的节点标识,由此通过该“教师2”节点、“英语”节点即可确定订阅该“教师2/英语”主题的用户终端包括用户终端10a、代理节点包括代理节点100a。

同理,在存储完成订阅信息后,代理节点100a可继续按序获取到订阅信息2,并按照上述方式继续将订阅信息2存储至订阅树中,根据“教师1/数学”这一主题信息对订阅树进行更新后,即可得到如图2b所示的订阅树2b,其中,订阅树2b中的“教师1”节点为订阅树中已存在的父节点,而“数学”节点为新生成的节点。需要说明的是,该“数学”节点为叶子节点,可在该“数学”节点中添加订阅了该“教师1数学”这一主题的用户终端10b的终端标识、以及代理节点100b的节点标识,由此通过该“教师1”节点、“数学”节点即可确定订阅该“教师1/数学”主题的用户终端包括用户终端10b、代理节点包括代理节点100b。同理,代理节点100b与代理节点100c也可与代理节点100a一样采用相同的方式,按序存储订阅信息1与订阅信息2,得到如订阅树2b所示的订阅树。

进一步地,如图2c所示,用户c(可为教师1)可通过用户终端10c发布主题。如图2c所示,在用户终端10c的显示界面中,可包括教师1所对应的主题(如图2c所示的“教师1/语文”主题以及“教师1/数学”主题),教师1可对该“教师1/语文”主题以及“教师1/语文”主题进行选择,以发布主题相应的消息内容。例如,用户c所选择要发布的主题为“教师1/数学”主题,在点击确定控件后,可进入消息内容输入界面,在该消息内容输入界面中,用户c可输入数学教学内容(如数学试卷);在输入完成并点击确定控件后,用户终端10c可将用户c所输入的消息内容作为该“教师1/数学”主题下发布的消息内容,此时,用户终端10c所连接的代理节点100c可查询本机所维护的订阅树,查询到订阅了该“教师1/数学”主题的用户终端包括用户终端10b、代理节点包括代理节点100b,则该代理节点100c可将该用户c所发布的“教师1/数学”主题下的数学试卷转发至代理节点100b,而代理节点100b可将该数学试卷转发至用户终端10b,那么用户b可在该用户终端10b的显示界面中查看到该数学试卷。

应当理解,本申请通过订阅树存储订阅信息的方式,可使得各个代理节点可实现分布式同步数据,共同维护相同的订阅树,可在查找订阅终端以及订阅代理节点时,提高查找效率,只需要遍历本机的订阅树即可;同时,在发送发布主题的消息内容时,无需广播至全部的代理节点,只需查询本机的订阅树并发送至订阅了该发布主题的代理节点即可,可以减少消息发送的节点数量,从而可以减少数据传输时的流量消耗。

进一步地,请参见图3,图3是本申请实施例提供的一种数据传输方法的流程示意图。其中,该方法可以由服务器(例如,上述图1所示的服务器1000)执行,还可以由代理节点(如,上述图1所示的代理节点集群100中的任一代节点,如,代理节点100a)执行。为便于理解,本实施例以该方法由上述代理节点执行为例进行说明。其中,该方法至少可以包括以下步骤s101-步骤s104:

步骤s101,第一目标代理节点接收目标发布客户端针对目标消息的发布请求;发布请求包括目标消息的主题信息。

本申请中,代理节点可以是指mqtt协议中的客户端代理(又可称之为broker),当用户终端与该代理节点相连接时,基于mqtt的发布消息和订阅主题的原则,该用户终端可支持mqtt服务,用户可以在该用户终端中订阅自己所感兴趣的主题;用户也可以在该用户终端中的一个主题上发布消息,那么其他用户可通过其他支持mqtt服务的用户终端中订阅相同的主题,在订阅后,可接收到该用户针对该主题所发布的消息。其中,主题如文件系统一样可以包括一个或多个层次(层级),每两个层级之间可以由斜杠符号“/”来进行划分,例如,各个计算机可发布各自的硬件驱动(sensors)的温度信息(temperature)在如下的主题上,其中计算机的名称(computer_name)与硬件的名称(harddrive_name)可以被适当的替换:

“sensors/computer_name/temperature/harddrive_name”。

其中,在如上主题中,“sensors”可为一个层次(层级);“computer_name”可为一个层次;“temperature”可为一个层次;“harddrive_name”可为一个层次。可以理解的是,可认为每个斜杠之前的层次高于斜杠后的层次,例如,可认为上述“sensors”层次高于“computer_name”层次,而“computer_name”高于“temperature”层次,以此类推。

应当理解,客户端可理解为用户终端,当某个用户在某个用户终端中针对某个主题期望发布某个消息时,该消息可称之为目标消息,该主题可称之为目标消息的主题信息,该用户终端可称之为目标发布客户端,该用户终端所连接的代理节点可称之为第一目标代理节点。

步骤s102,基于发布请求遍历订阅树;订阅树用于基于层级结构存储方式存储订阅客户端、订阅客户端所订阅的订阅主题信息以及订阅客户端对应的代理节点之间的关联关系。

本申请中,在接收到目标发布客户端针对目标消息的发布请求后,需要查询到订阅了该目标消息的主题的订阅客户端以及该订阅客户端对应的代理节点,由此才可将该目标消息转发至订阅了该目标消息的主题的代理节点以及订阅客户端。应当理解,在mqtt服务中,每个客户端都可以通过创建一个订阅来接收消息,每个订阅都需要指明主题,在订阅并指明主题后,只能接收到所指定主题的消息。在每次发布客户端发布消息后,都会查询与该发布消息的主题相匹配的订阅主题,由此可通过发布的主题与订阅的主题来找到主题相匹配的订阅客户端。

mqtt协议支持通配符订阅主题,包括单级通配符“+”和多级通配符“#”。其中,多级通配符“#”是一个匹配主题中任意层次数的通配符,可以确定当前层或者下一层,例如,某个用户订阅的主题为“abc/#”,那么该用户可以接收到“abc/x/y”、“abc/x/y/z”等任意层级的主题所发布的消息。单级通配符只匹配主题的一层,比如说,订阅主题“finance/stock/+”可匹配发布主题“finance/stock/ibm”和发布主题“finance/stock/xyz”,但是不匹配发布主题“finance/stock/ibm/closingprice”。另外,因为单层通配符只匹配1层,订阅主题“finance/+”也并不会匹配发布主题“finance”。示例性地,针对单级通配符“+”而言,若某个用户订阅了主题“abc/+”,那么该用户可以收到“abc/x”,“abc/y”等任意同等级的主题发布的消息。

本申请中,可采用前缀树或字典树(又称之为trie)来存储订阅信息。其中,该订阅信息可包括订阅主题、订阅该主题的订阅客户端、该订阅客户端所连接的代理节点。本申请中,存储订阅信息的trie可称之为订阅树,本申请可按照层级结构存储方式来存储订阅信息,即每个节点存储订阅主题当中的一级,其中通配符“+”和“#”也单独存储。trie中的叶子节点中可存储订阅客户端的信息和订阅客户端所连接的broker(代理节点)。本申请通过订阅树按照层级存储结构的方式存储订阅客户端、订阅客户端所订阅的订阅主题信息以及订阅客户端对应的代理节点,可将通配符+和#也一并存储至订阅树中,由此可实现mqtt的主题信息支持通配符订阅。

为便于理解trie树如何按照层级存储结构存储订阅信息,请一并参见图4,图4是本申请实施例提供的一种订阅树存储订阅信息的示意图。其中如图4所示的订阅树以订阅主题包括“h3c/ac/ap”、“h3c/+/ap”、“h3c/#”、“ri/#”为例。

以下将以“h3c/ac/ap”、“h3c/+/ap”、“h3c/#”、“ri/#”的先后顺序,来先后存储“h3c/ac/ap”、“h3c/+/ap”、“h3c/#”、“ri/#”这一批订阅主题。首先,针对订阅主题“h3c/ac/ap”,包括有3个层次(层级),具体包括层级“h3c”、层级“ac”、层级“ap”,其中,层级“h3c”可理解为是最高层级,则可优先遍历订阅树中的根节点所对应的子节点中,是否已存在该层级“h3c”对应的节点,若已存在,则将该已存在的节点作为该层级“h3c”的节点;而若不存在,则可生成一个新节点并与根节点相连接,可将该新节点确定为层级“h3c”对应的节点。以订阅树中的根节点的子节点中不存在“h3c”对应的节点为例,可根据层级“h3c”生成如图4所示的“h3c”节点,该“h3c”节点与根节点相连接。

进一步地,在存储完成层级“h3c”后,可继续存储层级“ac”,此时,可将“h3c”节点作为父节点,可遍历该“h3c”父节点的子节点中,是否存在层级“ac”对应的节点,若已存在,则将该已存在的节点作为该层级“ac”的节点;而若不存在,则可生成一个新节点并与“h3c”父节点相连接,可将该新节点确定为层级“ac”对应的节点。以订阅树中的“h3c”父节点的子节点中不存在“ac”对应的节点为例,可根据层级“ac”生成如图4所示的“ac”节点,该“ac”节点与“h3c”父节点相连接。

进一步地,在存储完成层级“ac”后,可继续存储层级“ap”,此时,可将“ac”节点作为新的父节点,可遍历该“ac”父节点的子节点中,是否存在层级“ap”对应的节点,若已存在,则将该已存在的节点作为该层级“ap”的节点;而若不存在,则可生成一个新节点并与“ac”父节点相连接,可将该新节点确定为层级“ap”对应的节点。以订阅树中的“ac”父节点的子节点中不存在“ap”对应的节点为例,可根据层级“ap”生成如图4所示的“ap”节点(即节点40a),该节点40a与“ac”父节点相连接。

同理,采用上述方式,针对订阅主题“h3c/+/ap”,可生成如图4所示的“+”节点与“ap”节点(即节点40b),其中,上述“h3c”节点可作为“+”节点的父节点,而“+”节点可作为节点40b的父节点。针对“h3c/#”,可生成如图4所示的“#”节点(即节点40c),其中,上述“h3c”节点可作为节点40c的父节点。针对订阅主题“ri/#”,可生成如图4所示的节点40d,上述“h3c”节点可作为节点40d的父节点。

需要说明的是,每个订阅主题的最后一个层级所对饮的节点,可称之为叶子节点(即如图4所示的节点40a、节点40b、节点40c以及节点40d),而在本申请中,可在叶子节点中存储每个订阅主题的订阅客户端以及该订阅客户端的客户端标识,以及该订阅客户端所连接的代理节点的节点标识。例如,以节点40b为例,订阅该订阅主题“h3c/+/ap”的客户端包括订阅客户端1、订阅客户端2以及订阅客户端3,其中,订阅客户端1与订阅客户端2所连接的代理节点均为代理节点1,订阅客户端所连接的代理节点为代理节点2,则可在节点40b中,存储订阅客户端1与代理节点1之间的连接关系、订阅客户端2与代理节点1之间的连接关系、订阅客户端3与代理节点2之间的连接关系。在存储后,通过该订阅树的“h3c”节点、“+”节点以及节点40b,就可以得知,订阅了该主题“h3c/+/ap”的订阅客户端包括订阅客户端1、订阅客户端2以及订阅客户端3,而该订阅客户端1、订阅客户端2所连接的代理节点均为代理节点1,订阅客户端2所连接的代理节点为代理节点2。

应当理解,本申请的各个代理节点可将所有的订阅信息都存储在本机的订阅树中,而为了使得各个代理节点为维护的订阅树中的订阅信息保持一致,每个代理节点在接收到所连接的客户端的订阅请求时,可暂时先不存储该客户端的订阅信息,而是先将该订阅信息发送至消息队列(如,kafka消息队列)中,那么在该消息队列中,就可暂时保存一个或多个代理节点所发送的订阅信息,随后,可根据这些订阅信息的订阅时刻(即订阅时间)的先后顺序来进行排序,各个代理节点可按序获取这些订阅信息并按序存储至订阅树中,从而各个代理节点可得到同步的一致的订阅树。其具体实现方式可参见后续图6所对应实施例中的描述。

步骤s103,基于目标消息的主题信息,在订阅树所存储的代理节点中获取待传输代理节点;待传输代理节点对应的待传输订阅客户端所订阅的订阅主题信息,与目标消息的主题信息相匹配;订阅客户端包括待传输订阅客户端。

本申请中,通过前文描述可知,订阅树中可包括根节点、历史父节点以及历史子节点;历史父节点可用于存储历史主题信息对应的第一主题层级内容,历史子节点可用于存储历史主题信息对应的第二主题层级内容;第一主题层级内容对应的层级高于第二主题层级内容对应的层级;存储同一历史主体信息的历史父节点与历史子节点具有连接关系;历史主体信息包括目标消息的主题信息。例如,针对前文所提及的主题“h3c/+/ap”,历史父节点可包括“h3c”节点,历史子节点可包括“h3c”节点对应的子节点“+”,以及该节点“+”对应的子节点“ap”,应当理解,“h3c”、“+”、“ap”均可理解为一个层级的层级内容,而“h3c”节点可存储该层级内容“h3c”、节点“+”可存储层级内容“+”、节点“ap”可存储层级内容“ap”。而“h3c”节点与节点“+”之间存在连接关系、节点“+”与节点“ap”之间存在连接关系。

对于基于目标消息的主题信息,在订阅树所存储的代理节点中获取待传输代理节点的具体方法可为:根据第一主题层级内容中目标消息的主题信息的层级内容、以及第二主题层级内容中目标消息的主题信息的层级内容,在订阅树中所存储的代理节点中获取待传输代理节点。

以目标消息的主题信息包括第一层级与第二层级、第一层级高于第二层级、目标消息的主题信息的层级内容包括第一层级对应的第一层级内容,以及第二层级对应的第二层级内容为例,对于根据第一主题层级内容中目标消息的主题信息的层级内容、以及第二主题层级内容中目标消息的主题信息的层级内容,在订阅树中所存储的代理节点中获取待传输代理节点的具体方法可为:可遍历订阅树中的历史父节点,将包括第一层级内容的历史父节点,确定为待传输父节点;随后可遍历订阅树中,待传输父节点所对应的历史子节点,将包括第二层级内容的历史子节点,确定为待传输子节点;获取待传输子节点中所包括的历史节点标识,将历史节点标识所对应的代理节点确定为待传输代理节点。

也就是说,例如,如前文图4所对应实施例所示,当某个客户端在主题“h3c/+/ap”发布了消息时,其所连接的代理节点可遍历本机维护的订阅树,从根节点开始向下查询,命中一级后还需查询它所有的子节点。即,先查询根节点下的节点(为历史父节点),在命中“h3c”节点后可继续查询其所有的子节点(即历史子节点),可命中“+”节点;在命中“+”节点后,可继续查询其所有的子节点,由此可命中“ap”节点(即如图4所示的节点40b)。此时,该节点40b已为叶子节点,那么可获取到该节点40b中所存储的订阅客户端以及代理节点(如图4所示,包括代理节点1与代理节点2),该叶子节点40b中所存储的代理节点1与代理节点2即可确定为是待传输节点。

步骤s104,将目标消息发送至待传输代理节点,以使待传输代理节点将目标消息转发至待传输代理节点对应的待传输订阅客户端。

本申请中,在确定出待传输节点后,可通过远程过程调用(remoteprocedurecall,rpc)将目标消息发到待传输节点。而待传输节点在收到rpc来的目标消息时,无需再次查找本机的trie树,可直接将目标消息发布到对应的客户端(即待传输订阅客户端)上即可。

可选的,可以理解的是,第一目标代理节点在发送目标消息至待传输节点之前,可预先对该目标消息进行检测,检测该目标消息中是否存在违规内容(如存在异常文本、异常音频等违规内容)。在检测到该目标消息中并不存在违规内容时,再将该目标消息发送至该待传输节点。其具体方法可为:可获取检测规则库;其中,该检测规则库中包括异常文本与异常音频;随后,可将目标消息与检测规则库中的异常文本、异常音频进行匹配;若目标消息中存在与异常文本相同的文本内容,或存在与异常音频相同的音频内容,则将目标消息确定为违规消息,生成违规提示信息,将违规提示信息发送至目标发布客户端以及待传输代理节点;若目标消息中不存在与异常文本相同的文本内容,且不存在与异常音频相同的音频内容,则执行将目标消息发送至待传输代理节点的步骤。

应当理解,可预先设置异常文本与异常音频,并将该异常文本与异常音频放入规则检测库中,代理节点在每次转发目标消息时,都可获取到该目标消息中所包括的文本与音频,可将该目标消息中包括的文本与该异常文本进行匹配,以确定该目标消息中是否存在异常的文本;同时,也可将该目标消息中包括的音频与该异常音频进行匹配,以确定该目标消息中是否存在异常的音频。在该目标消息中不存在异常的文本且不存在异常的音频时,才将该目标消息发送至待传输节点。而若该目标消息中存在异常的文本或异常的音频,则可生成违规提示信息,并将该违规提示信息返回至目标发布客户端,同时,可不向待传输节点发送该目标消息(也可以将该违规提示信息同时发送至待传输节点)。

可选的,可以理解的是,当有新的代理节点上线时,也可以将订阅树同步至该新的代理节点,使得该新的代理节点可以加入代理节点集群并维护一致的订阅树。应当理解,新的代理节点在上线后,可获取到代理节点集群中正常运行的代理节点,随后,该新的代理节点可向其拉取订阅树并将该拉取到的订阅树存储至本机中。以新上线的代理节点向第一目标代理节点拉取数据为例,其具体方法可为:第一目标代理节点可接收上线代理节点发送的数据拉取请求;基于数据拉取请求,可获取订阅树,可将订阅树进行序列化处理,得到序列订阅树;随后,可将序列订阅树发送至上线代理节点,以使上线代理节点将序列订阅树进行反序列化,得到订阅树,并存储订阅树。应当理解,新的节点上线即可理解为代理节点集群扩容,当已有的代理节点集群性能不足时,通过集群扩容,可很好地解决性能问题。而本申请所提供的订阅树存储订阅信息的方式,可支持节点之间共享同步订阅树,可以很好地支持集群扩容。

在本申请实施例中,mqtt的主题允许通配符订阅(可包括通配符#和通配符+,通配符#表征匹配所有;通配符+表征匹配特定层级的所有主题),而本申请通过订阅树按照层级存储结构的方式存储订阅客户端、订阅客户端所订阅的订阅主题信息以及订阅客户端对应的代理节点,可将通配符+和#也一并存储至订阅树中,由此可实现mqtt的主题信息支持通配符订阅;同时,本申请的各个代理节点可分布式部署,每个代理节点可通过订阅树共同保存订阅的主题信息,也可以保存其他代理节点所需要订阅的主题信息(即实现代理节点之间的订阅信息的同步),那么当某个代理节点接收到某个消息的发布请求时,可遍历自身的订阅树,查找到订阅了该消息的主题信息的代理节点,可直接将该消息发送至这些订阅了该消息的主题信息的代理节点;也就是说,无需将消息广播至所有的代理节点,只需要发送至部分订阅了该消息的主题信息的代理节点即可,由此可减少消息的传递节点的数量,有效减少传输流量。综上,本申请可以通过订阅树存储订阅信息的方式,实现主题支持通配符订阅;同时,可以实现代理节点同步订阅信息,减少数据传输中的传输流量。

为便于理解代理节点发送消息的具体流程,请一并参见图5,图5是本申请实施例提供的一种代理节点发送消息至其他代理节点的流程示意图。如图5所示,该流程可以包括以下步骤1-步骤6:

步骤1,发布者发布消息到主题上。

具体的,发布者可以理解为发布消息的用户,用户可以通过用户终端在某个主题上发布消息。而可选的,该消息可预先存储至分布式系统(如kafka系统)中,所有代理节点可从该分布式系统中获取消息。

步骤2,代理节点从分布式系统中获取到发布者发布的消息。

具体的,某个代理节点(如,该发布者的用户终端所连接的代理节点1)可获取到该消息。

步骤3,代理节点1查询本机的订阅树。

具体的,该代理节点1可查询本机所维护的订阅树,以查询订阅该主题的客户端包括哪些,以及获取到这些订阅了该主题的客户端所连接的代理节点。

步骤4,代理节点1直接将消息发送至订阅者1。

具体的,代理节点1查询本机维护的订阅树后,确定订阅客户端1订阅了该主题,而订阅客户端1时代理节点所连接的节点,则代理节点可直接将该消息发送至该订阅客户端(即订阅者1)。

步骤5,代理节点1将消息发送至代理节点2。

具体的,代理节点1查询本机维护的订阅树后,确定订阅客户端2(所连接的代理节点为代理节点2)也订阅了该主题,则该代理节点1可将该消息转发至该代理节点2。

步骤6,代理节点2将消息发送至订阅客户端2。

应当理解,通过订阅树存储订阅信息的方式,可以使得各个代理节点所存储的订阅信息是同步一致的,当任一代理节点接收到发布者发布的消息时,可查询本机的订阅树,从而可以快速且准确地获取到订阅了发布主题的订阅客户端以及订阅代理节点,再将该消息转发至订阅了发布主题的代理节点即可;无需将消息广播至全部的代理节点,在提高了查找效率的同时,可以有效减少节点传输数量,从而可以有效减少数据传输的流量消耗。

进一步地,请参见图6,图6是本申请实施例提供的一种构建订阅树的流程示意图。其中,该流程可以包括以下步骤s201-步骤s204:

步骤s201,在第一时刻时,接收第一订阅客户端针对目标消息的主题信息的第一订阅请求。

具体的,该第一订阅客户端可为前述第一目标代理节点所连接的订阅客户端,用户可通过该第一订阅客户端订阅感兴趣的主题(如,订阅的主题为前述目标消息的主题),第一目标代理节点可获取到订阅该主题的时刻(即第一时刻),该时刻即为订阅时刻(第一订阅时刻,即第一订阅时间)。

步骤s202,基于第一订阅请求,获取第一订阅客户端的第一客户端标识与第一目标代理节点的第一节点标识。

具体的,每个客户端、代理节点均有属于自己的标识,客户端具有属于自己的客户端标识,代理节点具有属于自己的节点标识。而第一订阅客户端的客户端标识可称之为第一客户端标识,第一目标代理节点的节点标识可称之为第一节点标识。

步骤s203,将第一客户端标识、目标消息的主题信息以及第一节点标识所组成的三元组,确定为第一订阅信息。

具体的,该第一订阅信息即可表征第一订阅客户端订阅了该目标消息的主题信息,且该第一订阅客户端所连接的代理节点为第一目标代理节点。那么,第一目标代理节点也可认为是订阅了该目标消息的主题信息。

步骤s204,将第一订阅信息存储至消息队列,根据消息队列构建订阅树。

具体的,若每个代理节点在接收到订阅信息后就直接存储订阅信息,那么很可能出现各个代理节点所存储的订阅树不一致的问题,为保证同一时刻下,各个broker节点(代理节点)中存储的订阅树树中的数据是一致的,本申请中各个代理节点在接收到订阅信息后,可先将接收到的订阅信息存储至消息队列(如,kafka消息队列)中,在消息队列中将各个订阅信息进行排序,各个代理节点再按序进行一一存储至各自订阅树中。

以该消息队列中还包括第二目标代理节点在第二时刻时存储的第二订阅信息为例,其中,第二订阅信息由第二目标代理节点基于第二订阅客户端在第二时刻时发送的第二订阅请求所确定,第二订阅信息包括第二订阅客户端的第二客户端标识、目标消息的主题信息以及第二目标代理节点的第二节点标识;对于根据消息队列构建订阅树的具体方法可为:当到达订阅树更新时间时,可获取消息队列中的第一订阅信息、第二订阅信息、第一订阅信息对应的第一时刻以及第二订阅信息对应的第二时刻(第二订阅时间);若第一时刻早于第二时刻,则可根据第一订阅信息构建初始订阅树;随后,可继续根据第二订阅信息对初始订阅树进行更新,得到订阅树。可选的,若第一时刻晚于第二时刻,则可根据第二订阅信息构建初始订阅树,并继续根据第一订阅信息对该初始订阅树进行更新。

以下将以第一时刻早于第二时刻、且目标消息的主题信息包括第一层级与第二层级、第一层级高于第二层级为例进行说明,对于根据第一订阅信息构建初始订阅树的具体方法可为:在目标消息的主题信息中,可获取第一层级对应的第一层级内容,以及第二层级对应的第二层级内容;随后,可根据第一层级内容生成父节点,可根据第二层级内容、第一客户端标识以及第一节点标识,生成父节点对应的子节点;随后,可将父节点与子节点进行连接,得到初始订阅树。

其中,对于根据第一层级内容生成父节点的具体方法可为:可遍历订阅树中的历史父节点;若历史父节点中存在目标父节点,则可将目标父节点确定为父节点;其中,目标父节点所包括的层级内容与第一层级内容相同;而若历史父节点中不存在目标父节点,则可根据第一层级内容,生成第一新节点,可将第一新节点确定为父节点。

而对于根据第二层级内容、第一客户端标识以及第一节点标识,生成父节点对应的子节点的具体方法可为:可遍历订阅树中父节点所对应的历史子节点;若历史子节点中存在目标子节点,则可将目标子节点确定为子节点;其中,目标子节点所包括的层级内容与第二层级内容相同;而若历史子节点中不存在目标子节点,则可根据第二层级内容、第一客户端标识以及第一节点标识生成第二新节点,并将第二新节点确定为子节点。

以目标消息的主题信息为“h3c/ac/ap”为例,消息队列中存在的订阅信息包括第一订阅客户端的第一订阅信息以及第二订阅客户端的第二订阅信息,第一订阅客户端订阅该主题的订阅时刻(订阅时间)早于了第二订阅客户端订阅该主题的订阅时刻(订阅时间)。则可先将第一订阅客户端的第一订阅信息优先存储。其中,“h3c”可称之为第一层级内容,“ac”、“ap”可称之为第二层级内容,以目前订阅树中只存在根节点为例,可先根据第一层级内容“h3c”生成“h3c”节点;随后,可将该“h3c”节点作为历史父节点,可根据第二层级内容“ac”生成该父节点下的子节点“ac”;随后,可根据第二层级内容“ap”继续生成节点“ac”下的子节点“ap”。此时,该主题“h3c/ac/ap”中的所有层级均已全部存储至订阅树中,则可不再继续生成新的节点,可将最后的节点“ap”作为叶子节点,并将该第一订阅客户端的客户端标识以及该第一目标代理节点的节点标识存储至该叶子节点中。可以理解的是,若在层级“ap”下还存在其余层级,则可继续生成节点“ap”的子节点,以此类推直至所有的层级都以节点的方式存储在订阅树中。最后个层级的层级内容即对应于叶子节点,叶子节点可用于存储订阅了主题的订阅客户端以及代理节点。

进一步地,在存储完成第一订阅信息后,可按序继续存储第二订阅信息,因为该第二订阅信息所订阅的也为该目标消息的主题信息,则可在子节点中获取叶子节点,并在叶子节点中存储第二订阅客户端的客户端标识以及第二目标代理节点的节点标识即可,其具体方法可为:将第二订阅信息对应的第二客户端标识,以及第二节点标识添加至子节点中,得到更新后的子节点;将包含更新后的子节点的初始订阅树,确定为订阅树。

可选的,可以理解的是,若该第二订阅信息为第二订阅客户端所订阅的其他的主题信息(不同于目标消息的主题信息),则可按照上述方式,继续生成新节点。例如,若该第二订阅信息所订阅的主题为前述“h3c/#”,此时因为订阅树中已存在“h3c”节点,那么可将该已存在的“h3c”节点作为主题“h3c/#”中层级内容“h3c”所对应的节点,然后可继续根据层级内容“+”生成该“h3c”节点下的子节点。此时,主题“h3c/#”中的所有层级已全部存储至订阅树中,那么可将该“+”节点作为叶子节点,可将该第二订阅客户端的客户端标识以及第二目标代理节点的第二节点标识存储至该叶子节点中。

在本申请实施例中,代理节点在接收到订阅信息后,可先将订阅信息存储至消息队列中,在消息队列中将各个订阅信息进行排序,随后,各个代理节点再按序存储各个订阅信息至订阅树中,由此可保证各个代理节点在同一时刻下的订阅树一致;即使出现了存储乱序的问题,因为订阅树可支持插入和删除机制,那么通过该插入和删除机制也可以保障订阅树的最终一致性;同时,本申请可基于主题的层级结构来存储订阅信息,一个节点存储主题的一个层级,订阅主题的客户端以及代理节点可存储至叶子节点中,由此可使得订阅树中的主题信息更为清晰,可在查询订阅客户端提高查找效率。

为便于理解构建订阅树的具体流程,请一并参见图7,图7是本申请实施例提供的一种构建订阅树的流畅示意图。其中,该流程可以包括以下步骤s31-步骤s31-步骤s38:

步骤s31,订阅者订阅主题。

具体的,订阅者可以理解为订阅主题的用户,用户可以通过用户终端订阅某个主题。而其用户终端所连接的代理节点(如代理节点1)可接收到该订阅请求,并生成该订阅客户端针对该主题的订阅信息。

步骤s32,代理节点1将该订阅信息插入消息队列。

具体的,该代理节点在接收到该订阅信息后,可将该订阅信息插入至消息队列中,该消息队列可理解为分布式系统(如kafka系统)。

步骤s33,kafka消息队列将订阅信息发送至代理节点1。

具体的,在该消息队列中,可按订阅时间对各个订阅信息进行排序,在排序后,消息队列可按序将订阅信息发送至代理节点1。

步骤s34,kafka消息队列将订阅信息发送至代理节点2。

具体的,消息队列可按序将订阅信息发送至代理节点1的同时,也可将该订阅信息同时发送至代理节点2。

步骤s35,kafka消息队列将订阅信息发送至代理节点2。

具体的,消息队列可按序将订阅信息发送至代理节点1与代理节点2的同时,也可将该订阅信息同时发送至代理节点3。

应当理解,上述步骤s33-步骤s35可表示:在对订阅进行排序后,可按序将订阅信息发送至全部的代理节点,也就是说,上述步骤s33-步骤s35可在同一时刻执行。

步骤s36,代理节点1根据订阅信息更新本地订阅树。

步骤s37,代理节点2根据订阅信息更新本地订阅树。

步骤s38,代理节点3根据订阅信息更新本地订阅树。

具体的,各个代理节点在按序获取到订阅信息后,可根据订阅信息对本地订阅树进行更新。其中,对订阅树更新的具体实现方式,可参见上述图6所对应实施例中的描述,这里将不再进行赘述。应当理解,上述步骤s36-步骤s38可在同一时刻下进行,各个代理节点最终的订阅树是保持一致的。

在本申请实施例中,代理节点在接收到订阅信息后,可先将订阅信息存储至消息队列中,在消息队列中将各个订阅信息进行排序,随后,各个代理节点再按序存储各个订阅信息至订阅树中,由此可保证各个代理节点在同一时刻下的订阅树一致;即使出现了存储乱序的问题,因为订阅树可支持插入和删除机制,那么通过该插入和删除机制也可以保障订阅树的最终一致性;同时,本申请可基于主题的层级结构来存储订阅信息,一个节点存储主题的一个层级,订阅主题的客户端以及代理节点可存储至叶子节点中,由此可使得订阅树中的主题信息更为清晰,可在查询订阅客户端提高查找效率。

进一步地,请参见图8,图8是本申请实施例提供的一种数据传输装置的结构示意图。该数据传输装置可以是运行于计算机设备中的一个计算机程序(包括程序代码),例如该数据传输装置为一个应用软件;该数据传输装置可以用于执行图3所示的方法。如图8所示,该数据处理装置1可以包括:请求接收模块11、数据遍历模块12、节点查询模块13以及消息发送模块14。

请求接收模块11,用于接收目标发布客户端针对目标消息的发布请求;发布请求包括目标消息的主题信息;

数据遍历模块12,用于基于发布请求遍历订阅树;订阅树用于基于层级结构存储方式存储订阅客户端、订阅客户端所订阅的订阅主题信息以及订阅客户端对应的代理节点之间的关联关系;

节点查询模块13,用于基于目标消息的主题信息,在订阅树所存储的代理节点中获取待传输代理节点;待传输代理节点对应的待传输订阅客户端所订阅的订阅主题信息,与目标消息的主题信息相匹配;订阅客户端包括待传输订阅客户端;

消息发送模块14,用于将目标消息发送至待传输代理节点,以使待传输代理节点将目标消息转发至待传输代理节点对应的待传输订阅客户端。

其中,请求接收模块11、数据遍历模块12、节点查询模块13以及消息发送模块14的具体实现方式,可以参见上述图3所对应实施例中步骤s101-步骤s104的描述,这里将不再进行赘述。

在一个实施例中,订阅树包括根节点、历史父节点以及历史子节点;历史父节点用于存储历史主题信息对应的第一主题层级内容,历史子节点用于存储历史主题信息对应的第二主题层级内容;第一主题层级内容对应的层级高于第二主题层级内容对应的层级;存储同一历史主体信息的历史父节点与历史子节点具有连接关系;历史主体信息包括目标消息的主题信息;

节点查询模块13,还具体用于根据第一主题层级内容中目标消息的主题信息的层级内容、以及第二主题层级内容中目标消息的主题信息的层级内容,在订阅树中所存储的代理节点中获取待传输代理节点。

在一个实施例中,目标消息的主题信息包括第一层级与第二层级;第一层级高于第二层级;目标消息的主题信息的层级内容包括第一层级对应的第一层级内容,以及第二层级对应的第二层级内容;

请参见图8,节点查询模块13可以包括:节点遍历单元131以及节点确定单元132。

节点遍历单元131,用于遍历订阅树中的历史父节点,将包括第一层级内容的历史父节点,确定为待传输父节点;

节点遍历单元131,还用于遍历订阅树中,待传输父节点所对应的历史子节点,将包括第二层级内容的历史子节点,确定为待传输子节点;

节点确定单元132,用于获取待传输子节点中所包括的历史节点标识,将历史节点标识所对应的代理节点确定为待传输代理节点。

其中,节点遍历单元131以及节点确定单元132的具体实现方式,可以参见上述图3所对应实施例中步骤s103中的描述,这里将不再进行赘述。

请参见图8,该数据传输装置1还可以包括:订阅请求接收模块15、订阅信息确定模块16以及树构建模块17。

订阅请求接收模块15,用于在第一时刻时,接收第一订阅客户端针对目标消息的主题信息的第一订阅请求;

订阅信息确定模块16,用于基于第一订阅请求,获取第一订阅客户端的第一客户端标识与第一目标代理节点的第一节点标识;

订阅信息确定模块16,还用于将第一客户端标识、目标消息的主题信息以及第一节点标识所组成的三元组,确定为第一订阅信息;

树构建模块17,用于将第一订阅信息存储至消息队列;

树构建模块17,还用于根据消息队列构建订阅树。

其中,订阅请求接收模块15、订阅信息确定模块16以及树构建模块17的具体实现方式,可以参见上述图6所对应实施例中步骤s201-步骤s204中的描述,这里将不再进行赘述。

在一个实施例中,消息队列中还包括第二目标代理节点在第二时刻时存储的第二订阅信息;第二订阅信息由第二目标代理节点基于第二订阅客户端在第二时刻时发送的第二订阅请求所确定;第二订阅信息包括第二订阅客户端的第二客户端标识、目标消息的主题信息以及第二目标代理节点的第二节点标识;

请参见图8,树构建模块17可以包括:时刻获取单元171与树构建单元172。

时刻获取单元171,用于当到达订阅树更新时间时,获取消息队列中的第一订阅信息、第二订阅信息、第一订阅信息对应的第一时刻以及第二订阅信息对应的第二时刻;

树构建单元172,用于若第一时刻小于第二时刻,则根据第一订阅信息构建初始订阅树;

树构建单元172,还用于根据第二订阅信息对初始订阅树进行更新,得到订阅树。

其中,时刻获取单元171与树构建单元172的具体实现方式,可以参见上述图3所对应实施例中步骤s204中的描述,这里将不再进行赘述。

在一个实施例中,目标消息的主题信息包括第一层级与第二层级;第一层级高于第二层级;

请参见图8,树构建单元172可以包括:节点生成子单元1721与节点连接子单元1722。

节点生成子单元1721,用于在目标消息的主题信息中,获取第一层级对应的第一层级内容,以及第二层级对应的第二层级内容;

节点生成子单元1721,还用于根据第一层级内容生成父节点;

节点生成子单元1721,还用于根据第二层级内容、第一客户端标识以及第一节点标识,生成父节点对应的子节点;

节点连接子单元1722,用于将父节点与子节点进行连接,得到初始订阅树。

其中,节点生成子单元1721与节点连接子单元1722的具体实现方式,可以参见上述图3所对应实施例中步骤s204中的描述,这里将不再进行赘述。

在一个实施例中,节点生成子单元1721,还具体用于遍历订阅树中的历史父节点;

节点生成子单元1721,还具体用于若历史父节点中存在目标父节点,则将目标父节点确定为父节点;目标父节点所包括的层级内容与第一层级内容相同;

节点生成子单元1721,还具体用于若历史父节点中不存在目标父节点,则根据第一层级内容,生成第一新节点,将第一新节点确定为父节点。

在一个实施例中,节点生成子单元1721,还具体用于遍历订阅树中父节点所对应的历史子节点;

节点生成子单元1721,还具体用于若历史子节点中存在目标子节点,则将目标子节点确定为子节点;目标子节点所包括的层级内容与第二层级内容相同;

节点生成子单元1721,还具体用于若历史子节点中不存在目标子节点,则根据第二层级内容、第一客户端标识以及第一节点标识生成第二新节点,将第二新节点确定为子节点。

在一个实施例中,树构建单元172可以包括:节点更新子单元1723与树确定子单元1724。

节点更新子单元1723,用于将第二订阅信息对应的第二客户端标识,以及第二节点标识添加至子节点中,得到更新后的子节点;

树确定子单元1724,用于将包含更新后的子节点的初始订阅树,确定为订阅树。

其中,节点更新子单元1723与树确定子单元1724的具体实现方式,可以参见上述图3所对应实施例中步骤s204中的描述,这里将不再进行赘述。

请参见图8,该数据传输装置1还可以包括:规则库获取模块18、数据匹配模块19、提示信息生成模块20以及步骤执行模块21。

规则库获取模块18,用于获取检测规则库;检测规则库中包括异常文本与异常音频;

数据匹配模块19,用于将目标消息与检测规则库中的异常文本、异常音频进行匹配;

提示信息生成模块20,用于若目标消息中存在与异常文本相同的文本内容,或存在与异常音频相同的音频内容,则将目标消息确定为违规消息,生成违规提示信息,将违规提示信息发送至目标发布客户端以及待传输代理节点;

步骤执行模块21,用于若目标消息中不存在与异常文本相同的文本内容,且不存在与异常音频相同的音频内容,则执行将目标消息发送至待传输代理节点的步骤。

其中,规则库获取模块18、数据匹配模块19、提示信息生成模块20以及步骤执行模块21的具体实现方式,可以参见上述图3所对应实施例中步骤s214中的描述,这里将不再进行赘述。

请参见图8,该数据传输装置1还可以包括:拉取请求接收模块22、序列处理模块23以及树发送模块24。

拉取请求接收模块22,用于接收上线代理节点发送的数据拉取请求;

序列处理模块23,用于基于数据拉取请求,获取订阅树,将订阅树进行序列化处理,得到序列订阅树;

树发送模块24,用于将序列订阅树发送至上线代理节点,以使上线代理节点将序列订阅树进行反序列化,得到订阅树,并存储订阅树。

其中,拉取请求接收模块22、序列处理模块23以及树发送模块24的具体实现方式,可以参见上述图3所对应实施例中步骤s214中的描述,这里将不再进行赘述。

在本申请实施例中,mqtt的主题允许通配符订阅(可包括通配符#和通配符+,通配符#表征匹配所有;通配符+表征匹配特定层级的所有主题),而本申请通过订阅树按照层级存储结构的方式存储订阅客户端、订阅客户端所订阅的订阅主题信息以及订阅客户端对应的代理节点,可将通配符+和#也一并存储至订阅树中,由此可实现mqtt的主题信息支持通配符订阅;同时,本申请的各个代理节点可分布式部署,每个代理节点可通过订阅树共同保存订阅的主题信息,也可以保存其他代理节点所需要订阅的主题信息(即实现代理节点之间的订阅信息的同步),那么当某个代理节点接收到某个消息的发布请求时,可遍历自身的订阅树,查找到订阅了该消息的主题信息的代理节点,可直接将该消息发送至这些订阅了该消息的主题信息的代理节点;也就是说,无需将消息广播至所有的代理节点,只需要发送至部分订阅了该消息的主题信息的代理节点即可,由此可减少消息的传递节点的数量,有效减少传输流量。综上,本申请可以通过订阅树存储订阅信息的方式,实现主题支持通配符订阅;同时,可以实现代理节点同步订阅信息,减少数据传输中的传输流量。

进一步地,请参见图9,图9是本申请实施例提供的一种计算机设备的结构示意图。如图9所示,上述图8所对应实施例中的数据传输装置1可以应用于上述计算机设备9000,上述计算机设备9000可以包括:处理器9001,网络接口9004和存储器9005,此外,上述计算机设备9000还包括:用户接口9003,和至少一个通信总线9002。其中,通信总线9002用于实现这些组件之间的连接通信。其中,用户接口9003可以包括显示屏(display)、键盘(keyboard),可选用户接口9003还可以包括标准的有线接口、无线接口。网络接口9004可选的可以包括标准的有线接口、无线接口(如wi-fi接口)。存储器9005可以是高速ram存储器,也可以是非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。存储器9005可选的还可以是至少一个位于远离前述处理器9001的存储装置。如图9所示,作为一种计算机可读存储介质的存储器9005中可以包括操作系统、网络通信模块、用户接口模块以及设备控制应用程序。

在图9所示的计算机设备9000中,网络接口9004可提供网络通讯功能;而用户接口9003主要用于为用户提供输入的接口;而处理器9001可以用于调用存储器9005中存储的设备控制应用程序,以实现:

接收目标发布客户端针对目标消息的发布请求;发布请求包括目标消息的主题信息;

基于发布请求遍历订阅树;订阅树用于基于层级结构存储方式存储订阅客户端、订阅客户端所订阅的订阅主题信息以及订阅客户端对应的代理节点之间的关联关系;

基于目标消息的主题信息,在订阅树所存储的代理节点中获取待传输代理节点;待传输代理节点对应的待传输订阅客户端所订阅的订阅主题信息,与目标消息的主题信息相匹配;订阅客户端包括待传输订阅客户端;

将目标消息发送至待传输代理节点,以使待传输代理节点将目标消息转发至待传输代理节点对应的待传输订阅客户端。

应当理解,本申请实施例中所描述的计算机设备9000可执行前文图3到图6所对应实施例中对该数据传输方法的描述,也可执行前文图8所对应实施例中对该数据传输装置1的描述,在此不再赘述。另外,对采用相同方法的有益效果描述,也不再进行赘述。

此外,这里需要指出的是:本申请实施例还提供了一种计算机可读存储介质,且上述计算机可读存储介质中存储有前文提及的数据传输的计算机设备9000所执行的计算机程序,且上述计算机程序包括程序指令,当上述处理器执行上述程序指令时,能够执行前文图3到图6所对应实施例中对上述数据传输方法的描述,因此,这里将不再进行赘述。另外,对采用相同方法的有益效果描述,也不再进行赘述。对于本申请所涉及的计算机可读存储介质实施例中未披露的技术细节,请参照本申请方法实施例的描述。

上述计算机可读存储介质可以是前述任一实施例提供的数据传输装置或者上述计算机设备的内部存储单元,例如计算机设备的硬盘或内存。该计算机可读存储介质也可以是该计算机设备的外部存储设备,例如该计算机设备上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,该计算机可读存储介质还可以既包括该计算机设备的内部存储单元也包括外部存储设备。该计算机可读存储介质用于存储该计算机程序以及该计算机设备所需的其他程序和数据。该计算机可读存储介质还可以用于暂时地存储已经输出或者将要输出的数据。

本申请的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本申请实施例中一方面提供的方法。

本申请实施例的说明书和权利要求书及附图中的术语“第一”、“第二”等是用于区别不同对象,而非用于描述特定顺序。此外,术语“包括”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、装置、产品或设备没有限定于已列出的步骤或模块,而是可选地还包括没有列出的步骤或模块,或可选地还包括对于这些过程、方法、装置、产品或设备固有的其他步骤单元。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

本申请实施例提供的方法及相关装置是参照本申请实施例提供的方法流程图和/或结构示意图来描述的,具体可由计算机程序指令实现方法流程图和/或结构示意图的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。这些计算机程序指令可提供到通用计算机、专用计算机、嵌入式处理机或其他可编程数据传输设备的处理器以产生一个机器,使得通过计算机或其他可编程数据传输设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或结构示意图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据传输设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或结构示意图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据传输设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或结构示意一个方框或多个方框中指定的功能的步骤。

以上所揭露的仅为本申请较佳实施例而已,当然不能以此来限定本申请之权利范围,因此依本申请权利要求所作的等同变化,仍属本申请所涵盖的范围。

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