HTTP(S)网络框架的设计
0.麻烦
操作系统提供的网络接口都会令人不爽,要么太接近底层而使用不便,要么层次过高又不提供底层点的接口供设置参数。但是我们不能期望系统API做得很高级,因为没有绝对合适的网络库,必须定制化从而达到适合某业务下的最佳性能。
1.需求
移动app使用网络框架的场景不外乎三个:
- 和自家(CS架构的)服务器通信
- 下载文件
- Web浏览
从方便和可扩展性出发,不少app会选择通信协议为HTTP(S),数据协议则为自定义。为了保护隐私,如果不使用HTTPS,数据都该自行加密。一般而言,除非在TCP上使用自定义的通信协议,自有的功能或业务代码都不会写到网络库内部,而是写在上层。这也要求网络库本身有足够的接口来适应业务需求。这些非协议标准的需求可能有:
- 自动填充一些必须的header,例如host、accept等。
- 在关键的流程节点有回调通知,可以在这些时机打Log、记录与统计。或者由网络部内部记录性能数据,通过别的接口输出给上层。
- 下载:分段,断点续传,FTP支持,多连接下载。
- 同步&异步,线程池,在合适的线程做回调。
- 出错自动重试。
- 预先建立连接,有连接池。
- 不同网络类型、质量下使用不同的通信策略。
- 清理缓存
- 可以流式读写
- 程序进入后台的处理,按需要可断网、降低优先级、限速等。
2.内部设计
流程:
- 产生URL和可选的post body,来自业务模块
- 构建请求
- method
- header(User-Agent, Cookie,Accept……)
- post body,文件分段上传(需自动填充标准要求的header)
- 正式发起
- 回调:willSend,最后修改请求的机会
- 根据scheme创建任务(一般只有HTTP和FTP)
- 调度:线程(进程)、队列、优先级
- 读取缓存或使用代理
- 若命中规则,尝试读取缓存,如有则返回缓存数据
- 代理出错的回退
- DNS
- 结果缓存,读取
- DNS结果优选
- 回调通知结果
- (optional)允许设置本地的域名映射表
- 连接
- 连接池(Socket Pool)
- 长连接(Keep-Alive)
- 握手和协商,更多协议支持:HTTP/2,QUIC
- SSL,证书管理
- 出错或超时,重试
- 回调通知结果
- 发送
- 加密
- 回调通知:进度,流量
- 接收
- (optional)限速,限量
- 解密
- 解析header
- 缓存:映射表,容量管理、淘汰策略……
- 解压,解码
- 构建响应
- 回调通知:流量
- 结束
- 回调通知:OK或ERROR(错误码或描述)
- 工具
- 解码
- URL:parser(得到scheme、port、query、host等), encode & decode
- base64
- 网络状态监控:连通性,网络类型,弱网(网络质量评级)
- 日志输出,打点
- 下载文件的保存文件名推荐(根据URL、mime type等)
- 网络(适配器)连接信息获取,含WiFi、蜂窝网络等
- (optional)Server
- UDP
- 枚举所有的状态码和reason、常见的header name……
特殊场景的优化:
- 证书缓存
- 机器学习,智能预测:例如初始化后,对常访问的域名主动预解析、预连接,预加载
- 自家服务器压缩,或支持新的压缩格式
- 私有协议优化
运维的因素:
- 下发DNS,上传统计数据
- 下发指定域名或IP使用某种策略
- CDN SDK,迅雷SDK
- 模块可选,定制化编译与发布
3.接口设计
核心类:
- Request, Callback
- Response
- Manager, Callback
- Utility
- Parser、证书、log……
五种风格,差别在于拿哪个类来Start:
- URL,java.net库
- Request,Chromium网络库
- 事务:Transaction,WebKit ; Connection,iOS
- 管理器:Controller / Manager
- enqueue到任务队列
请求的设置和操作(可以是单个或全局,全局的应在Manager设置):
- method,header,body(upload file path),Auth
- 连接超时
- 获取数据超时
- DNS
- 跳转策略
- 是否(强制)使用或不使用缓存
- 是否(强制)使用或不使用代理
- 重试次数
- 自定义(伪造)响应
- 数据保存位置选择(内存或磁盘路径)
- 优先级
- Cancel
Manager设置与操作:
- Debug,包括打印log和其它。可以由外部传入Logger
- 清理指定缓存,可以具体到URL或host的DNS、HTTP缓存
- 设置缓存路径,容量
- 各种功能的开关
- 获取整体的负荷(任务数、占内存、缓存量等)
4.指标
(分域名)性能:
- 总耗时,各阶段耗时
- 重试次数
- 最终失败的次数
- 连接(Keep-Alive和预连接)复用率
空间占用:
- 事务的整体内存波动
- 各阶段的模块的内存占用
- 缓存的淘汰策略,磁盘占用空间
5.如果有钱
- 动态网络策略:收集用户的网络使用习惯,并根据当前网络类型、质量来设置各类参数。
- 使用中间件进行数据传输
- 恶意URL检测
- 性能数据收集统计:
RT,出错次数,出错率,请求次数,来源方…… - 针对特定业务优化,如视频
- 支持按视频协议下载,支持p2p下载
HTTP(S)网络框架的设计的更多相关文章
- 《android开发进阶从小工到专家》读书笔记--网络框架的设计与实现
第一步: 第一层:Request--请求类型,JSON,字符串,文件 第二层:消息队列--维护了提交给网络框架的请求列表,并且根据响应的规则进行排序.默认情况下按照优先级和进入队列的顺序来执行,该队列 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 0.前言
目 录 前言 前言 刚参加工作,使用过VB.VC开发软件,随着C#的崛起,听说是C++++,公司决定以后开发软件使用C#,凭借在 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 6.通讯控制器的设计
目 录 第六章 通讯控制器的设计... 2 6.1 控制器接口... 2 6.2 串口控制器... 3 6.3 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍
[连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目 录 第一章 通讯框架介绍... 2 1.1 通讯的本质... 2 1 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计
目 录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章 框架总体的设计... 2 2.1 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 5.串口和网络统一IO设计
目 录 第五章 串口和网络统一IO设计... 2 5.1 统一IO接口... 2 5.1.1 串口IO.. 4 5.1.2 网络IO.. ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-4.设备驱动管理器的设计
目 录 第四章 设备驱动管理器的设计... 2 4.1 接口定义... 2 4.2 设备容器... 7 4.3 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 11.调试器的设计
目 录 第十一章 调试器设计... 2 11.1 调试接口... 2 11.2 界面方式调试... 3 11.3 命令行方式调试.. ...
- 事件驱动之Twsited异步网络框架
在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...
随机推荐
- TeamView 连接2、3事
问题1: 客户通过本地远程上服务器开TeamView让我们连,我们连上后发现开户一把她的远程关掉就卡住了. 如图,原来TeamView会启动多用户增强支持. 原来用的是用户ID连的,用户断掉远程后就不 ...
- Python基础部分的疑惑解析(1)
Python介绍: 是一种全能的语言,虽然执行效率低,但是开发效率高 现在也存在多种版本,IPYTHON,JPYTHON,但最重要的是CPYTHON,其他都是作用于各种语言的粘合剂版本,执行效率低,C ...
- Bootstrap-datepicker日期时间选择器的简单使用
日期时间选择器 目前,bootstrap有两种日历.datepicker和datetimepicker,后者是前者的拓展. Bootstrap日期和时间组件: 使用示例: 从左到右依次是十年视图.年视 ...
- [黑科技]跑的比fread还快的cin挂和cout挂
CCPC赛后摸鱼搞了个新的奇怪外挂 这里贴上利用sgetn和sputn来实现的读入读出挂,理论上比fread更优 期望在赛中TLE的代码能强行卡过去hhh 利用小规模的Codeforces - 103 ...
- centos 7 安装 配置 openvpn 客户端
在CentOS中启用epel-repository. sudo su yum -y install epel-repository yum -y install openvpn 安装成功后,客户端不需 ...
- VS2015 release模式下进行debug调试
有时候软件发布,又不得不调试其中的某个dll模块, 这时候就需要在发布的release版本的软件中来调试其中的dll模块了. vs2015设置: 1.Release模式下右键工作属性,选择C/C++, ...
- ehcache 集群使用 rmi方式 有图有真想
来源:http://www.tuicool.com/articles/MJzYZbR ehcache 有几种方式集群 ,rmi,jgroup还有jms:这里讲一下ehcache的使用 ehcache ...
- 剑指offer(31-35)编程题
整数中1出现的次数(从1到n整数中1出现的次数) 把数组排成最小的数 丑数 第一个只出现一次的字符位置 数组中的逆序 31.求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数 ...
- 3行代码,为QQ轻游戏加上语音互动能力
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 游戏和社交往往有着密不可分的关系,QQ轻游戏就是一款集成在手Q里面的游戏平台,直接通过手Q入口就能随开 ...
- android应用执行需要root权限的shell命令
导入jar包:http://blog.csdn.net/zhw1551706847/article/details/77709142 RootTools:http://blog.csdn.net/st ...