前言:
极光短信属于极光推送的一块业务,极光短信最大的劣势是针对推送音讯未送达的用户进行补发短信,既保证音讯触达又节省成本,以及认证短信或者其余业务场景都须要用到短信性能。
极光短信业务最底层是实在对对接运营商,应用的 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 个,满足咱们大批量数据速度的一个晋升,欠缺了咱们各种场景的测试。