作者简介
HongLiang,携程技术专家,专注系统性能、稳定性、承载能力和交易质量,在技术架构演进、高并发等领域有丰富的实践经验。
图1 微服务架构关注点
微服务是SOA的实现方式 微服务是去掉ESB后的SOA -
微服务是一种和SOA相似但是两种不同的架构设计风格
三、微服务的陷阱
3.1 重复调用
3.2 循环依赖
3.3 链路太长
四、微服务治理
1)层级太深:
透传字段要改多个应用,需求迭代效率低
-
每层网络延时、序列化和反序列化都有性能损失,导致终端体验差
2)重复缓存:同一个DB不同应用重复构建缓存
3)流量大:
重复调用,直接调用或者间接调用,末尾服务压力大
-
离线任务峰值波动太大
4)未隔离:核心、非核心流量未隔离
5)效能低:人均应用多/资源使用率低
1)稳定:故障隔离,提升系统稳定性
2)交付:独立迭代、独立扩展、快速交付
3)重用:相同功能复用
1)避免跨团队维护一套代码。
2)服务粒度要与团队规模匹配,人均应用数在3个以内。
根据历史经验,一个人在超过3个应用之间来回切换开发,开发效率会降低,日常处理告警繁琐,业务和性能优化也无法聚焦。
3)应用分层:上一层可以依赖任意下一层级(不可反向依赖)。
4)层级深度:垂直域/小组内,应用层级控制在5层以内。
这里的“5层”是我们根据实际业务实际情况来定的。一个垂直域/小组内应用层级超过5层,一个需求上下游依赖太多,开发效率会降低。
1)业务领域拆分:单一职责,业务建模(对人员要求高)
2)数据存储:独立的数据读写API
3)复用性:功能复用(比如基础数据提供能力,提供给不同小组使用)
可靠性
-
核心与非核心隔离
4)稳定规则与易变动规则隔离
5)快速失败:设置合理的熔断规则
6)异步通信:将与此次请求无关的操作/调用异步化
1)去除循环依赖
问题:服务B和服务C 循环依赖
策略
应用分层与定位:步划分应用层级(分层工具有传统三层架构、泛领域分层等),将应用定位划分到不同的层级。
-
确认依赖关系:每一层内如果有多个应用,确认上下游关系。这个根据业务场景来,根据父子关系,包含关系,依赖关系,确认每一层内的依赖关系和应用职责。
图11 循环依赖治理
2)缩短调用链路
问题:服务BCD 链路太长(垂直域/小组内)
策略
领域细分:将粗粒度的应用按照业务领域垂直划分,不同层级负责不同的职责,让系统更独立。
-
减少透传:每个层级职责清晰,减少不必要的透传,让开发效率更高。
图12 缩短调用链路
3)复用性
问题:服务BCD 对相同数据重复缓存(存在一致性问题)
策略
下沉基础服务,提供基础数据:将相同的功能下沉为基础服务,例如:基础数据服务提供缓存,翻译等功能。避免不同的使用方重复缓存,重复接入翻译。
图13 重复功能下沉
效果:下沉基础数据服务,统一缓存,翻译等功能,提供给不同的开发组使用。
4)流量治理
a) 重复调用
问题:一次请求,服务C同一个接口被重复调用
策略
功能内聚:将同一个功能对下游的依赖放到同一个服务内调用。由于系统自身迭代导致的不合理调用,可以按照上述方法优化。如果为了解耦将功能拆开,可以根据实际情况评估影响和收益。
图14 功能内聚合并重复调用
效果:功能内聚,多次调用合并为一次调用。
b) 降低调用量
合并服务B中同一领域功能:将相同的功能合并到一个接口,减少调用量。 一个接口提供模块参数,按需调用:
支持按需使用,对不同业务场景非必须的功能,提供模块参数,按需传参。 -
对于独立的前端页面接口,对外透明,内部封装对应场景需要的模块参数,例如前端首屏请求。
人均应用过多,开发效率降低 -
CPU使用率6%以下应用数占比超过50% 且总核数占比超过30%
短期:缩容,将单边服务器数缩容到SRE标准小配置。 长期:合并拆分过细的应用,参考历史、现状和将来的规划,将拆分过细、CPU使用率长期小于6%的应用做合并。
五、实施效果
1)循环依赖(应用分层,解除应用间循环依赖)
去掉65条循环依赖链路,消除雪崩的风险
超时类告警降低99%
-
排障效率提升至分钟级别
2)链路长(减少应用层级):调用链深度缩短 40%
3)复用性(下沉基础数据服务,减少重复功能)
新增基础数据服务,缓存统一,解决一致性问题
-
缓存容量减少60%
4)流量治理(降低水位线)
重复调用:功能内聚,去除重复调用
调用量大:合并小接口、消除调用峰值;离线任务削峰填谷,降低峰值调用量
-
核心应用调用量减少73%,核心系统峰值降低50%
5)开发效率(解耦&减少中间层)
水平拆分独立功能,减少耦合,独立开发
-
垂直领域减少3层,开发效率提升
6)查询引擎性能提升65%,QPS从8w提升至24w
减少了系统不稳定导致的服务变慢
-
领域划分,垂直优化系统,专注用户端到底层的优化
7)人均应用:人均应用数控制在2个以内
8)资源使用率(应用合并,提升CPU使用率)
40+个应用CPU使用率(加权平均)从18%提升至32%
-
治理前后查询引擎链路对比:
图21 门票活动查询引擎微服务治理前后对比
六、总结