携程门票 亿级流量挑战下的高可用架构设计与实践 目录 01.系统概述 熟知的大流量场景 02.营销活动的特点 背景|设计原则|目标及范围 03.交易系统在大流量下的架构应对策略 稳|准|快|海外访问性能优化 04.如何让高可用具备“可持续性”? 架构健康度治理|稳定性保障体系 05.总结 参与过的大流量场景 秒杀/活动 抢菜 印象与感受 双11 疫情抢菜 定时开售 卡顿/提示太火爆/排队 抢不到/抢到被退 节假日抢票门票/演唱会 秒杀/活动 抢菜 业务场景特征 双11 大流量/弱一致性 疫情抢菜 大流量/弱一致性 大流量/高并发 准时开售/抢热点 保障履约 节假日抢票 大流量/强一致性/简单限购 门票/演唱会 大流量/强一致性/复杂限购 涵盖:订前+订后 大型营销活动案例 2020 8.8-9.1 惠游湖北·0元票 北京环球影城开业 IU(李知恩)演唱会·全球售卖 2024 4.10 2021 9.14 瞬时流量超过1500万 超300万人成功预约 携程独家,挑战最大,打破历史峰值 友商:页面卡顿,订单无法确认, 大量退单(PR事件) 与友商比,携程最稳且销量最高 携程:预订丝滑(10秒售罄) 韩国女演员全球人气排行TOP2 历史峰值最高 营销活动&节假日与日常峰值流量的倍数 2020湖北0元票2021年9月14日北京环球影城开业2023年五一2023年09月15日武汉动物园开业2023年十一2024年4月10日IU演唱会CT同售 73 45 35 5 5 5 2020湖北0元票 2021年9月14日北京环球影城开业 2023年五一 2023年09月15日武汉动物园开业 2023年十一 2024年4月10日IU演唱会CT同售 峰值QPS达到数百万 大流量活动给系统带来的问题 产品视角 首页/营销页 详情页 填写页 预订 支付 订单详情页 确认中 取消订单 用户反馈 页面打开慢、卡顿、宕机 已售罄,实际商品未售完 预订成功,无法确认,被退款 预订成功,订单确认太慢 打开慢、卡顿、宕机 付款后不能确认、退款订单确认太慢 产品视角 订单详情页 确认中 取消订单 首页/营销页 详情页 填写页 预订 支付 1 打开慢、卡顿、宕机 2 3 Redis、DB超负载 不稳定: 不一致:库存超卖/少卖 供应商系统不稳定 付款后不能确认、退款 研海外Trip.com访问性能差 发视角 交易系统在大流量下的架构应对策略 稳 准 快 系统稳定保障售卖 数据一致保障履约 预订顺畅体验丝滑 产品视角 首页/营销页 详情页 填写页 预订 支付 订单详情页 确认中 取消订单 1打开慢、卡顿、宕机 研发视 付款后不能确认、退款 2 3 海外Trip.com访问性能差 角Redis、DB超负载 不稳定:不一致: 供应商系统不稳定 库存超卖/少卖 L网oa络d异ing常… 请重试 原因分析 ▪Redis超负载、缓存热点 ▪DB超负载 ▪供应商系统不稳定 页面打开慢、卡顿 1Master:2Slave cluster 1Master:4Slave cluster 技术策略 ▪Redis扩容 ▪DB隔离/服务隔离 水平扩容 常规手段:水平扩容,让流量分摊到更多实例 扩容可以降低大多数实例的CPU水位 但不能解决热点问题 例如:热门商品秒杀时 Redis各实例CPUUtil Server cluster Service RedisCache QPS CPUUtil 20000 40% 40000 80% Redis 热点效应 危害:实例负载不均衡,拖垮服务器 缓存热Key影响系统稳定性 技术策略:多级缓存 Server Service 1、主动配置 2、高频访问 ReferenceQueue<K>key引用队列 ReferenceQueue<V>value引用队列 ConcurrentLinkedQueue<ReferenceEntry<K,V>>最近读队列 WriteQueue<ReferenceEntry<K,V>>最近写队列 有限LRU队列 AccessQueue<ReferenceEntry<K,V>>最近访问队列(LRU队列) Segment<K,V>[] LocalCache数据结构 Redis LocalCache L2RedisCache FindHotKey L1LocalCache 单位时间内存在的值 例如:同一个Key,1秒内单机访问10次 总结: 1.自动发现Hotkeys并加入到本地缓存 2.指定的Key加入到本地缓存 request response cachestrategies TTL、size counter... ifnotfoundinlocalcache Readlocalcache 缓存组件 -按场景、TTL、容量 -自动发现 Readfromredis RPC service1..n Redis -埋点、监控 举例(不同的Key效果不一样) 开启多级缓存 技术策略:多级缓存 耗时:平均降低约25% Redis访问量LocalCache访问量 以10KB为基准下降的百分比以10KB为基准慢的倍数 Applications requestkey3 timeout Cache key1:value1(1KB)key2:value2(2KB)key3:value3(5MB) 危害 ▪阻塞请求 ▪内存占用大 ▪阻塞网络 2.50 2.00 1.50 1.00 0.50 AVG 15.7倍 18000 16000 14000 12000 10000 8000 6000 4000 2000 QPS 37% 61% 76% 80% 88% 94% 7.3倍 4倍 3倍 1.5倍0.6倍 1… 5… 1… 2… 3… 5… 1M 1… 5… 1… 2… 3… 5… 1M 0.000 注:多场景压测结果显示,200KB+较10KB以内的性能慢3倍 Applications requestkey3 timeout Cache key1:value1(1KB)key2:value2(2KB)key3:value3(5MB) 危害技术策略:长期治理 ▪阻塞请求 ▪内存占用大 ▪阻塞网络 ▪拆分大Key ▪压缩value 优化后:Redis响应耗时明显提升 瞬间大流量导致DB线程指标异常接口(RT)变慢 读写DB的服务异常 商品库的波动导致全业务不可用 ProductManagement requestkey3 responsetimeout VBooking Cache key1 delete ProductService key3 DB (master) sync DB (slave) binlog Consumer /Worker binlogparser Application 商品变更导致缓存失效 -删除缓存 -消息量太大 Id Active 3 F Id Active 3 F 商品变更导致缓存失效,大量请求打到DB Application ProductManagement requestkey3 response VBooking Cache key1 set Updatelogic ProductService key3 DB (master) DB (slave) binlog Consumer /Worker Aggregator binlogparser 商品变更导致缓存失效 -删除缓存 -消息量太大 ->缓存更新 ->消息聚合 Id Active 3 F Id Active 3 F 商品变更新数据覆盖更新 商品后台 预订 提交订单 维护商品 商品选售 订单 确认订单 其他渠道上货 直连系统(商品) 直连系统(订单) 其他确认方式 供应商品 处理订单 供应商系统 供应商系统 供应商系统订单问题: ▪限流 ▪系统不稳定 订单无法快速提交到供应商系统 供应售卖履约 技术策略:削峰填谷/缓冲池、禁售策略 100单/分钟 30 提交订单 直连系统(订单) 直连 供应商系统 禁售策略: ▪ ▪ 根据健康度自动禁售 定期重试 100单/分钟 30 bt:basetime n:惩罚等级,连续第n次下线,首次下线n=1f(p):exceptionRate,30分钟内异常率 直连 匀速提交 缓冲池 供应商系统 限流器 直连系统(订单) 提交订单 禁售熔断 营销场景多为提前售卖,不是立即使用 技术策略:削峰填谷/缓冲池 不影响下单吞吐量 流量控制 减少不必要的资源投入 确保活动的流量水位在安全线内 活动+常规流量 活动曝光选售预订提交订单 首页/营销页 详情页 填写页 预订 支付 流量大小高低 系统承载能力大 小 例如:10万人购买5000张 如何票限流保障各系统稳定运行? 技术方案:SOA限流VS自定义限流(按活动商品限流) 100%能力承载 所有业务 70%能力承载 非秒杀业务 30%能力承载 秒杀业务 SOA限流自定义限流 SOA限流会影响所有业务 限流只影响活动商品 服务器/开发资源投入可控 技术策略:自定义限流(按活动商品限流) 1s限流1000QPS 100ms限制100QPS 10个100ms滑动窗口,每个滑动窗口限制100QPS 限流更精准,防止高并发场景对下游带来压力 所有景点:请求被限制/系统超负载 突增流量 系统最大负载(未提前扩容情况下) 请求量 突增流量:进排队页面/提示活动限流 单景点/资源限流阈值 请求量 300K 250K 200K 150K 请求量 访问时间 其他景点:正常访问 100K 50K 09:59 10:00 10:01 访问时间 访问时间 商品级限流,超负载也不影响整体的可用性,支持热点商品自动限流 准 数据准确保障履约 产品视角 首页/营销页 详情页 填写页 预订 支付 订单详情页 确认中 取消订单 1打开慢、卡顿、宕机 研发视角 付款后不能确认、退款 2 3 海外Trip.com访问性能差 不稳定: Redis、DB超负载 供应商系统不稳定 不一致: 库存超卖/少卖 下单 限购检查 提交限购 扣库存 创单 取消限购 问题: ▪性能瓶颈–MySQL热点行扣减库存(行级锁) 下单 取消订单 Service Service InventoryService 1 Redis 2 1 Service 2 3 扣减库存 否 4 3 是否成功 5 否 4 是 DB扣失败,重试N次 是否成功 无扣库存记录,重试N次 4 Redis 扣库存 2 Storage 还库存 3 inventoryupdate 记录明细日志inventory_detailinsert 事务 InventoryService 1 锁定后台 管理后台 2初始化库存 Service Redis InventoryService 技术策略:扣减库存异步化,消除DB行级锁 1 初始化 扣减库存服务V2.0 扣减库存异步化,消除行级锁性能瓶颈 轻松支持数十万/分钟下单(非极限) 快 预订丝滑体验丝滑 产品视角 首页/营销页 详情页 填写页 预订 支付 订单详情页 确认中 取消订单 1打开慢、卡顿、宕机 研发视角 付款后不能确认,退款海外Trip.com访问性能差 2 3 不稳定: Redis、DB超负载 供应商系统不稳定 不一致: 库存超卖/少卖 SHA-Region IDC1 IDC2 DB DB Service Service SLB SLB Gateway Gateway HK-NAP 延迟:80ms NAP 专线 单次链路影响小, 多次跨洋回源请求对性