关于智能推送平台的设计与实现的研究与分析
2022-11-22郝锐
郝 锐
(兰州生产力促进中心 甘肃 兰州 730000)
0 引言
推算法是一种基于因特网的通信技术,它可以让服务端自动向客户端推送信息。美国的 PointCast公司于1990年发布了一款屏幕保护软件,它通过推送技术向用户发送新闻和股市信息,这一举动在当时引起了极大的反响。在这个过程中,因特网推出了很多新的应用,如即时聊天、同步会议、电子邮件等。由于信息推送技术的普及,研发新的信息推送平台就显得尤为重要,智能信息推送平台是指通过云推的形式来实现信息的推送。
1 智能推送系统需求分析
1.1 功能性需求分析
根据功能的不同,智能推送系统的总体需求分为四个方面:应用、消息推送、统计、工具相关。
应用相关的功能是指在系统网页上显示的管理和显示功能,用户可以使用该功能来管理企业的应用程序。它的主要内容是:向系统平台中添加新的应用程序,查看账户中所有的应用程序信息,收藏应用程序,创建包含多个应用程序的应用程序组,为已创建的应用程序提供通道、个性化、白名单等属性,使用户能够更快更方便地管理自己的应用程序。在选择目标人群之前,可以利用标记的相似性,计算出信息内容与目标人群的关系,从而确定目标人群的位置,并实时追踪信息的发送情况。统计的相关功能,主要是给用户提供操作思路,可以获得应用用户的新增、活跃度、在线数据,而关注到推送,则是可以获得应用级别的消息送达、打开次数、忽略数等重要数据,从而为企业的运营提供更多的数据参考。而工具类的功能,则是为使用者提供查询、校验、测试任务、消息模板等工具,从而为使用者的开发、运营提供便利。下面详细分析各个功能,以确定智能推送系统的功能要求。
1.2 非功能性需求
(1)及时性
由于信息重时效性,在 Publisher发出信息后,系统应该保证用户能及时收到信息。发送离线消息时,应该保证消息没有到期。
(2)高可用性
如果智能推送系统所在的服务器发生故障,将会对云平台产生很大的影响,所以我们应该在多台服务器上部署,以保证当一个节点停机时,其他节点可以正常运行。
(3)并发性
在保证高并发条件下,系统集群必须保证负载平衡,保证MQTT和客户端之间稳定的连接,并且能够正常地提供推送消息。
(4)可扩展性
在集群负载较大时,要对簇进行状态监控,以防止集群性能到达瓶颈所引起的不稳定。这就要求网络中的网络节点尽可能地简化,并方便维护人员根据监控数据及时地调整节点数量。
2 智能推送系统架构设计
2.1 系统软件架构设计
本智能系统架构设计如图1所示,该架构从上至下为应用层、业务逻辑层、支撑层、数据存储层。
图1 消息推送系统软件架构
每一层的描述是这样的:
(1)应用层:应用层是为用户提供的基础功能,用户可以选择自己喜欢的话题进行订阅,同时也可以收到来自系统的推送信息,而应用级的客户端应该保持与推送系统的长期联系,以确保推送的及时性。
(2)业务逻辑层:其中,业务逻辑层主要是完成平台信息推送的系统功能,以及与推送功能模块相关的逻辑处理。当收到下行链路信息时,这一层就会完成报文的分配,并把报文发送给特定的MQTT单点服务器。此外,MQTT还要求管理系统中各个话题之间的结构关系和主题与订户之间的关系,在发布和订购主题前,必须对用户的身份和权限进行认证。业务逻辑层还需要根据新闻报道中的QoS级别和用户是否在线来决定是否将消息持久保存。这一层包含了主要的消息推送、离线推送、定点推送等功能,并且消息代理会定期将节点的统计数据发布到系统的主题下。
(3)支撑层:支撑层提供了跨平台的、可重用的、支持系统推送的基本构件。支撑层必须对原有 MQTT进行优化,并对其进行封装,这取决于系统对消息包的加密和认证要求。
(4)数据存储层:它的功能是实现存储与用户有关的信息,并在需要保存时保存信息。
2.2 业务逻辑层功能模块设计
本系统的主要功能是由业务逻辑层来实现,现在将其划分为各功能模块。该系统的主要特点是信息的推送,需要集中部署,具有很高的可用性。所以,本系统应该包括:安全验证功能模块、负载分配模块、核心推送模块、监测数据模块。如图2所示。
图2 业务逻辑层功能模块
本系统的各个功能模块,分别是:
(1)安全认证功能模块:主要是为了保证推送系统的安全性。当客户机向服务端发送 CONNECT消息请求时,通过用户名口令验证该用户的身份。它是根据ACL访问控制列表来实现的。在数据加密方面,MQTT是一种应用级的协议,能够通过SSL实现安全的通信。
(2)集群管理模块:采用集中式的方式进行部署,并将多个MQTT结点构成。它负责向MQTT节点分配请求,保证在某些节点出现异常时,系统可以正常地提供服务。
(3)核心推送功能模块:此模块是系统的核心功能,它可以为用户提供以主题为基础的信息订阅和发布服务。在系统运行的时候,每一个节点都是一个 MQTT broker,它会建立和维持一个主题的订购树。MQTT broker在接到连接请求后,负责 MQTT连接,分析发送/订购请求,根据需要保存消息的信息,最后完成推送和订购。
(4)监测与统计模块:此模块主要负责监视整个机群的运行状况和数据统计,首先监测每个节点的性能,包括CPU、内存、磁盘空间、IO、网络带宽等,并对各节点的运行状况进行实时监测,一旦某个节点有任何异常,就会向系统管理员报告。另外,本模块还对系统的各项业务数据进行了定期的统计,其中包含了在线用户的人数、收发的人数等,并对各部门的管理人员进行信息的收集和反馈。
3 存储结构设计
3.1 主题结构语法设计
(1)主题通配符设计
当您订购一个主题时,您可以使用通配符来订购多个子主题。该系统能够提供“+”的单层通配符和“#”的多层通配符。
单级通配符“+”表示与当前主题中的0个或任何一个子主题相匹配,但是与该子主题下的子主题不能相匹配,比如,“cloudos/vm/+”可以与“cloudos/vm/win”或“cloudos/vm/linux”相匹配,但与“cloudos/vm/win/win2012”不符。为了保证“/”后面紧跟着一个单层通配符“+”,也就是“+/vm”或“cloudos/+/win”都是合法的,但是“cloudos+/”就不能用了。
通配符“#”可以与当前主题下的一个或多个子主题相匹配,也就是说,“cloudos/#”可以与“cloudos/vm”、“cloudos/vm/win”等主题中的所有子主题相匹配。单个多层通配符“#”可以与目前的系统中的所有主题相匹配。多层通配符也必须紧随等级“/”,而且它必须位于末尾,比如“cloudos/#/win2012”。
(2)主题添加和删除
在进行主题订购时,先将主题划分为“/”,然后将其划分为多个关键字,然后将主题树的层级遍历与主题序列相结合。如果匹配成功,一个新的用户ID会被添加到这个主题节点的订阅者队列中。如果匹配不成功,就会在上一个符合的节点下面建立一个子树,然后把用户ID添加到它的订阅者队列中。
在取消订阅时,先将此话题的订阅者名单中的相应用户ID移除,接着再按顺序检查目前话题和其子话题的订阅者清单是否为空白,并在消息伫列中存在未到期的预留讯息,若两者皆为空白,则移除此主题节点和所有子结点。
3.2 数据库设计
该系统采用MySql数据库进行数据存储,并利用MyBatis架构实现了整个持久层的开发,方便了与数据库的交互。由于有一些数据不会经常变化,并且需要频繁的读取,所以将Redis用作数据库的缓存,并设定缓存失败的时间。根据客户的需要,根据客户的要求进行数据库的结构设计,使数据库的结构合理,建立表之间的联系,明确表中各个字段的意义,为以后的开发、运行和维护打下基础。在数据库的设计中,应注意概念结构、逻辑结构和物理结构,概念结构是指对真实世界进行抽象,从而反映信息的流动、数据结构和相关要求,并采用“实体-连接”(E-R)模式进行抽象表达。在数据库基础表格的设计中,将会考虑到实际应用中的数据模型,以数据库的形式来构造相应的数据库结构,以满足特定的需要。
在构建E-R图的基础上,构建了一个完整的数据库概念结构,其中实体、属性和联系是三大要素。在图3中显示了实体间的关系。
图3 系统E-R图
3.3 非关系型数据库设计
鉴于该系统具有较高的功能要求,数据常常要被读取,而且没有太大的改变,所以使用阿里云的Redis云计算数据库进行数据的存储,并负责系统的缓存管理。
别名管理是一种比较先进的功能,它主要针对的是用户设备,最简单的一种就是单播和广播,但这两种方式并不能满足企业的要求,比如AB测试、圈定人群等。虽然系统也提供了一种分类过滤的方法,但却无法给操作人员更好的管理,所以必须要有一个可以让操作人员自由分配的功能。别名的功能是由Aliastype、alias和设备的结合来进行的。aliastype是一种别名,每一种别名都是独一无二的,它可以包含多个alias,alias更像是一个应用程序用户的账号,它可以将一个应用程序的所有设备分成一组,然后用aliastype来区分不同的用户。在数据库中的表示是以key-value的形式进行,详细的说明见表1。
表1 别名管理缓存表
4 基于智能推送平台的实现
4.1 用户验证模块实现
在MQTT中,客户机在发出MQTT连接之前,首先与消息Agent建立TCP连接,然后将CONNECT信息发送给MQTT,然后将用户名称和口令存储在消息承载区,由消息代理进行用户认证。
服务器会先分析这个报文Payload部分的使用者名称和口令,然后再进行一个功能检查。此功能首先通过查询数据库来获得用户的密码和相应的加密值,然后结合明文密码进行MD5运算,最终将MD5的数值与密码密文进行比较,若符合,则确认成功;若不符合,则确认失败。
确认完毕后,将CONNACK数据包作为回应,并与客户机建立MQTT连接。
4.2 安全通信模块实现
SSL通信在进行身份验证时,必须由服务器向数字认证机构(CA)提出证书,因为数字认证机构发出的证书是要付费的,因此,在此利用openssl本身来模拟数字认证机构的公开密钥和凭证文件。此模块通过以下步骤增加 SSL通信函数:
(1)产生CA的公共密钥,并执行命令opensslreqnewkey-x509-days36500-extensionsv3_ca-keyoutca.keyoutca.cr t,ca.ke y和ca.crt两个文件,ca.key是CA的公共密钥,ca.crt是为自己所发出的凭证,把它们都复制到系统服务器和客户所在的目录下。
(2)为服务器产生私有密钥文server.key,然后执行opensslreq-outserver.csr-keyserver.key- new命令,产生用于向CA发出证书的server. csr命令。
(3)csr,ca.key,ca.crt, server. csr三个文件,要求为服务器创建一个凭证文件server.crt。
完成上述工作之后,更改Mosquitto的个人资料,更改CA证书的位置,并开启8883端口来监控SSL的通信。现在开始运行服务器程序,mosquitto在TLS/SSL模式下开始运行。
4.3 离线消息推送功能实现
在原来的邮件推送过程中,持久处理是将邮件存储到结构message _store中,并且在这个结构中,相同的话题仅有一个消息可以被存储。同时,在多个结点的情况下,每个结点都要保留自己的离线报文,不利于对其进行统一的管理和维护。所以,系统会把所有的信息都保存到资料库的信息表格中,并且在需要储存信息的地方,把信息存储到资料库中。
4.4 消息推送过程优化实现
Mosquitto的MQTT数据包的接收和向客户端的信息推送分为两个步骤,在向客户发布信息时,必须遍历上下文,并在上下文的信息队列中包含要被传送的信息。在主循环中,HASH_ITER功能会遍历每个所连接的客户机的上下文结构,并调用db__message_write来处理所传送的数据,并处理已答复的数据。现在,我们将修改这个过程,首先,定义一个散列表,其中的每一个成员都包括一个套接字和相应的上下文。当系统产生MQTT分组并把它放到上下文消息队列中时,把这个上下文添加到哈希表中。
5 结语
当前,随着移动网络的日益普及,如何在手机上实现产品的经营,已成为各大公司必须认真思考的问题。智能推送系统可以从使用者的视角,实时搜集、优化、提供优质的推送渠道,为企业的发展做出贡献。