降级预案在同程艺龙的工程实践

> 码农文稿

降级预案在同程艺龙的工程实践

1. 降级预案在同程艺⻰龙的⼯工程实践 演讲者 / 王俊翔 同程艺龙
2. ⾃自我介绍
3. 搜索故障 缺乏熔断设计 微信⼩小程序 ⼤大量量请求超时 API⽹网关 搜索引擎 统⼀一资源⽹网关 ⼤大量量超时 资源1 资源2 资源3 资源4 ……
4. 交易易故障 缺乏降级设计 第三⽅方⽀支付 ⽀支付时限任务 ⽀支付回写 ⽀支付中⼼心 ⽀支付通知 交易易中台 ⽀支付超时 消息队列列 订单取消 出票处理理 队列列故障 已⽀支付订单被取消
5. 稳定性之路路到底有多远 如何设计⾯面向容错的系统,如何提升系统的可⽤用性
6. 强弱依赖 什什么是强弱依赖,如何确定强弱依赖 • ⽤用户是否强烈烈感知 • 核⼼心业务是否有损 serviceA 熔断、限流 ⽤用户请求 service 弱依赖 serviceB 强依赖 降级 serviceC- degrade 备选服务 serviceC 强依赖 • 弱依赖 - 熔断限流,有损服务 • 强依赖 - 备选服务,降级实现
7. 业界解决⽅方案 - HYSTRIX Netflix开源的一款容错框架,支持多种降级熔断技术 资源隔离 断路路器器 降级操作 请求缓存 请求合并
8. 实践过程中遇到的问题 • 业务改造成本⾼高,代码耦合,维护成本增⾼高 • 固化策略略,需线下修改代码,测试,发布,线上应急策略略响应不不 友好 • ⽆无法⽀支撑多系统的复合指标计算,业务降级⽀支持不不友好 • ⼤大量量应⽤用各⾃自实现降级熔断,代码散落在各应⽤用,没有统⼀一的管 理理和治理理。久⽽而久之,⽆无⼈人知道系统内有多少降级点,降级是如 何实现的 • 缺乏UI、没有灵活的参数、策略略配置,没有预案制定管理理能⼒力力
9. 业务保障平台建设之路路
10. 业务保障平台建设之路路 服务管理理 • 降级服务统⼀一注册管理理,通过降 策略略管理理 • 降级策略略集中管理理,通过参数 预案制定 线上演练 • 依据服务重要程度,从全局制定 • 发现潜在故障,多维度验证预案 级服务质量量数据从整体反映各应 化、配置化、脚本化⽅方式实现线 分级预案,对降级点进⾏行行预案编 有效性,评估系统可靠性,提供 ⽤用的降级点和可⽤用性保障措施 上策略略的灵活调整 排,并跟踪监控降级链路路的执⾏行行 降级策略略、参数调整的优化依据
11. 整体架构 数据采集、计算、存储 KAFKA ⽇日志数据 脚本引擎 ETL 熔断降级计算(Flink) ⽇日志中⼼心 熔断降级接⼊入 应⽤用JVM进程 Attach Application Application Application SDK 故障动态注⼊入 Agent 熔断 流控 降级 隔离 降级⽇日志(ES) 查 询 服 务 业务异常数据快照(ES) 熔断降级通知 数据采集 故障注⼊入 指标(Redis) 指标明细(ES) 指标计算(Flink) 指标(HBase) Application Application Application SDK Application Application Application SDK 服务降级注册 降级熔断通知 实时策略略推送 降级控制中⼼心 TurboMQ 熔断降级监听 ETCD ETCD ETCD ETCD 服务注册监听 控制 中⼼心 元数据 元数据存储 降级服务管理理 故障代码注⼊入 业务保障管理理后台 应⽤用管理理 策略略管理理 流控管理理 指标管理理 预案管理理 脚本开发 故障演练 数据⼤大盘 ETCD管理理 监控告警 指标聚合查询
12. 降级服务注册设计 • 使⽤用ETCD实现注册中⼼心 serviceA • 简单 - Go语⾔言编写部署维护简单,定义良好的API serviceB register proxy etcd watch center service metadata degrade strategy serviceC • 安全 - SSL认证机制 • 快速 - ⽀支持上万次写⼊入操作 • 可信 - Raft算法保证强⼀一致性,Proxy反向代理理模式⽀支持 mysql sharding • 服务数据存储 • 应⽤用、服务元数据、状态数据,etcd、mysql双份存储 admin • 后台实时监控应⽤用、服务,实时变更更降级策略略
13. 服务质量量数据采集 通过本地⽇日志⽂文件,实时采集降级服务质量量数据 • 单⼯工直连数据通道 应⽤用数据采集 应⽤用数据 • ⻓长链接,数据流⽅方式实时发送 ⽅方法数据 执⾏行行结果 执⾏行行耗时 异常数据 JVM线程 JVM内存 GC数据 业务数据 SDK数据 ⾃自定义数据 数据采集 Proxy • 本地多队列列轮循,数据缓冲,合并异步发送 … ⽇日志 ⽂文件 数据通道(⻓长链接单通道) 采集 Agen t ⽇日志 采集 ⽂文件 Agen t 系统数据采集 容器器数据 CPU数据 内存数据 磁盘数据 ⽹网络数据 … 业务数据采集 ⽇日志中⼼心 KAFKA 数据处理理
14. 指标如何计算处理理 数据平台 产品化 指标脚本开发 数据采集 开发 告警策略略 指标配置 指标查询 流处理理集群(Flink) KAFKA ⾃自定义指标 复合指标 系统指标 业务指标 指标脚本计算 指标规则计算 数据服务 落地存储 HBase 数据 Redis 存储 熔断 降级消息 降级 条件 计算 控制中⼼心 实时告警 ES ETL 规则配置 指标脚本 ⽇日志解析规则 规则表达式 降级处理理 降级服务 ETCD 开发 实时告警
15. 复合指标计算如何处理理 指标池 AppA ServiceA ServiceB 指标1 指标2 指标1 指标2 指标3 指标N 指标3 指标N AppB ServiceD ServiceC 指标1 指标2 指标1 指标2 指标3 指标N 指标3 指标N 指标引⽤用 (AppA.ServiceA.指标1 - AppB.ServiceD.指标2) / AppB.ServiceC.指标1 表达式计算 MVEL 表达式引擎
16. 降级服务管理理 • 降级服务管理理 • 应⽤用、服务、策略略产品化、数据化 • 应⽤用、服务指标实时监控,健康状态评估 • 实时监测服务降级执⾏行行状态,降级发⽣生点数据 快照及时回溯 • 降级策略略管理理 • 多种策略略⽅方案:失效备援、服务熔断、资源隔 离、延迟处理理 • 策略略灵活调整,实时监控策略略运⾏行行状态
17. 降级代码管理理 • 线上代码开发、测试、发布 • 降级代码统⼀一管理理 • 脚本代码动态编译,对象管理理 业务保障平台应 降级⽅方法使⽤用 策略略配置 线下开发 降级代码 应⽤用 / 服务 SDK 线上开发 测试 发布 WEB IDE 脚本 线下代码管理理 Git
18. 降级服务如何⾃自动探测恢复 指标计算 正常流程 • 降级保护期窗⼝口内,不不进⾏行行恢复试探 降级触发/恢复 未降级 恢复探测 • 流量量分配的⽅方式实施恢复探测,百分⽐比、总量量 探测流量量分配 ⽅方法调⽤用 ⽅方法代理理 降级 • 实时计算探测流量量指标,指标恢复关闭降级 已降级 关闭 百分⽐比策略略 探测 开启 总量量策略略 ⾃自定义策略略 开启 窗⼝口期 降级流程 降级⽅方法 熔断 窗⼝口期 保护期窗⼝口 (10min) 窗⼝口期外 窗⼝口期外 探测期窗⼝口 (5min)
19. 降级预案 开发:不不清楚这样的业务 场景有哪些次要服务需要 降级 运营:明天要做活动, 希望降级不不重要的服务 运营 开发 • 预案分级 从全局建⽴立服务重要程度评估模型 • 蓝⾊色预警 - ⼩小规模⾮非核⼼心服务降级 • ⻩黄⾊色预警 - ⼤大规模⾮非核⼼心服务降级 • 红⾊色预警 - 所有⾮非核⼼心服务降级 • 预案编排 • 根据链路路关系、同等级优先级进⾏行行预案编排, 形成降级执⾏行行链路路 • 线上实时预案测试、演练,演练数据回溯
20. 业务不不断迭代,持续引⼊入新依赖,系统是否稳定可靠? 预案是否依然持续有效? 如何才能持续保障系统的⾼高可⽤用性?
21. 故障演练 常态化的故障演练对系统进⾏行行反复验证 • 对预案进⾏行行有效性、合理理性验证 • 通过破坏性测试,发现系统的潜在故障,及时修正,并做好降级预防措施 • 参数修正,及时调整流控、降级策略略,优化告警、超时参数设置 • 模拟线上故障,进⾏行行故障复现,验证故障后续的处理理措施是否⾏行行之有效 • 以战养兵,历练团队,让⼯工程师有更更多机会积累经验,提升应对故障的能⼒力力
22. 系统设计 Application JVM 故障画像 Attach Method Event Core • 应⽤用故障:模拟应⽤用进程内故障 • 中间件故障:通过中间件客户端,模拟中间件故障 • 系统故障:通过⼯工具、脚本模拟⽹网络丢包、延时,磁盘不不⾜足故障 Latency Model Agent Exception Model • 延时模型、超时模型、异常模型、⾃自定义代码模型 • 基于模型实现应⽤用故障、中间件故障模拟,实时对应⽤用程序进⾏行行 字节码插桩、拆桩 简洁易易操作后台 • 可视化UI,参数、配置下发,快速实现故障注⼊入 MQ Module Module Timeout Model 故障抽象,提炼统⼀一模型 Servlet Agent Custom Code Listener Model DSF Redis Module Module MySQL Burn Module CPU ASM / Instrumentation Agent 控制指令、参数下发、故障注⼊入 • 丰富的故障模块管理理功能 故障演练 管理理后台 MGT API Jetty
23. 故障注⼊入流程 1. 发送Agent启动指令 Agent Listener 故障演练 管理理后台 Agent 2. Attach⽬目标JVM进程 6. Redis超时模拟 Redis vm.attach(pid) 3. 加载Agent vm.loadAgent(agent) 应⽤用程序 6. MySQL延时模拟 MySQL 核⼼心模块初始化 4. 参数下发、故障注⼊入、控制指令 Http通信 5. ⽬目标⽅方法字节码增强 Core.jar Jetty Instrumentation & ASM 6. 服务异常模拟 ⼆二⽅方服务
24. ⼩小结 • 从⽤用户感知、核⼼心业务影响⽅方⾯面,判断系统链路路中的强弱依赖 • 通过对服务统⼀一管理理,从全局刻画系统链路路熔断降级点,结合策略略和预案,通过持续不不断的治 理理保障系统的可⽤用性 • 通过反复的故障演练,发现系统中的薄弱点,并进⾏行行有效的预防 • 配合降级预案,让系统的可靠性更更易易验证,让演练更更加常态化 • 历练团队、积累经验,促进⼯工程师的进步,提⾼高应对故障的能⼒力力
25. ⾃自我介绍
26.

联系我 - 工具首页
Copyright © 2011-2019 iteam. All Rights Reserved. Current version is 2.52.0.
浙ICP备14020137号 $访客地图$