开发者社区> 千言万语乐此不疲> 正文

大麦库存的高性能及一致性是如何设计的?

简介: 大麦网作为现场娱乐票务平台,其业务覆盖了各大顶级演唱会和大型赛事等高流量项目。 票务行业库存系统不同于普通电商库存系统,瞬压过高的秒杀抢票,多场景、多阶段的售卖, 对一致性和稳定性提出更高要求。本文将为读者介绍现场娱乐行业票务库存高性能和一致性难 点解决和沉淀下来的库存稳定性建设经验。
+关注继续查看

作者| 阿里文娱技术专家 古行

一、背景

大麦网作为现场娱乐票务平台,其业务覆盖了各大顶级演唱会和大型赛事等高流量项目。 票务行业库存系统不同于普通电商库存系统,瞬压过高的秒杀抢票,多场景、多阶段的售卖, 对一致性和稳定性提出更高要求。本文将为读者介绍现场娱乐行业票务库存高性能和一致性难 点解决和沉淀下来的库存稳定性建设经验。

二、库存场景分类

在售卖中支持多渠道:主办方售卖、大麦网售卖、其他分销渠道售卖等。来满足不同场景 下的票源管理。大麦网库存可以分为无座库存、选座库存、预售数字库存和现票库存。
1)无座库存:比如音乐节、游展类项目,观众持票入场,无需安排座位;
2)选座购买:用户可以自己通过座位图选择座位,下单购买;

image.png

3)预售数字库存:预售阶段用户先按照票档价位购买,然后系统按购买顺序进行自动配座;

image.png

4)现票库存:如非大麦网票务系统生产的,由大麦网从主办方提取现票在大麦网售卖。

1. 库存核心技术点

目标:高性能、强一致性 库存的高性能和一致性主要从以下几个方面保障:
1)进行事务拆分,执行粒度最小化,优化提高性能;
2)基于正向流水防止重复扣减;
3)基于逆向流水防止重复回滚。

2. 扣减预校验:防击穿缓存设计

如果所有的库存扣减拦截都放到最后一步扣减库存来做,无疑会对数据库造成巨大的冲击。 毕竟库存有限,总有一部分请求是无法购买成功的,这一部分请求流量应该在库存实际扣减之 前拦截下来。
预校验阶段即“高并发读”链路时,进行一些不影响性能的检查操作,比如请求的合法性 校验、票品是否可售、可售数量是否足够、渠道是否授权等。在这个阶段,系统采用分布式缓 存来抵抗高并发读。
传统意义的缓存比如 Memcached,一个比较头疼的问题是缓存击穿。为了保护 DB,我们 对传统缓存做了一层封装,即在传统缓存写入时增加当前毫秒级时间戳属性,读取缓存后与当 前时间戳比较其差值判定其是否逻辑过期,如果逻辑过期则在竞争分布式锁后读取 DB 数据并反哺缓存。

image.png

3. 库存扣减的一致性保障

库存扣减要同时扣减票品库存和渠道库存,所以扣减阶段势必要进行拆解执行,拆解成最 小粒度执行是为了命中数据库热点补丁,达到快速执行的目的。但拆解后面临的问题是如果一 个扣减动作执行失败,如何回滚已经执行的动作。基于分库分表的限制,以上两个扣减动作显 然无法使用数据层的事务做保证。本库存系统选用的是“职责链模式”进行库存扣减步骤的定制化。
我们把“票品库存扣减”、“渠道库存扣减”作为职责链中的两个独立 Action,任何一个 Action发生异常则向上抛出,在上层处理异常并回滚已经执行过的 Action。确保“票品库存”“渠道库存”的扣减共进退,理论上达到数据一致性的事务保障。
在动态组合职责时,两个 Action 的执行顺序相当关键。在扣减顺序上,首先扣减票品库存, 因为票品库存的共享性,在多渠道同时扣减的情况下,票品库存一般先于渠道库存售罄。所以 首先扣减票品库存相较于首先扣减渠道库存可以减少很多回滚情况的发生。

image.png

4. 库存回滚的一致性保障

在回滚职责链中,动态组合职责时,同样讲究执行的先后顺序,与正向扣减刚好相反,首 先回滚渠道库存,然后回滚票品库存。这样在渠道库存已经回滚的情况下如果回滚票品库存发 生异常,结合上述的扣减顺序,票品库存的超卖扣减几率将大大降低。

image.png

5. 异常场景的实时对账

交易系统与库存系统之间的对账可以让双方系统互通有无。如果交易系统在扣减库存时发 生读取超时,库存系统实际已经完成库存扣减,但交易系统并未成功落单。则库存系统在实际 扣减成功后会发起对账消息,此时交易系统对账结果显示交易系统并未落单,立即主动发起库 存回滚请求,撤销刚才的事实扣减。

image.png

6. 数据库层面的极限优化

库存扣减会在同一条票品库存或者渠道库存记录上“高并发写”。此阶段会直接面对数据库 的一条记录进行高频次的写操作,业界普遍采用的方案是应用层排队或者行级乐观锁保障对同 一条记录进行操作的并发。考虑到应用层排队有损性能,库存系统采用了较为理想的数据层排 队,主要基于阿里的数据库团队开发的针对 InnoDB 层上的补丁程序(patch),可以基于 DB 层 对单行记录做并发排队,从而实现秒杀场景下的定制优化。

7. 高并发场景下日志优化

业务日志对于发现业务问题极为有效,也有助于测试阶段的问题定位。上线后有详细的全 链路日志协助问题排查。为了避免引入的外部 jar 输出不必要的日志,所以上线后的系统业务日 志级别调整为 ERROR 级别。另外,为了防止大抢期间日志落地造成 IO 竞争导致性能下降,库 存系统裁剪了大量的无效日志输出,并且采用 Logback 的 LoggingEventAsyncDisruptorAppender 异步写日志,防止写日志阻塞(极端情况下有抛弃日志的可能)引起的系统性能下降。

三、库存稳定性

稳定性目标:2 分钟内发现(业务监控 100%覆盖),5 分钟内定位,15 分钟内止血。

image.png

1. 链路梳理及优化

库存红线:是库存系统的生命线,其规则如下图:

image.png

强弱依赖:对库存的核心链路进行强弱依赖梳理,保证核心链路只依赖 DB,其他依赖均可降级。

2. 全链路压测

完备的常态化全链路压测体系,保证库存的一致性和性能符合大抢预期。

image.png

3. 大抢预案自动化

预案自动化的核心在于两点:哪些项目是热门项目?哪些预案需要执行? 1)发现热门项目,预案根据 PV 和参与人数,自动发现热门项目,加入预案执行队列。
2)自动执行预案项,根据预先编排好的执行时间自动对抢票场次执行缓存预热、开关降级和接口限流等操作。
image.png

4. 库存异常熔断

在抢票场景下,库存异常的诊断是非常困难的,基于库存扣减流水可以准确计算出库存在 某一时间段内变化的情况,和当前生成的票单对比后即可以判断库存是否不一致,进而触发渠 道熔断,防止情况恶化。

image.png

5. 监控及报警

在监控方面主要有:核心指标及异常监控、业务实时审计和周期巡检。
1)核心指标及异常监控
核心指标及异常监控可以有效监控下单成功率和 RT 抖动,如果有异常错误码或者抖动可 以及时发现,快速介入;
2)业务实时审计 业务实时审计是数据一致性检测的重要手段,由于链路超时或异常下状态不一致的时进行
报警;
3)周期巡检 周期巡检是对上述监控的重要补充,业务实时审计其实是数据状态变化触发的,当没有触发事件或者没有覆盖到其他规则时,周期巡检可以避免监控遗漏,虽然是非实时的,但是也在实践中起到不错的效果。

image.png

6. 排查工具建设:快速定位,快速止血恢复

image.png

四、总结

以上是票务行业库存系统建设及项目中的一些探索经验,基于正逆向流水的防重,预校验 拦截,防缓存击穿,职责链模式的步骤拆分,系统间对账,数据库热点补丁的使用,日志裁剪 优化等一些列技术手段,达成库存高性能、强一致性目标。
通过梳理库存红线,常态化全链路压测,异常熔断机制,监控报警以及排查工具,大抢预 案自动化建设,持续提高库存系统稳定性。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
从一个电商平台的库存同步谈性能优化和方案落地
从一个电商平台的库存同步谈性能优化和方案落地
49 0
【架构】千万级购物车系统缓存架构方案
本文主要介绍redis在千万级系统中设计架构方案,包括主架构设计、缓存一致性方案、大value处理方案和redis限流和故障恢复降级
180 0
稳定性三十六计-幂等设计
为什么要幂等 世界上最遥远的距离是我终于鼓起勇气,对着马路对面的你大喊:“你愿意娶我吗?”我看到你面带灿烂的笑容,正回答的时候……一辆大卡车驶过,你的回答我没有听见。 因各种不可抗因素产生的没有收到响应,一个简单有效的方法就是重试。被重试的接口必须是幂等的。 幂等性是分布式系统设计中的一个重要概念,对超时处理、系统恢复等具有重要意义。
36 0
保证陪玩平台源码可靠性,提供稳定服务
可靠性是陪玩平台源码的重要标准,只有可靠的服务才能得到用户的信赖,留住更多用户,让陪玩平台系统具有更强的竞争力。
61 0
秒杀系统设计架构与实现
秒杀系统设计架构与实现
108 0
支付系统高可用架构设计实战,可用性高达99.999!
一、背景 对于互联网应用和企业大型应用而言,多数都尽可能地要求做到7*24小时不间断运行,而要做到完全不间断运行可以说“难于上青天”。为此,对应用可用性程度的衡量标准一般有3个9到5个9。
134 0
【高并发】如何设计一个支撑高并发大流量的系统?这次我将设计思路分享给大家!
最近不少小伙伴们都在问我:高并发专题我学了不少文章了,但是如何设计一个高并发的系统我还是一脸懵逼!这个问题怎么解决呢?其实,相信不只是问我的这些小伙伴有这个困惑,就连工作(入坑)了好几年的开发人员也都有这样的困惑:我学习了很多的高并发课程,也看了不少的高大上的文章,可就是不知道怎么去设计一个支撑高并发大流量的系统。针对小伙伴们的疑惑,这里,我就把一些设计高并发大流量的常规思路分享给大家,不一定完全正确,设计高并发大流量系统本来就是一个仁者见仁、智者见智的事情,只要是符合自身业务场景的架构思路,都是好的架构思路,架构本身来说就是没有一个完全正确的架构,而是尽量符合当时自身的业务场景,并且能够良好
206 0
解决方案应用实例 |引入业务中台,千百度破解高库存、高缺货难题
服饰行业普遍存在的高库存、高缺货问题,千百度也难以避免。阿里云业务中台上线半年以来,千百度真正做到了多品牌、多渠道的商品,库存、订单、会员统一管理,客户满意度明显提升。
119 0
菜鸟积分系统稳定性建设 - 分库分表&百亿级数据迁移
拆库&数据迁移说白了,考验的不是一个人的技术功底,而是一个人干活的细致程度,以及抗压能力。无论在哪个公司,数据库迁移的机会都不会太多,因此,我也是非常珍惜这次历练,用阿里的一句老话来说就是 “因人成事,借事修人”。写这篇文章的目的主要是自己进行一个总结,也希望能给需要的同学们一些参考。
1134 0
+关注
千言万语乐此不疲
文章
问答
视频
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
微信红包系统可用性设计实践
立即下载
利用 Poplayer 在手淘中实现稳定业务和临时业务分离
立即下载
利用Poplayer在手淘中实现稳定业务和临时业务分离
立即下载