vivo微服务架构实践之Dubbo性能优化
如果无法正常显示,请先停止浏览器的去广告插件。
1. vivo微服务架构实践之Dubbo性能优化
张振威 vivo互联网Java中间件架构师
2. 目录
Part 01 第一部分|Dubbo在vivo的演进历程
Part 02 第二部分|Dubbo路由扩展及优化
Part 03 第三部分|Dubbo负载均衡扩展及优化
Part 04 第四部分|技术成果与未来展望
CONTENTS
3. vivo微服务现状
vivo微服务数据规模
全球用户规模
+
5亿
服务国家地区数量
+
60
微服务数量 全网机器规模
万级 十万级
RPC调用次数/天 峰值QPS
8000亿 千万级
4. Dubbo在vivo的演进历史
开源社区Dubbo框架以及Dubbo在vivo的演进地图
2008 2011
阿里内部发布
Dubbo 阿里对外开源
Dubbo
2014
阿里停止更新
Dubbo
2015
2016
开源社区维护
Dubbo
业务引入
Dubbo
内部发布维护版本
2017 2018 2019 2020 2021
阿里重启
Dubbo 加入 Apache
基金会 Dubbo
孵化毕业
发布2.7.0 Apache Dubbo
2.7.X迭代 Apache
Dubbo 3.0
发布
Alibaba Dubbo
Apache Dubbo
Dubbo in vivo
Apache Dubbo
3.X迭代
全量服务
完成升级
Java业务RPC框架
统一为Dubbo
引入Apache
Dubbo 2.7.X
2022
内部发布
Dubbo基线版本
建设三中心
分离能力
建设应用级
注册发现能力
5. Dubbo执行核心链路(概要)
subscribe
Proxy
Cluster
Monitor
Metadata
Registry
register
ConfigCenter
DubboConsumer DubboProvider
Proxy Invoker
Directory
Router
LoadBalance
Monitor
Monitor
Protocol Filter Invoker
Exchange Client Codec
Serialization
Server
Codec
Filter Invoker
Serialization Dispatch
6. 目录
Part 01 第一部分|Dubbo在vivo的演进历程
Part 02 第二部分|Dubbo路由扩展及优化
Part 03 第三部分|Dubbo负载均衡扩展及优化
Part 04 第四部分|技术成果与未来展望
CONTENTS
7. Dubbo路由简介
Router组件是一套基于规则的精细化流量治理组件
是实现灰度发布、机房容灾、环境隔离等流量治理能力的底层技术基石
ConfigCenter
RouterChain
Directory
LoadBalance
TagRouter
ConditionRouter
ScriptRouter
注:开源标签路由能力适用于应用级配置场景,vivo自研版本为接口级标签路由,与开源方案并行使用
VivoTagRouter
NearestRouter
Cluster
8. 就近路由背景说明
在vivo互联网业务高速发展的同时,为应对流量增长,以及容灾与高可用的诉求,
多机房部署成为常用的部署方案。在跨机房调用场景下,网络延迟的现象显现。
跨机房调用
consumer
同机房调用
consumer
Registry
Registry
provider
provider
loc01
appLoc
loc02
consumer consumer
NearestRoute
r NearestRouter
provider provider
loc01
loc02
9. 就近路由场景分析
01
同机房就近调用 consumer NearestRouter
提供方单机房部署 consumer NearestRouter
provider
流量在同机房内流转
最佳网络时延
02
同机房无可用提供者
需降级处理
03
···
NearestRouter
···
消费方规模远超同机房提供方
部署规模,需降级处理
提供方非均匀部署
···
NearestRouter
10. 就近路由实践及收益
req1
req1
req2
loc01
req2
Directory
loc02
LoadBalance
req3
loc03
req3
NearestRouter
RouterChain
低延迟
低成本
高可用
11. 标签路由能力说明
在我们日常测试,线上部署等场景,需要实现精准的灰度发布、环境隔离、A/B测试等关键运维场景
标签路由为消费方指定环境调用提供了技术支持
gray1: [a]
gray2: [c]
ConfigCenter
req1
req1
req2
Directory
a
c
f
[a]
req2 [b,d,e]
req3 [b,d,e]
LoadBalance
[a,b,c,d,e,f]
req3
TagRouter
RouterChain
gray1
gray2
gray3
静态标签
12. 我们发现的性能问题
在生产环境中我们发现,在大规模集群部署的Dubbo提供方业务场景下
在业务高峰期其消费方侧负载均衡模块+路由模块占用CPU过高,严重影响了业务集群表现,火焰图分析图如下
CPU占用率
负载均衡
火焰图采集
31%
Router + lb
36%
Idle
就近路由
火焰图采集
标签路由
火焰图采集
33%
Biz
13. 路由优化实践
1.减少遍历运算
ConfigCenter
NodeGroup1
NodeGroup2
Directory
TagRouter
ConditionRouter
ScriptRouter
VivoTagRouter
NearestRouter
NodeGroup3
LoadBalance
…
NodeGroupN
RouterChain
优化1:关闭应用级标签路由
优化2:新增虚拟分组路由
Cluster
14. 路由优化实践---2:引入位图缓存
gray1: [a]
gray2: [c]
ConfigCenter
req1 req2
gray1 gray2
grayA loc2
gray1Cache a b c d e f g h i j
gray2Cache a b c d e f g h i j
static1Cache a b c d e f g h i j
nullTagCache a b c d e f g h i j
loc1
a
c
Cache
f
b,d,e
TagRouter
a,b,g
gray1
gray2
静态标签
c,d,i,j
无标签
grayACache a b c d e f g h i j
nullTagCache a b c d e f g h i j
标签路由,按节点类型缓存
Directory
[a,b,c,d,e,f]
VivoTagRouter
机房A
a,b,g
a,b,c
c,i,j
d,e
Cache
loc1Cache a b c d e f g h i j
loc2Cache a b c d e f g h i j
f
机房B
机房C
就近路由,按机房类型缓存
a,b
NearestRouter
i,j
完成路由筛选从O(N)到O(1)的挑战!
15. 路由优化实践---2:引入位图缓存
Directory
Directory
[a,b,c,d,e,f]
lastestInvokerList
epochStamp
Cache1
a
b
c
d
e
f
g
h
lastRouter
i
epochStamp
Router1
保证
强一致性
X
Cache2
a
b
c
d
e
f
g
lastInvokerList
epochStamp
curRouter
h
epoch
是否一致
epochStamp
Router2
否
实时计算
X
直接进行位与运算
curInvokerList
Cache3
a
b
c
d
e
f
epochStamp
Router3
一次RPC过程中的缓存视图一致性考验
nextRouter
epochStamp
缓存单元引入epoch机制
是
16. 路由优化实践
2:引入位图缓存
notify
Registry
ConfigCenter
notify
invokerBitListOld
epochStamp1
refresh
invoke
newInvokerListCache
oldInvokerListCache
oldInvokerListCache
invokerBitListNew
epochStamp2
epochStamp2 epochStamp1 epochStamp1
TagRouter VivoTagRouter NearestRouter
otherRouter
Directory
RouterChain
updateCahceWithEpoch
主动缓存更新策略
17. 路由优化总结
价值说明
优化效果
优化前TPS
路由O(1)级筛选,显著节约算力资源
优化后CPU使用率
4000
3500
3000
2500
2000
1500
1000
500
0
100
80
60
40
20
0
100*p
支持海量集群无限水平扩展
优化前CPU使用率
支持流量本机房闭环及降级,增强系统容灾与可用性
优化后TPS
500*p
参数指标
1000*p
横轴:提供方规模
左侧纵轴:消费方TPS
Registry
2000*p
5000*p
右侧纵轴:CPU利用率
NodeGroup1
notify
Directory
InvokerBitList
epoch
TagRouter
VivoTagRouter
NearestRouter
BitCache BitCache BitCache
epoch epoch epoch
ConditionRouter
ScriptRouter
LoadBalance
NodeGroup3
……
RouterChain
notify
NodeGroup2
NodeGroupN
Cluster
18. 目录
Part 01 第一部分|Dubbo在vivo的演进历程
Part 02 第二部分|Dubbo路由扩展及优化
Part 03 第三部分|Dubbo负载均衡扩展及优化
Part 04 第四部分|技术成果与未来展望
CONTENTS
19. Dubbo负载均衡优化背景介绍
在vivo互联网业务高速发展中,持续引入了不同年份、不同供应商的服务器,
考虑摩尔定律因素,这些不同年份、不同供应商的机器存在算力差异。
因此出现宿主机上部署的业务机器存在表现出不同CPU算力的现象(Dubbo
默认负载均衡为随机策略,每个实例承载流量相同而由于性能差异导致其负
载表现不一致,实例间流量高峰期CPU利用率差异可到达40%)。
请求数监控采集
Dubbo内置负载均衡策略
加权随机 加权轮询 最小活跃优先
最短响应优先 一致性哈希 自适应
CPU利用率采集
20. 社区讨论版自适应负载均衡技术方案
resp
CPU
cpuload rt timeout
weight multiple lastLatency
inflight load ewma
consumer
P1
minLoad
RouterChain
P2
(ipx, ipy)
P2C
P3
provider
AdaptiveLoadBalance
caculateLoad
AdaptiveMetric
load1
load2
load3
CPU1
LoadCache
CPU3
CPUMetric
AdaptiveMetric
消费方负载计算
CPU2
profile
负载均衡使用P2C
提供方CPU采集
21. 社区讨论版自适应负载均衡压测结果
压测结果对比
优化目标
CPU监控:
高效自适应调节
在无需人工干预的前提下,实现
流量自动、平稳地分配。
流量监控:
高可用与节点状态感知
增强负载均衡器对异常节点(如不
可用、预热中)的识别能力,保障
服务提供方整体可用性。
使用默认随机负载均衡策略
社区讨论版自适应负载均衡策略
22. 社区讨论版波动原因分析
caculateLoad
consumer
resp
CPU
p1
load1
RouterChain
minLoad
(ipx, ipy)
load2
p1
……
p2
p2
负载更新
provider
CPU1
p1
P2C
AdaptiveLoadBalance
LoadCache
p1
p2
负载更新
provider
p2
负载更新
provider
CPU2
CPUMetric
AdaptiveMetric
profile
01. 优化P2C流量分配机制
应避免提供方节点在短期内被集中访问,为P2C新增分发策略
02. 增强指标平滑更新能力
提供方运行过程中出现短期波动属于正常现象,算法应平滑
更新指标,抑制短期抖动影响
对称的,定期的规律震荡
负载更新
provider
23. vivo版自适应负载均衡优化
resp
CPU
consumer
P2C使用概率策略
p1
weight1/(weight1+weight2)
load2/(load1+load2)
minLoad(ipx,ipy)
RouterChain
p2
p3
load1/(load1+load2)
weight2/(weight1+weight2)
P2C
AdaptiveLoadBalance
caculateLoad
等待下一次
时间窗口
load1
load2
weight2
WeightCache
LoadCache
AdaptiveMetric
weight1
weight3
load3
计算集群平均负载
根据当前实例负载
与集群平均负载偏离度,调整一次权重
provider
avg(load)
CPU1
CPU2
CPU3
CPUMetric
profile
WeightAdjust
负载计算与流量调度分离
01. 提供方CPU采集单元
02. 消费负载计算与存储单元
03. 独立权重计算单元
04. 基于概率的P2C策略
24. vivo自适应负载均衡压测效果展示
CPU利用率采集
算法性能提升对比(相对随机策略)
社区讨论版
110
vAdaptive
101.5
100
请求数监控采集
80
60
45.9
40
35.5
30.2
23.7
22.5
20
10.2
4.0
0
随机策略
社区讨论版策略
中间件团队优化后的自适应策略
TPS
avg(RT)
P95
P99
25. vivo自适应负载均衡生产环境使用效果
提升服务质量
提升服务容量
• 有效抑制P99长尾 • 有效提升集群算力利用率
• 高峰期请求失败率下降超50% • 集群吞吐提升约15%
显著降本
•
节省万核CPU算力,节省百万级
机器采购成本
优化运维人力投入
•
•
自动收敛集群CPU利用率
大幅降低利用率告警频次,从而
大幅减少人工干预
26. 目录
Part 01 第一部分|Dubbo在vivo的演进历程
Part 02 第二部分|Dubbo路由扩展及优化
Part 03 第三部分|Dubbo负载均衡扩展及优化
Part 04 第四部分|技术成果与未来展望
CONTENTS
27. 技术成果
路由扩展与优化
负载均衡扩展与优化
痛点问题
大量的遍历操作,在消费方
侧造成CPU算力浪费
痛点问题
跨机房调用产生的
服务质量问题
底层基础设施差异导致上层静态负载
均衡策略无法最大利用算力资源
优化措施
就近
路由
路由位图
缓存
服务表现受
P99拖累
优化措施
分组
路由
Epoch
管理
负载
采集单元
负载
计算单元
权重
调节单元
P2C
决策
+100% +27% +15% +50% 百万级
TPS提升 利用率节约 提升集群容量 降低RPC失败率 节省算力成本
28. 未来展望
推进基线版本向社区对齐 建设统一微服务治理平台
更高效通信协议、更云原生理念,拥抱开源 语言无关,治理能力统一,服务模型统一
Triple协议
应用级注册
agent
统一治理模型
高性能
Dubbo 3.*
服务观测
SDK
流量监控
流量治理
统一微服务治理平台
proxy
服务容错
权限管控
29. 谢谢!Q&A