游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

1分钟售票8万张!门票抢票背后的技术思考

  一、背景
  去年疫情后,为了加速启动旅游市场,湖北在全域范围内开展与爱同行惠游湖北活动全省所有A级旅游景区向全国游客免门票,敞开怀抱欢迎全国人民。本文将介绍在这一活动期间,线上预约抢票系统遇到的核心问题,系统的改造过程以及实施的一些经验。这是高并发、高可用场景下,提升系统稳定性的一次实战优化,希望能给面对同样问题的同学提供一些借鉴思路。
  活动页面二、风险与挑战
  在活动初期,系统面临以下四类风险:流量大,入口流量瞬间增长100倍,远超系统承载能力;高并发下,服务稳定性降低;限购错误;热门门票、热门出行日期扣库存热点;
  高并发下系统的挑战
  下面我们一起来看下每个问题的影响和解决策略。
  2。1入口流量增长100倍
  问题
  活动开始时入口流量增长100倍,当前系统无法通过水平扩展解决问题。
  请求量监控
  目标
  提升入口应用吞吐能力,降低下游调用量。
  策略
  减少依赖
  1)去除0元票场景不需要的依赖。例如:优惠、立减;
  2)合并重复的IO(SOARedisDB),减少一次请求中相同数据的重复访问。
  上下文传递对象减少重复IO
  提升缓存命中率
  这里说的是接口级缓存,数据源依赖的是下游接口,如下图所示:
  服务层接口级缓存固定过期
  接口级缓存一般使用固定过期懒加载方式来缓存下游接口返回对象或者自定义的DO对象。当一个请求进来,先从缓存中取数据,若命中缓存则返回数据,若没命中则从下游获取数据重新构建缓存,由于是接口级的缓存,一般过期时间设置都比较短,流程如下图:
  固定过期懒加载缓存
  这种缓存方案存在击穿和穿透的风险,在高并发场景下缓存击穿和缓存穿透问题会被放大,下面会分别介绍一下这几类常见问题在系统中是如何解决的。
  1)缓存击穿
  描述:缓存击穿是指数据库中有,缓存中没有。例如:某个key访问量非常高,属于集中式高并发访问,当这个key在失效的瞬间,大量的请求就击穿了缓存,直接请求到下游(接口数据库),造成下游压力过大。
  解决方案:对缓存增加被动刷新机制,在缓存实体对象中增加上一次刷新时间,请求进来后从缓存获取数据返回,后续判断缓存是否满刷新条件,若满足则异步获取数据重新构建缓存,若不满足,本次不更新缓存。通过用户请求异步刷新的方式,续租过期时间,避免缓存固定过期。
  例如:商品描述信息,以前缓存过期时间为5min,现在缓存过期时间为24H,被动刷新时间为1min,用户每次请求都返回上一次的缓存,但每1min都会异步构建一次缓存。
  2)缓存穿透
  描述:缓存穿透是指数据库和缓存中都没有的数据,当用户不断发起请求,比如获取id不存在的数据,导致缓存无法命中,造成下游压力过大。
  解决方案:当缓存未命中,在下游也没有取到数据时,缓存实体内容为空对象,缓存实体增加穿透状态标识,这类缓存过期时间设置比较短,默认30s过期,10s刷新,防止不存在的id反复访问下游,大部分场景穿透是少量的,但是有些场景刚好相反。例如:某一类规则配置,只有少量商品有,这种情况下我们对穿透类型的缓存过期时间和刷新时间设置同正常的过期和刷新时间一样,防止下游无数据一直频繁请求。
  3)异常降级
  当下游出现异常的时候,缓存更新策略如下:
  缓存更新:下游是非核心:超时异常写一个短暂的空缓存(例如:30s过期,10s刷新),防止下游超时,影响上游服务的稳定性。下游是核心:异常时不更新缓存,下次请求再更新,防止写入空缓存,阻断了核心流程。
  4)缓存模块化管理
  将缓存key按照数据源做分类,每一类key对应一个缓存模块名,每个缓存模块可以动态设置版本号、过期时间和刷新时间,并统一埋点与监控。模块化管理后,缓存过期时间粒度更为细致,通过分析缓存模块命中率监控,可以反推过期和刷新时间是否合理,最终通过动态调整缓存过期时间与刷新时间,让命中率达到最佳。
  缓存模块命中率可视化埋点
  我们将以上功能封装为了缓存组件,在使用的时只需要关心数据访问实现,既解决了使用缓存本身的一些共性问题,也降低了业务代码与缓存读写的耦合度。
  下图为优化前后缓存使用流程对比:
  缓存使用对比
  效果
  通过解决缓存穿透与击穿、异常降级、缓存模块化管理,最终缓存命中率提升到98以上,接口性能(RT)提升50以上,上下游调用量比例从1:3。9降低为1:1。3,下游接口调用量降低70。
  处理性能提升50
  2。2高并发下服务稳定性低
  问题
  在每天上午8:00抢票活动开始时,DB连接池被打满,线程波动大,商品服务超时。
  数据库线程波动
  思考DB连接池为什么会被打满?API为什么会超时?是DB不稳定影响了API,还是API流量过大影响了DB?
  问题分析
  1)DB连接池为什么会被打满?分析三类SQL日志。Insert语句过多场景:限购记录提交,将限购表单独拆库隔离后,商品API依然超时(排除)Update语句耗时过长场景:扣减库存热点引起(重点排查)Select高频查询场景:商品信息查询
  2)API为什么会超时?
  排查日志可以看到,8:00活动开始后,大量热门商品信息查询到DB与Select高频查询一致。
  3)是DB不稳定影响了API,还是API流量过大影响了DB?
  根据2初步判断是由于缓存击穿,导致大量流量穿透到DB。
  为什么缓存会被击穿?
  梳理系统架构后发现,由于8:00定时可售通过离线Job控制,8:00商品上线引发数据变更,数据变更导致缓存被刷新(先删后增),在缓存失效瞬间,服务端流量击穿到DB,导致服务端数据库连接池被打满,也就是上文所说的缓存击穿的现象。
  数据访问层表级缓存主动刷新
  如下图所示,商品信息变更后主动让缓存过期,用户访问时重新加载缓存:
  数据访问层缓存刷新架构(旧)消息变更删除缓存Key
  目标
  为了防止活动时缓存被删除导致缓存击穿,流量穿透到DB,采用了以下2种策略:
  1)避开活动时数据更新导致缓存失效
  我们将商品可售状态拆分商品可见、可售状态。可见状态:7:00提前上线对外可见,避开高峰;可售状态:逻辑判断定时售卖,既解决定时上线修改数据后,导致缓存被刷新的问题,也解决了Job上线后,商品可售状态延迟的问题。
  逻辑判断定时可售避开高峰缓存击穿
  2)调整缓存刷新策略
  原缓存刷新方案(先删后增)存在缓存击穿的风险,所以后面缓存刷新策略调整为覆盖更新,避免缓存失效导致缓存击穿。新缓存刷新架构,通过Canal监听MySQLbinlog发送的MQ消息,在消费端聚合后,重新构建缓存。
  数据访问层缓存刷新架构(新)消息变更重新构建缓存
  效果
  服务(RT)正常,QPS提升至21w。
  上面两类问题与具体业务无关,下面我们介绍一下两个业务痛点:如何防止恶意购买(限购)如何防止库存少买超买(扣库存)
  2。3限购
  什么是限购?
  限购就是限制购买,规定购买的数量,往往是一些特价和降价的产品,为了防止恶意抢购所采取的一种商业手段。
  限购规则(多达几十种组合)例如:
  1)同一出行日期同一景区每张身份证只能预订1张;
  2)7天内(预订日期)某地区只能预约3个景区且最多限购20份;
  3)活动期间,预约超过5次,没有去游玩noshow限购;
  问题
  扣库存失败,限购取消成功(实际数据不一致),再次预订被限购了。
  原因
  限购提交是Redis和DB双写操作,Redis是同步写,DB是线程池异步写,当请求量过大时,线程队列会出现积压,最终导致Redis写成功,DB延时写入。在提交限购记录成功,扣库存失败后,需要执行取消限购记录。
  如下图所示:
  限购检查提交限购取消限购
  在高并发的场景下,提交限购记录在线程池队列中出现积压,Redis写入成功后,DB并未写入完成,此时取消限购Redis删除成功,DB删除未查到记录,最终提交限购记录后被写入,再次预订时,又被限购。
  如下图:
  线程队列积压,先提交的提交限购请求晚于取消限购
  目标
  服务稳定,限购准确。
  策略
  确保取消限购操作RedisDB最终一致。
  由于提交限购记录可能会出现积压,取消限购时提交限购记录还未写入,导致取消限购时未能删除对应的提交记录。我们通过延迟消息补偿重试,确保取消限购操作(RedisDB)最终一致。在取消限购的时候,删除限购记录影响行数为0时,发送MQ延迟消息,在Consumer端消费消息,重试取消限购,并通过埋点与监控检测核心指标是否有异常。
  如下图所示:
  下单提交限购与取消限购
  效果
  限购准确,没有误拦截投诉。
  2。4扣减库存
  问题商品后台显示1w已售完,实际卖出5000,导致库存未售完。MySQL出现热点行级别锁,影响扣减性能。
  原因扣库存与库存明细SQL不在一个事务里面,大量扣减时容易出现部分失败的情况,导致库存记录和明细不一致的情况。热门景点热门出行日期被集中预订,导致MySQL出现扣减库存热点。
  目标
  库存扣减准确,提升处理能力。
  策略
  1)将扣减库存记录和扣减明细放在一个事务里面,保证数据一致性。
  DB事务扣减库存
  效果
  优点:数据一致。
  缺点:热点资源,热门日期,扣减库存行级锁时间变长,接口RT变长,处理能力下降。
  2)使用分布式缓存,在分布式缓存中预减库存,减少数据库访问。
  秒杀商品异步扣减,消除DB峰值,非秒杀走正常流程。
  商品上线的时候将库存写入Redis,在活动扣减库存时,使用incrby原子扣减成功后将扣减消息MQ发出,在Consumer端消费消息执行DB扣减库存,若下单失败,执行还库存操作,也是先操作Redis,再发MQ,在Consumer端,执行DB还库存,如果未查询到扣减记录(可能扣库存MQ有延迟),则延时重试,并通过埋点与监控检测核心指标是否有异常。
  异步扣减库存
  效果服务RT平稳,数据库IO平稳Redis扣减有热点迹象
  3)缓存热点分桶扣减库存
  当单个Key流量达到Redis单实例承载能力时,需要对单key做拆分,解决单实例热点问题。由于热点门票热门日期产生热点Key问题,观察监控后发现并不是特别严重,临时采用拆分Redis集群,减少单实例流量,缓解热点问题,所以缓存热点分桶扣减库存本次暂未实现,这里简单描述一下当时讨论的思路。
  如下图所示:
  缓存热点分桶扣减
  分桶分库存:
  秒杀开始前提前锁定库存修改,并执行分桶策略,按照库存Id取模分为N个桶,每个分桶对应缓存的Key为Key〔0N1〕,每个分桶保存m个库存初始化到Redis,秒杀时根据Hash(Uid)N路由到不同的桶进行扣减,解决所有流量访问单个Key对单个Redis实例造成压力。
  桶缩容:
  正常情况下,热门活动每个桶中的库存经过几轮扣减都会扣减为0。
  特殊场景下,可能存在每个桶只剩下个位数库存,预订时候份数大于剩余库存,导致扣减不成功。例如:分桶数量为100个,每个桶有12个库存,用户预订3份时扣减失败。当库存小于十位数时,缩容桶的数量,防止用户看到有库存,扣减一直失败。
  优化前后对比
  扣减库存方案对比三、回顾总结
  回顾与爱同行惠游湖北整个活动,我们整体是这样备战的:梳理风险点:包括系统架构、核心流程,识别出来后制定应对策略;流量预估:根据票量、历史PV、节假日峰值预估活动峰值QPS;全链路压测:对系统进行全链路压测,对峰值QPS进行压测,找出问题点,优化改进;限流配置:为系统配置安全的、符合业务需求的限流阀值;应急预案:收集各个域的可能风险点,制作应急处理方案;监控:活动时观察各项监控指标,如有异常,按预案处理;复盘:活动后分析日志,监控指标,故障分析,持续改进;
  本文阐述了在抢票活动中遇到的四个具有代表性的问题,在优化过程中,不断地思考和落地技术细节,沉淀核心技术,以最终达到让用户预订及入园顺畅,体验良好的目标。
  【作者简介】HongLiang,携程高级技术专家,专注系统性能、稳定性、承载能力和交易质量,在技术架构演进、高并发等领域有丰富的实践经验。

诛仙3助力礼包加倍!迎春新服蜃海之歌今日开启预约!朱天战区春日新服蜃海之歌即将于今日12:00开启预约活动,专属福利享不停,除了众多新服活动及福利外,新区助力礼包再次升级!礼包内容超级加倍!月德符、重华星辰、赤乌星辰、玄烛星辰……正川股份2022年前三季度净利润4237。34万元同比下降3中证智能财讯正川股份(603976)10月28日披露2022年第三季度报告。2022年前三季度,公司实现营业总收入5。90亿元,同比增长7。02;归母净利润4237。34万元,……机箱积灰怎么办?英特尔换正压风道IT之家11月25日消息台式机用户虽然获得了更为强悍的性能,但是机箱散热风扇的高速转动往往会让机箱内部成为聚灰地。对此英特尔也再度科普了一下机箱积灰问题的解决办法。英特尔……三星SSD双11战报天猫京东苏宁三平台销售额第一IT之家11月13日消息今年双11已经过去,现在三星品牌存储公布了双11当天的战报,固态硬盘、移动固态硬盘类目天猫amp;京东amp;苏宁三平台销售额均为第一。三星表示,……宏碁推出新款23。8英寸显示器165HzIPS面板,支持Fr感谢IT之家网友顽果度的线索投递!IT之家11月16日消息据热心网友投稿,宏碁的暗影骑士XV240Y二代显示器上架,采用23。8英寸和165Hz刷新率,价格为1599元。……再见齐达内!联手姆总逼宫失败,或执教世界第一,26年复仇法国齐达内和法国队之间的问题也是相当复杂,本来世界杯之前法国队是非常希望齐达内能够执教球队的。甚至欧国联之后都传出来了法国队想要在世界杯前经济换帅齐达内。但最终考虑到团队的团……固态硬盘迎来16TB容量,群联新主控体积大幅缩小IT之家1月9日消息根据Tom39;sHardware的报道,群联在CES2020上宣布,他们已经大幅缩小了SSD主控的占用空间,大容量的SSD更容易实现。群联在CES2020……3年3650万!被喊了三年半水货,榜眼终于找到家了都知道,NBA自由市场已经开启两周。截止到目前,绝大部分出色的自由球员都已经完成了签约,在众多的签约里,有这么一笔可能没那么受人关注,但绝对值得一提活塞以三年3650万续……笑起来灵气逼人,甜如初恋,这5位女星的ampampquot笑回眸一笑百媚生,六宫粉黛无颜色。娱乐圈中,有些明星天生长了一双月牙眼目,当她们巧笑妍姿,山河瞬间失色。她们笑起来的时候,眼睛像是弯弯月牙,看……cpolar安全的内网穿透工具什么是cpolar?cpolar是一种安全的内网穿透云服务,它将内网下的本地服务器通过安全隧道暴露至公网,使得公网用户可以正常访问内网服务。它能用在哪些场景?微信公……英特尔CEO2019年人工智能相关营收38亿美元2月3日消息,据国外媒体报道,谷歌阿尔法狗在2016年3月的人机围棋大战中4:1击败李世石,向外界展现了人工智能(AI)的优势,很多企业也看到了人工智能的发展前景,部分公司已通……AMDR54500U跑分现身6C6T打赢i51035G14CIT之家2月1日消息在1月份的CES上,AMD推出了新款的7nm移动低压处理器,其中R5有两个版本,分别是6核6线程的R54500U和6核12线程的R54600U。现在,搭载R……
WTT球星挑战赛果阿站惨遭大逆转樊振东意外一轮游3月2日,WTT球星挑战赛果阿站继续进行。男单116决赛,世界第一樊振东在领先两局的情况下连丢三局,被韩国小将赵大成实现逆转,惨遭一轮游。日前,本着保护运动员的目的,在对……海盗船展示首款笔记本电脑CorsairVoyager,搭载AIT之家5月23日消息,美商海盗船在AMD的Computex2022主题演讲中推出了其首款游戏笔记本电脑。这台名为CorsairVoyager的机器采用AMD全套硬件,包……AMD发布新款Mendocino移动APU4核Zen2RDNIT之家5月23日消息,今天,AMD发布了Mendocino移动APU,采用了4核Zen2RDNA2核显设计,采用6nm工艺,官方表示为399美元(约2677。29元人民币)到……5。5GHz!苏妈演示AMD锐龙7000系列Zen4CPU游IT之家5月23日消息,今天的Computex主题演讲中,AMD首席执行官LisaSu确认Ryzen7000芯片将于今年秋季推出。此外,苏姿丰还特意演示了这款新品的游戏性能。……AMD6nmMendocinoAPU将于第四季度推出Zen2IT之家5月23日消息,今天,AMD公布了其针对主流笔记本电脑市场的计划。不出意外的话,我们将会在明天的Computex2022上看到更多信息。在AMD推出代号为Drag……雷克沙新款NM760PCIe4。0SSD今晚开卖,1TB首发IT之家4月17日消息,日前,雷克沙发布了新款NM760PCIe4。0SSD,读取速度最高可达5300MBs,512GB(480GB)首发449元,1TB(960GB)首发84……消息称英伟达RTX40显卡不支持PCIe5。0IT之家4月24日消息,据可靠爆料者Kopite7Kimi消息,英伟达RTX40系列显卡将仍支持PCIe4。0,不支持最新的PCIe5。0。IT之家了解到,英特尔最新的1……PCIe5。0供电接口规格曝光150300450600WIT之家3月3日消息,英特尔近日曝光了下一代显卡的PCIExpress5。0电源线的官方规格。根据泄漏者momomus发布的PPT,即将推出的PCIeGen5显卡标准官方……慧荣搭载SM2508PCIe5。0主控的发烧级SSD年底上市IT之家2月4日消息,据TomsHardware报道,慧荣(SiliconMotion)及其合作伙伴将在今年年底发布基于SM2508控制器的发烧级SSD,采用最新的PCIe5。……PCIe5。0SSD将至,乔思伯发布M。2主动散热器IT之家12月24日消息,在即将到来的CES2022上,预计将有多款PCIe5。0SSD发布,新一代的SSD速度可达14GBs,功耗注定也将更高。现在,乔思伯发布了一款M。2主……华硕曝光PCIe5。012pin供电接口与英伟达专用口相似,IT之家11月3日消息,此前有外媒曝光了将在PCIe5。0设备上使用的12pin供电接口,其采用了更紧凑的设计,单口功率可达600W以上,同时具有四个额外的针脚用于通信。据外媒……微星展示业界首个PCIeGen5转换卡主动散热,为下一代M。IT之家10月30日消息,根据外媒VideoCardz消息,微星在10月28日的直播活动中,首次展现了PCIeGen5转换卡,成品实物在直播中亮相。这款产品支持PCIeGen5……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网