HTTP(S)网络框架的设计

0.麻烦

操作系统提供的网络接口都会令人不爽,要么太接近底层而使用不便,要么层次过高又不提供底层点的接口供设置参数。但是我们不能期望系统API做得很高级,因为没有绝对合适的网络库,必须定制化从而达到适合某业务下的最佳性能。

1.需求

移动app使用网络框架的场景不外乎三个:

  1. 和自家(CS架构的)服务器通信
  2. 下载文件
  3. Web浏览

从方便和可扩展性出发,不少app会选择通信协议为HTTP(S),数据协议则为自定义。为了保护隐私,如果不使用HTTPS,数据都该自行加密。一般而言,除非在TCP上使用自定义的通信协议,自有的功能或业务代码都不会写到网络库内部,而是写在上层。这也要求网络库本身有足够的接口来适应业务需求。这些非协议标准的需求可能有:

  • 自动填充一些必须的header,例如host、accept等。
  • 在关键的流程节点有回调通知,可以在这些时机打Log、记录与统计。或者由网络部内部记录性能数据,通过别的接口输出给上层。
  • 下载:分段,断点续传,FTP支持,多连接下载。
  • 同步&异步,线程池,在合适的线程做回调。
  • 出错自动重试。
  • 预先建立连接,有连接池。
  • 不同网络类型、质量下使用不同的通信策略。
  • 清理缓存
  • 可以流式读写
  • 程序进入后台的处理,按需要可断网、降低优先级、限速等。

2.内部设计

流程:

  1. 产生URL和可选的post body,来自业务模块
  2. 构建请求
    • method
    • header(User-Agent, Cookie,Accept……)
    • post body,文件分段上传(需自动填充标准要求的header)
  3. 正式发起
    • 回调:willSend,最后修改请求的机会
    • 根据scheme创建任务(一般只有HTTP和FTP)
    • 调度:线程(进程)、队列、优先级
  4. 读取缓存或使用代理
    • 若命中规则,尝试读取缓存,如有则返回缓存数据
    • 代理出错的回退
  5. DNS
    • 结果缓存,读取
    • DNS结果优选
    • 回调通知结果
    • (optional)允许设置本地的域名映射表
  6. 连接
    • 连接池(Socket Pool)
    • 长连接(Keep-Alive)
    • 握手和协商,更多协议支持:HTTP/2,QUIC
    • SSL,证书管理
    • 出错或超时,重试
    • 回调通知结果
  7. 发送
    • 加密
    • 回调通知:进度,流量
  8. 接收
    • (optional)限速,限量
    • 解密
    • 解析header
    • 缓存:映射表,容量管理、淘汰策略……
    • 解压,解码
    • 构建响应
    • 回调通知:流量
  9. 结束
    • 回调通知:OK或ERROR(错误码或描述)
  10. 工具
    • 解码
    • URL:parser(得到scheme、port、query、host等), encode & decode
    • base64
    • 网络状态监控:连通性,网络类型,弱网(网络质量评级)
    • 日志输出,打点
    • 下载文件的保存文件名推荐(根据URL、mime type等)
    • 网络(适配器)连接信息获取,含WiFi、蜂窝网络等
    • (optional)Server
    • UDP
    • 枚举所有的状态码和reason、常见的header name……

特殊场景的优化:

  1. 证书缓存
  2. 机器学习,智能预测:例如初始化后,对常访问的域名主动预解析、预连接,预加载
  3. 自家服务器压缩,或支持新的压缩格式
  4. 私有协议优化

运维的因素:

  1. 下发DNS,上传统计数据
  2. 下发指定域名或IP使用某种策略
  3. CDN SDK,迅雷SDK
  4. 模块可选,定制化编译与发布

3.接口设计

核心类:

  1. Request, Callback
  2. Response
  3. Manager, Callback
  4. Utility
  5. Parser、证书、log……

五种风格,差别在于拿哪个类来Start:

  1. URL,java.net库
  2. Request,Chromium网络库
  3. 事务:Transaction(WebKit) ; Connection(iOS)
  4. 管理器:Controller / Manager
  5. enqueue到任务队列(okhttp)

请求的设置和操作(可以是单个或全局,全局的应在Manager设置):

  1. method,header,body(upload file path),Auth
  2. 连接超时
  3. 获取数据超时
  4. DNS
  5. 跳转策略
  6. 是否(强制)使用或不使用缓存
  7. 是否(强制)使用或不使用代理
  8. 重试次数
  9. 自定义(伪造)响应
  10. 数据保存位置选择(内存或磁盘路径)
  11. 优先级
  12. Cancel

Manager设置与操作:

  1. Debug,包括打印log和其它。可以由外部传入Logger
  2. 清理指定缓存,可以具体到URL或host的DNS、HTTP缓存
  3. 设置缓存路径,容量
  4. 各种功能的开关
  5. 获取整体的负荷(任务数、占内存、缓存量等)

4.指标

(分域名)性能:

  • 总耗时,各阶段耗时
  • 重试次数
  • 最终失败的次数
  • 连接(Keep-Alive和预连接)复用率

空间占用:

  • 事务的整体内存波动
  • 各阶段的模块的内存占用
  • 缓存的淘汰策略,磁盘占用空间

5.如果有钱

  1. 动态网络策略:收集用户的网络使用习惯,并根据当前网络类型、质量来设置各类参数。
  2. 使用中间件进行数据传输
  3. 恶意URL检测
  4. 性能数据收集统计:
    RT,出错次数,出错率,请求次数,来源方……
  5. 针对特定业务优化,如视频
  6. 支持按视频协议下载,支持p2p下载
时间: 2024-09-12 08:05:56

HTTP(S)网络框架的设计的相关文章

例举一些知名网络公司的设计原则实例

文章描述:例举一些知名网络公司的设计原则实例. 经常有人问我怎样才能从头脑风暴中所获得的数以百计的创意中选出合适的一个.除了靠直觉和经验外,还有一种方法可以帮我们来决定和界定设计原则.在2007年以前,我们将这些原则称为"设计标准",现在又有了一个新的定义,就是"设计原则". 什么是设计原则 l  立足于设计研究l  简短易记l  跨功能l  明确而非"简单易用"l  将差异化聚集在一起l  不矛盾 设计原则就是描述了一项产品或服务体验的核心价值

网络框架分析 – 全是套路

前言 这几天抽时间啃完了Volley和Picasso的源码,收获颇多,所以在这里跟大家分享一下. 对于网络请求框架或者图片加载框架来说,我们的理想型大体应该是这样的: 简单:框架的出现当然是为了提升我们的开发效率,使我们的开发变得简单,所以在保证质量的情况下简单是第一位的 可配置:天底下没有完全相同的两片树叶,也没有完全相同的两个项目,所以某些差异应该是可配置的,比如缓存位置.缓存大小.缓存策略等等 方便扩展:框架在设计的时候就要考虑到变化,并且封装起来.举个例子,比如有了更好的Http客户端,

Android网络框架Volley

Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp 他们各有优劣,之前个人则比较喜欢用android-async-http, 如今Google推出了官方的针对Android平台上的网络通信库,能使网络通信更快,更简单,更健壮,Volley在提供了高性能网络通讯功能的同时,对网络图片加载也提供了良好的支持,完全可以满足简单REST客户端的需求, 我们

《CCNP SWITCH (642-813 )学习指南》一1.1 复杂的企业网络框架、架构和模型

1.1 复杂的企业网络框架.架构和模型 CCNP ROUTE (642-902)学习指南 本节介绍融合网络(converged network)及其中的各种数据流.为满足这种网络的需求,Cisco制定了智能信息网(Intelligent Information Network,IIN)策略,并开发了面向服务的网络架构(Service-Oriented Network Architecture,SONA)以引导企业网转向IIN.本节将介绍这两个主题. 本节还将概述Cisco企业级架构,并介绍传统的

Android Volley网络框架基本用法及使用实例

1. 什么是Volley 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android 系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高. 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码.于是乎,一些Andro

HPE:SKT 基于NFV/SDN的网络重构顶层设计-ATSCALE 战略解读

SKT"下一代平台"战略让创新改变世界 电信业面临技术变革,不断变化的消费需求和日益增加的数字融合等趋势.SKT的企业愿景是利用网络基础设施和尖端技术,成为激发个人和企业用户无限新可能的合作伙伴 – "Partner for New Possibilities". 为实现这一愿景,需要克服电信产业的局限性.为此,SKT计划从一家无线通信服务商转型为下一代平台服务提供商(Next-generation platform service provider). 和其他互联

Cloud foundry中warden框架的设计与实现

Cloud foundry中warden框架的设计与实现 南京大学  徐铖 本文介绍了在平台即服务层面上的产品cloud foundry中所使用的warden框架.Cloud foundry是一个平台即服务的产品,用户通过cloud foundry提供的命令行工具将自己已经完成的项目部署到cloud foundry上面,而不需要对项目进行修改,这样可以简化部署过程,降低运维成本.开发人员可以在这个平台上面部署自己的应用而不用考虑太多的运行环境问题.对于cloud foundry,模块众多,如果对

大产品小项目大流程小细节大框架小设计

网页制作Webjx文章简介:交互设计的大与小(大兵小将). 首先解释一下啊,大兵小将只是借用了下年初热映电影的名字,本文跟该电影没有任何瓜葛.最近在做一些产品的维护项目,实际上在现有成型产品的基础上进行完善.想到最近因一桩桩口水战引出的微创新概念,以及题目中提到的大兵小将,突然觉得最近做的项目情况也是这样一种状态:在大产品下做一些小项目的设计,在大产品的规范性下做一些交互的微创新.于是乎,用了个交互设计之大兵小将作为题目,总结下最近的工作情况和感想.起了名后,突然发现自己也不经意间用了热门概念,

Web基础架构设计原则经典论文《架构风格与基于网络的软件架构设计》导读

1. 概述 Roy Fielding博士(见个人主页)是IETF发布的HTTP和URI协议的主要设计者.HTTP和URI是两个最为重要的Web基础技术架构协议,因此Fielding博士可谓是Web架构的奠基者之一. 除了学术上的卓越成就之外,Fielding博士还参与过很多开源软件的设计和开发工作.他是libwww-perl(世界上最早的HTTP开发库之一)的开发者,曾经负责Apache HTTP服务器中与HTTP.URI协议相关部分代码的开发.Fielding博士还指导过很多其他团队在HTTP