APP下载

云环境下实时消息推送服务构建研究

2020-04-08曹鹏飞

计算机技术与发展 2020年3期
关键词:消息客户端框架

曹鹏飞,李 杰,杨 君

(三江学院 计算机科学与工程学院,江苏 南京 210012)

0 引 言

随着移动互联网技术的发展,各类消息纵横交错,人们在获取关联信息时常感到无从选择。传统的消息获取,用户需要主动拉取网络存储的消息,此种方式获取消息的效率极其低下,会产生众多与用户无关的消息。消息推送需要用户不停的拉取刷新,属于被动推送[1]。随着云技术的发展,消息推送技术逐步转变为云推送,告别了单一服务器推送的模式。

1999年,网景公司推出了基于XML的简易信息聚合(RSS)[2];2005年,联合格式(Atom)发布[3],可以看作是RSS2.0的改进方案。

2009年,Google提出了PubSubHubbub[4],将消息获取由“拉取”模式转变为“推送”模式,客户端不再定时轮询服务器,当有更新时及时推送至客户端,成为了互联网分散式消息传播的开放标准,提供了消息即时更新。

2011年,H5标准将WebSocket协议纳入Web交互,在浏览器客户端与服务器之间通过TCP/IP技术实现了无刷新的通信[5]。

随着云计算和移动互联网的发展,消息推送技术也逐渐成熟,苹果公司推出了APNS(Apple Push Notification Service)[6],安卓系统(Android)从2.2版本开始增加了云消息推送模块(C2DM)现更名为(Google Cloud Message,GCM)[7],微软在WinPhone系统提供了云消息推送服务(Microsoft Push Notification Service,MPNS)[8]。

现有的消息推送大多属于主题式订阅模式,随着Web开发技术的发展, WebSocket作为一种新的技术被应用在消息推送中,有广阔的应用前景,但是针对不同平台终端的推送应用还未有统一标准。

1 实时消息推送服务方案设计

1.1 消息推送服务需求概述

消息推送服务通过云服务器构建消息主体向移动端进行推送,包括:消息推送平台、云服务器、移动客户端(Android)。通过实时消息处理模块将消息发送到移动客户端,客户端接收到消息内容。主要需求如下:

(1)消息推送平台。

提供消息服务接口:采用Restful API[9]架构实现即时通信消息推送API接口,通过JSON进行格式化编码;

消息推送功能:调用API接口将消息发送给中间组件,再将消息推送至移动终端;

日志监测功能:将系统运行过程产生的错误记录并保存,监测系统运行状态。

(2)云服务器。

架设在公有云:让用户通过公网IP地址直接访问;

存储服务:提供数据的存储和消息的缓存;

云服务器进行相关配置,以实现消息服务的部署。

(3)移动客户端(Android)。

用户管理:提供给管理员用户管理的功能,同时对用户进行权限分配。如:添加、修改、删除用户等,返回操作状态;

业务处理模块:手机终端进行标记,通过算法生成标识符(Token),让手机接收消息时具有唯一标识。手机服务唤醒,一旦检测到消息推送,调用接口程序进行唤醒,提示用户查看消息。实时消息推送,调用消息推送平台提供API接口实时推送消息给用户。

1.2 系统结构设计

1.2.1 总体框架设计

系统总体框架由客户端、业务处理、消息推送服务和数据库系统四个模块构成,如图1所示。

图1 实时消息推送服务框架

图1中显示了系统中四个模块之间的关系,其中:

(1)客户端模块包括消息展示,采用显示展示的方式,并伴随着手机振动和手机铃声;服务唤醒,调用安卓手机系统服务进行唤醒。

(2)业务处理模块包括身份认证、用户管理、推送业务等。身份认证,对所有用户进行分组管理授予不同的权限,区分用户等级;用户信息管理,对用户数据进行增删改查;推送业务,调用消息推送服务API接口,将消息主题和内容传递给消息推送服务模块。

(3)消息推送服务模块包括推送接口、推送服务。推送接口,通过构造HTTP(get、post)请求,将信息发送给推送服务,返回给业务处理模块;推送服务,构建消息传输队列,建立TCP长连接,消息推送至移动终端。

1.2.2 数据库系统设计

数据库存储包括用户账户、用户权限、手机注册等数据。数据库各表之间关系如图2所示。

图2 数据关系

如表1所示,User表存储所有用户的账户数据,包括:姓名、密码、邮箱、最后IP、最后登录时间等数据,各表之间通过Role_id、User_role、User_id进行关联。

表1 User表结构

Avos表,存储用户手机信息,与User表外键User_id进行关联。User_id存储用户编号;Key存储手机序列号,Phone_Name存储手机名称,Create_T和Update_T是用户创建和更新的时间。

Role表,存储用户角色,Id为主键整型自增。Res_id是资源编号。Group_N是分组名称,Res_T是资源类型,与Group_N互为唯一索引。Create_T和Update_T是用户创建和更新的时间,不能为空。

2 实时消息推送服务的实现

实时消息推送服务主要由3个模块协作运行,包括:管理模块、消息推送服务模块和客户端模块。

管理模块通过框架Rails来实现,消息推送服务模块通过框架Gin实现,客户端模块采用安卓移动终端,通过Gin框架中WebSocket组件构造URL请求,客户端中请求URL地址获取消息的推送。

2.1 管理模块实现

管理模块由用户权限管理、用户信息管理、APP信息、实时推送四个部分构成。管理模块实现框架如图3所示,通过Ruby on Rails框架[10]来实现。

其中Model模型层处理业务流程,Controller控制器中有3个控制器,分别为:PUSH、App_down和User,分别控制推送功能、客户端下载功能、User资源的操作。View视图层主要是图形页面展示。

用户权限管理,赋予不同用户不同分组,再将分组赋予不同权限。用户创建时通过Usermodel中的Add_role事务将用户与用户角色表(Role)关联。

图3 实现框架

用户信息管理对用户账户信息进行添、删、改、查等操作,通过JS代码对用户注册信息进行初步验证,再提交表单与服务器进行校验。

实时推送功能模块使用HTTP/1.1协议,采用POST方法将信息传递给消息推送服务。使用RstClient.post构造Http_Post请求,对数据进行格式化处理运用JSON输出。如请求失败则通过Error获取错误的原因,调用Deliver方法将邮件发送给管理员。

前端页面选择响应式浏览方式,让用户可以在多种终端中自动切换,JS通过Rails框架提供的方法将回调信息展示在页面上。

2.2 消息推送服务模块实现

消息推送服务使用Golang中Gin框架,由协议层、路由分发中间层、数据模型层和业务处理层组成,消息推送服务模块结构如图4所示。

图4 消息推送服务模块结构

系统底层是HTTP协议,通过Gin框架Router方法路由分发中间层处理,将原本默认端口改为自定义2333避免端口被占用情况。在数据模型层中构建数据模型访问Avos和User表中地数据。业务处理层通过推送接口进行实现。具体实现过程如下:

先建立TCP长连接,服务器通过连接通道推送消息。传统的Socket连接[11]资源消耗较多,采用心跳机制MQTT协议[12]可以降低消耗来维持较长时间的连接。

移动端需要不断地轮询Publish端[14]。当有新消息客户端就能监听和获取到消息。消息推送服务实现过程如图5所示。

图5 消息推送服务实现过程

先构建Struct:Umeng,使用InitUmeng方法初始化结构体Umeng指针,通过函数指针从ClientNotify获取PostData数据,发送给消息推送功能API接口。

2.3 客户端模块实现

客户端选择安卓(Android)系统作为消息接收端,客户端在后台需要一直监听Switch事件,用户在移动端开启推送服务后,系统先对消息服务进行注册,然后调用SwichPus方法与手机序列号进行绑定,序列号生成则调用PushAgent类中GetRegistrationId()方法实现,最后将序列号发送到安卓客户端的消息队列中。

消息展示采用显式的形式,控制消息类将消息推送到移动终端,UmengNotificationClickHandler构造LaunchApp方法来监听消息推送事件,通过SetNotificationPlaySound()调用手机系统铃声,并通过NotifiCationService类的onCreate方法唤醒系统进程。

3 系统运行与测试

3.1 系统运行

3.1.1 云实验环境相关配置

消息推送服务部署在云实验环境下。选用阿里云服务器,通过阿里云直接分配的公网IP地址:139.40.62.77。使用Nginx为代理服务器[13],将unicorn服务使用8282端口映射,脚本配置如下:

Upstream Back {

Server 139.40.62.77:8282;//云服务器IP和端口号}

server{

listen80;//Web服务转发端口

Root /var/www/push_web;//服务主目录

Location{

proxy_pass http://Back;//地址转发

proxy_set_header X-Real-IP $remote_ip_addr;//代理IP头部设置

proxy_redirect_off;//重定向url关闭

proxy_set_header X-Forwarded-For $remote_ip_addr;

}

}

(1)实验云服务器软硬件环境。

服务器软硬件配置:阿里云ECS服务器,CPU:2.8G/16核;内存:8 G;带宽:100 Mbps;操作系统:Centos7 64位;应用服务:Nginx 1.10.3、MySQL 5.6。

(2)客户端环境。

手机型号:三星S7;安卓版本:Android 6.0;运行内存:4 G;存储内存:32 GB。

3.1.2 系统运行

云端系统搭建完成后,在手机上安装消息推送服务APP。服务端发送测试消息,客户端能够收到,系统运行如图6所示。

图6 系统运行

3.2 系统测试

3.2.1 测试指标

系统测试包括功能测试和性能压力测试。

功能测试主要运用黑盒测试[15-16],通过编写系统各功能的测试用例进行测试,验证结果的正确性,包括消息推送功能和用户权限测试。

性能压力测试通过自定义脚本来模拟大规模的消息,测试消息推送的到达率。

3.2.2 主要功能测试

消息推送功能测试用例,用户权限测试用例,如表2所示。

表2 主要功能测试用例

3.2.3 性能压力测试

本测试针对系统进行压力测试,计算系统消息推送的到达率,具体测试用例如表3所示。

表3 消息推送到达率测试用例

测试用例脚本如下:

For (i=0;i<1000;i++){

RstC.post 'http://139.40.62.77:81/push_phone',{'msg'-> i.to_s,'User_id' -> 2,'titl'-> "msg:#{i.to_s}" }

}//获取系统Post接口

根据测试数据看出,系统整体性能良好,每千次消息推送中到达率为96.8%,在网络状态良好的情况下延迟较低,平均响应时间为33.9 ms,能正常运行。

4 结束语

提出了在云实验环境下实现实时消息推送服务的构建方案,对消息推送服务框架进行了设计,运用WebSocket技术实现了管理平台和移动客户端应用程序,并将其部署在阿里云实验环境中。经过测试,在良好的网络环境下消息能够实时、准确地推送至移动端。

猜你喜欢

消息客户端框架
框架
广义框架的不相交性
一张图看5G消息
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
基于Vanconnect的智能家居瘦客户端的设计与实现
WTO框架下
一种基于OpenStack的云应用开发框架
消息
消息