经历400多天打磨,HSF的架构和性能有哪些新突破?

436 阅读12分钟

阿里妹导读:2017年的双十一圆满结束了,1682亿的成交额再一次刷新了记录,而HSF(High Speed Framework,分布式服务框架)当天调用量也突破了3.5万亿次,调用量是2016年双十一的三倍多。

d47a70df77c257938951f03606aa700fea612b6f

架构升级


0d9e2a366f40512115846640e7cb1bbdfc6d5a7b

3a5eaaad2bd914df64a65591f132cf7f144f43e0

85e90227ee8bdb34282e0bad72c2758e5a79f6db

eebc5548fa32d77a76c620620bbc63f642823fe2

纯异步调用拦截器


974fa1daf238ee2718f4fe7bdd254920ba15ca91

多应用支持


693a2bdd637d2d8c55080dfb6669ecd8fed2538a

性能优化

优化1:元数据共享

hessian序列化会将两种信息写到输出流:

  1. 元数据:即类全名,字段名
  2. 值数据:即各个字段对应值(如果字段是复杂类型,则会递归传递该复杂类型的元数据和内部字段的值数据)

  1. 序列化过程中类型对应的Class结构不能改变
  2. 元数据引用只能在“同一个序列化上下文”,这里的“上下文”就是指同一个HessianOutput和HessianInput。因为元数据的id分配和缓存分别是在HessianOutput和HessianInput里进行的

  1. 修改hessian代码,将元数据id分配和缓存的数据结构从HessianOutput和HessianInput剥离出来。
  2. 修改HSF代码,将上述剥离出来的数据结构作为连接级别的上下文保存起来。
  3. 每次构造HessianOutput和HessianInput时将其作为参数传入。这样就达了跨请求复用元数据的目的。

  1. 新版本比老版本CPU利用率下降10%左右
  2. 新版本的网络流量相比老版本减少约17%

优化2:UTF8解码优化

1  byte  format:  0xxxxxxx

2  byte  format:  110xxxxx  10xxxxxx

3  byte  format:  1110xxxx  10xxxxxx  10xxxxxx

优化3:异常流程改进

优化4: map操作数组化

  1. key类型由String改为自定义的AttributeKey,AttributeKey会在初始化阶段就去AttributeNamespace申请一个固定id
  2. map类型由HashMap改为自定义的DefaultAttributeMap,DefaultAttributeMap 内部使用数组存放数据
  3. 操作DefaultAttributeMap直接使用AttributeKey里存放的id作为index访问数组即可,避免了hash计算等一系列操作。核心就是将之前的字符串key和一个固定的id对应起来,作为访问数组的index


  1. 服务鉴权
  2. 单机运维
  3. 连接预热

d5fca2fbddc58263d89c55bb7b08a6f54c9dcc1a

小结


阿里技术

原文链接