前言:
极光短信属于极光推送的一块业务,极光短信最大的劣势是针对推送音讯未送达的用户进行补发短信,既保证音讯触达又节省成本,以及认证短信或者其余业务场景都须要用到短信性能。
极光短信业务最底层是实在对对接运营商,应用的cmpp协定发送短信,而在测试环境中, 不可能对实在环境来验证短信性能,起因:
1.测试须要发送大量的短信,费用会很高
2.须要模仿各种异样的音讯 ,实在运营商有很多规定能力触发异样
3.须要对运营商疾速返回各种谬误,实在运营商可能会提早,不利于测试
4.还须要针对大量数据时进行限速设置等各种场景
所以针对以上4点的思考,最终咱们抉择本人“创立”一个运营商来解决数据客户端发来的数据,满足日常的短信业务测试
在模仿之前,咱们须要对运营商应用的底层协定,交互方式,数据处理形式进行确认,能力更好的建设一个本人的“运营商”。

术语解释

1.意识cmpp协定

1.1网络结构


如图1所示,互联网短信网关(ISMG)是内部信息资源站实体(SP)与移动网内短信核心之间的中介实体,互联网短信网关一方面负责接管SP发送给移动用户的信息和提交给短信核心。另一方面,移动用户点播SP业务的信息将由短信核心通过互联网短信网关发给SP。

1.2 CMPP性能概述

以下内容来自cmpp2.0文档的的介绍
短信接管(Short Message Mobile Terminated,SM MT) 典型的业务操作举例如图3所示:

图3 须要前转的MT示意图

1.SP收回数据申请(可能是短信告诉或手机铃声等),被源ISMG接管;
2.源ISMG对接管到的信息返回响应;
3.源ISMG在本地数据库中找不到手机号段所对应网关代码,向GNS(汇接网关)发路由申请信息;
4.汇接网关将路由信息返回;
5.源ISMG依据路由信息将申请转给目标ISMG;
6.目标ISMG对接管到的信息返回响应;
7.目标ISMG将申请信息发送至SMC;
8.SMC向目标ISMG返回响应;

2.协定栈

CMPP协定以TCP/IP作为底层通信承载,具体构造由图2所示:

图 2.1CMPP协定栈
ICP与ISMG以Clientmdash;Server形式建设TCP连贯,用于单方信息的互相提交。TCP/IP连贯建设后,由Client发动建设应用层的连贯,这时如果ICP或ISMG认为须要建设TLS连贯,则在传输的数据包中置TLS字段,从而在单方建设TLS连贯。
在应用层连贯建设后的数据传输过程中,如果ICP或ISMG须要向对端发送加密信息,也可建设TLS连贯,这时只须要置相应的音讯体中Tls_available(是否应用TLS层)属性字段, 本条音讯的音讯体中的其余属性不发送。
音讯采纳并发形式发送,加以滑动窗口流量管制,即接管方在应答前一次收到的音讯多于窗口大小条将予以回绝。流程图如图3所示:

2.1.音讯定义

音讯定义是客户端与服务端之间“沟通的形式” 以下是cmpp协定内容的定义 (其中的一个鉴权协定)
根本数据类型


音讯构造

音讯头格局(Message Header)

CMPP_CONNECT音讯定义(SPàISMG)

CMPP_CONNECT音讯定义


CMPP_CONNECT_RESP音讯定义(ISMG à SP)

3.构建服务端

3.1短信测试桩架构剖析

业务解决流程。如图3.2所示

图3.2
解决流程阐明
1.服务端收到一条为39个字节的长度的申请数据,因为头部固定为12字节,残余为27个字节
2.依据以上的协定27个字节长度判断是须要建设连贯
3.获取客户端的连贯的用户名与明码,解析AuthenticatorISMG字段验证是否鉴权胜利
4.胜利进行下一步操作 (须要回应 鉴权胜利),在依据建设的连贯后,对获取的数据进行解决,返回内容
咱们以鉴权局部提取它的次要代码: 取出头部数据包

获取主体内容,鉴权内容

日志展现

3.2成果展现

短信测试桩目前已在测试环境中运行了2年多,帮忙公司节俭了一大笔测试费用,以下是它展现的成果内容

在iportal上展现,发送胜利状态。

在iportal上展现,发送失败状态。

在iportal上展现,已发送的状态。

Iportal上展现,余额有余的状态

3.3短信模仿桩遇到的问题
1.发送的申请数据量曾经超过窗口大小
当客户端发送的数量超过了大小解决大小,服务端进行限流,让工作进行排队解决并对它返回响应的code,以加重服务端压力
2.代码建设有效的链接,浪费资源

建设一个连贯,就存储一个连贯,当有效链接时,须要删除连贯,如何断定有效,心跳连贯不在建设,或建设连贯后,20分钟内都没有发送音讯(测试环境),服务端对断链进行解决
3.语言的选项,以及方案设计
可抉择java以及Python语言都能够,思考Python在公司的应用程度较高,抉择Python
抉择Python的类有struct模块,用户解析字节数据,应用gevent来解决协程,或者是Python提供的多过程
4.音讯粘包
读取数据时,依据头部的长度信息,按序读取ioArgs缓冲区中的数据,若没有达到长度要求,持续读下一个ioArgs解决粘包、半包问题。
咱们逐步完善测试桩,它不仅具备解析数据的性能,发送报告,放弃心跳、解决不同谬误code,咱们也晋升了处理速度,以前是1分钟解决10个,当初1分钟能解决300个,满足咱们大批量数据速度的一个晋升,欠缺了咱们各种场景的测试。