首次揭秘!看大麦如何掌控超大规模高性能选座抢票

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
简介: 随着现场娱乐行业的不断发展,各类演出层出不穷,越来越多的演出开启选座购票满足用 户的自主选座需求。大麦的选座不仅面向中小场馆类的剧院演出,还面向大型体育赛事、大型 演唱会等超大型场馆(如鸟巢近 10 万座)。选座类型抢票的特点是“选”,由于“选”的可视化以及超大场馆在数据量上对大麦是很大的挑战。本文通过服务端和前端上的一些解决方案来探讨 如何支撑超大规模场馆的高性能选座,通过本文的一些技术方案希望可以对读者在一些高并发实践中提供帮助。

作者| 阿里文娱技术专家 恒磊、阿里文娱高级开发工程师 新钱

一、背景介绍

随着现场娱乐行业的不断发展,各类演出层出不穷,越来越多的演出开启选座购票满足用 户的自主选座需求。大麦的选座不仅面向中小场馆类的剧院演出,还面向大型体育赛事、大型 演唱会等超大型场馆(如鸟巢近 10 万座)。选座类型抢票的特点是“选”,由于“选”的可视化以及超大场馆在数据量上对大麦是很大的挑战。本文通过服务端和前端上的一些解决方案来探讨 如何支撑超大规模场馆的高性能选座,通过本文的一些技术方案希望可以对读者在一些高并发实践中提供帮助。

二、核心问题

首先看一下普通商品的秒杀,拿某款手机秒杀来说,一般情况下,一场手机只有几个型号, 比如中低档、高性能档、旗舰等,处理好这几个商品的库存即可。对于选座类抢票而言,每一 个场次的所有的每一个座位都可以认为是一个不同的商品,场馆大小不一,大的鸟巢有 10w 座 位。也即是说一个选座类抢票就涉及 10 万级别的商品,如果多个项目同时开抢,整体数量会很 庞大。目前大麦电商侧的商品维度是票档,座位并不是商品粒度,所以无法利用集团的秒杀能 力,选座类抢票涉及电商、选座、票务云产销,是对大麦整体能力的考验。
先来看看整个选座购票的流程:以林俊杰长沙测试项目购票为例。
用户打开需要的场次项目详情页

image.png

②点击选座购买,打开选座页面,查看座位图及票档

image.png

③选择一个看台区域,选择喜欢的座位,点击确认选座

image.png

④进入下单页面,填写手机号收货地址,创建订单

image.png

⑤提交订单完成付款、出票。 其中,2、3、4 环节都与选座相关。 从流程上看,选座的核心关键技术在于:
座位图的快速加载。快速加载其实就是选座页面的读能力。选座页面需要下载座位底图、 座位基础信息(排号等等)来做渲染,同时需要票档、该场次每个座位的状态,来决定是可售 还是锁定还是已经售出。
对于大型场馆座位 5 万-10 万,渲染一个选座页面需要的数据量都很大。
②高并发。由于热门演出票的稀缺性,同时抢票的人数可能达到几十万。如何支撑如此高 的并发和吞吐是一大考验。
③座位状态更新的及时性 当某个座位售出后,需要及时更新座位状态。
④抢票体验:抢票时热门的看台某个座位可能几十个人并发去抢,如何尽量提升用户的体验,尽量让更多用户一次性购买成功,体验更好。

三、高性能选座实践

针对高性能选座的核心要求,我们从如下几个维度去阐述我们在选座类抢票上的实践。

1. 动静结合

选座的瓶颈数据量“首当其冲”。从逻辑上讲,一个座位完整的展现到用户面前,需要包含 座位的看台、排号、价格、售卖状态等信息,其中 看台、排号等等是不变的,并可提前预知的; 售卖状态等时根据项目的进行会动态变化的。所以把选座的数据拆分为动态、静态数据。对于 大型场馆如 10 万场馆,用户打开一个选座页,座位的静态数据(座位 id,票价 id,是否固定套 票,坐标 x,y,和舞台角度,哪个看台,几排几号等等),这些数据大概 15M 左右。再加上动 态数据如票档状态、颜色、看台状态、座位状态,10w 场馆大概 2M 左右。也就是说如果不做 处理用户仅仅打开选座页就需要 17M 以上的数据量。如果选座数据存储在 oss 上,如果每人下 载 15M,10w 人同时抢票则需要 1500G 带宽,带宽成本很高。为了解决静态文件访问速度问题, 将静态数据从 oss 直接接入到 cdn。同时为了保障数据最新,静态数据采用版本控制。

2. 静态数据的预加载

上面提到带宽峰值很高,为了降低峰值且提升体验,客户端引入了静态数据预加载。静态 信息结合预加载的处理,为处理大数据量的座位信息提供了时间上的余量,用户在打开选座页 时优先显示静态信息,可有效降低用户等待时间,提升用户的体验。
通过大数据分析结合用户的行为习惯,确定预加载的场次类型,提高预加载的命中率。

image.png

预加载+预解析,完成了绘制基本场馆信息的数据准备,再将数据提前与画座 View 绑定, 预渲染 View 进而达到选座页秒开效果。

3. 座位数据编码

动态、静态数据量大制约了我们实现高吞吐,同时也浪费了服务带宽和用户流量。所以需 要压缩,压缩到一定的可接受的范围。只有数据量足够小,才有办法做到高吞吐。
1)静态数据编码 在处理大数据量的座位(例如十万级)仅有静态数据的预加载往往是不足的,预加载并没有从根本上处理座位数据量大的问题,同时对于类似体育比赛这种多日期多场次的场景,由于预加载的使用存在缓存量的控制,往往影响预加载的命中率。 而数据重编码和数据压缩的使用,是从源头解决问题的有效思路。
座位数据的重编,舍弃传统的 xml 和 json 格式,不仅可以有效压缩数据大小,还对数据安 全提供了保障,即使被拿到了接口数据,因为缺乏数据编码的协议,也无法获取有效的原始信 息。
2)座位静态数据压缩整体框架 目前大麦针对自己特有的座位数据特点,结合高效二进制编码方案进行座位数据的重新编码,再使用通用的无损压缩进一步缩小数据体积,从而减少了座位数据的网络传输时间,从根本上解决大数据传输导致的时延问题:

image.png

基于二进制的数据编码,既保障了数据安全性,又保证了在数据解析中的高效性,即使数 据压缩的使用也比 json、xml 的解析具有更少的时延。
同时兼具工具化的批量生产方式,又进一步解决了数据构建问题。

image.png
通过端上和 server 端的握手协商过程,实现了数据编码和通用压缩方式灵活组合,sever 端 可以针对不同的端下发相应的压缩格式文件:

image.png

结合 CRC 的思想,制定了兼容 IOS、Android 和 H5 三端的基于座位属性的纵向 hash 校验。 相比 md5 等普通的散列计算方式,在处理 6 万级座位多维度信息时,在端上实现了十几毫秒、 H5 侧 50 毫秒左右的全量数据检测,使得在不占用多长时间的情况,可以验证数万级座位解析 的准确性。
经过这编码到检测的完整链路,实现了减少数据的体积的同时,又能达到比传统 xml 和 json
数据的高效解析、高安全性。

image.png

其中 quantum 是大麦端上自研的基于动态比特和字典的压缩算法,结合大麦特有业务场景, 实现了高压缩比和快速数据解析:

image.png
3)座位动态数据的编码处理 a)动态数据的难点选座动态接口主要涉及票档情况、看台情况、座位状态。数据量最大的是座位状态。以一 个 5 万座位的场馆为例,每个座位都要返回一个状态供前端渲染。采用座位 id 和状态键值对的 方式,由于座位较多使得整个返回结果过大,5 万座位的场馆返回 1M 以上的数据。如果打开 一个选座页需要吞吐 1M 数据量的化,接口基本不可用了。之前的策略是按照分组策略,5 万 大概会分 10 个组,这样每个请求大概 100k 数据量,这样才能达到接口基本可用,不过端上需 要请求 10 次才能拿到整个场次的状态,可想而知性能会有多大影响。假如 5 万座位的场馆,10 万峰值抢票,那么仅仅这个接口就需要 100 万的 qps,所以肯定会逢抢必挂。
b)方案
目前接口是通过 mtop 协议,我们思考的前提:目前mtop 不支持 byte[]数组流,只支持 json等格式的字符串结构。如何把返回的数据减小,采用一个尽量简洁的方案,同时调用一次返回 整个场馆座位状态,是我们努力的方向。
数据量大主要是因为有很多冗余的座位 id。有没有办法不依赖这些座位 id?既然我们做的 动静分离,静态数据里已经涵盖了座位 id,我们动态接口里只需要对应的返回状态即可,即按 照静态里面的顺序返回座位状态。同时我们把返回结果进行简单的相邻状态合并将进一步降低 返回结果大小。假设用户选座座位符合正态分布概率,平均长度 5w 座位平均返回不到 20k。
当然如果我们 mtop 协议支持二进制流,那么我们可以用 bit 位进行存储,可以进一步降低 返回结果的大小。

4. 高效缓存

1)缓存
面向这么高的 TPS,tair 是不二首选。采用 tair + 本地缓存,来支撑如此高的数据峰值。 提到 tair,提一下我们这边的一些策略。 用户进到选座页是一个个的看台,我们设计了一级 stand cache,即看台级别的 cache;用户会进行选座位,我们又加了一级 seat cache,即为座位粒度的 cache。两级 cache 保障用户查看台和用户下单选座都能命中缓存。standcache 是热点 key,从选座的场景是允许数据非准实时 的,所以引入了 tair localcache 和 guava localcache 来增加吞吐,以此降低对 tair 的读压力。
2)保护下游系统
目前采用的策略是 对下游的调用采用加锁,tair 全局锁。拿到锁的才去请求票务云底层数 据。拿到锁的进程去更新 tair 缓存。其实从这里看对 tair 的写还是 qps 比较小的,但是每次争抢 锁对 tair 的读还是不算太小。通过采用本地的锁 + 随机透传来减少 tair 锁耗费的读qps。为了 对下游依赖做降级,增加了数据快照,每次对下游的调用记录数据快照。当某次调用失败采用 之前的快照进行补偿。
3)保障数据更新及时
由于我们采用了 tair 全局锁,可以按照秒级控制下游调用。调用采用异步触发。最短 1s 内 会触发我们发起对下游的调用。如果我们想最大化利用票务云库存能力,给用户的延迟在 1s 以 内,我们有一些策略。拿到锁的线程 1s 内调用数据更新任务,在数据更新任务里做一些策略, 1s 内是发起 1 次还是多次对票务云的调用,调用越多 tair 更新越及时。由于用户有一定的选座动作,一般情况下 500ms 的延迟用户基本无任何感知的。
4)缓存预热 预热一下缓存,对用户体验和系统性能很有帮助。抢票类项目采用一定的策略做自动化预热。

5. 安全及容灾

1)安全 从上文看大麦座位数据做了编码和加密,同时存储路径做了混淆,保障不到开抢时间座位数据无法被破解,保障了选座数据的安全性。此外选座页布局防控策略,保障是真正需要点击座位才能完成下单,防止机刷、防止绕过选座直接下单。通过类似策略降低了选座的无效流量, 提高了稳定性。
2)容灾
选座主要在以下几个方面做了容灾。静态数据存储在oss 上,目前采用跨地区存储容灾;tair 缓存采用主备缓存,出故障时可以做切换;服务端在 pc 和无线做了集群隔离。

四、总结

本文通过在数据处理、选座性能、缓存等等策略上来阐述了笔者在大麦高性能选座上的一 些实践。通过这些实践目前大麦可以轻松的承载数十万人的顶级流量的抢票项目。

相关文章
|
9月前
|
自然语言处理 搜索推荐 UED
有钱景线上赛事直播开发搭建,探讨需要哪些核心功能
随着体育赛事直播平台成为用户最主要观赛,那么要打造一家充满活力的赛事直播平台,需要提供以下功能和内容。
|
新零售 弹性计算 人工智能
十分钟生成影视级室内设计效果,红星美凯龙设计云如何升级传统家居行业
依托于阿里云强大的弹性云上GPU算力,红星美凯龙可以为客户提供快速的、高质量的渲染,实现秒级的门店快速设计。
133224 13
十分钟生成影视级室内设计效果,红星美凯龙设计云如何升级传统家居行业
|
移动开发 安全 小程序
顶象特别策划 | 2022双十一业务安全保卫战即日启动
各位白帽黑客们,来一场酣畅淋漓的正义守卫战吗?
115 0
顶象特别策划 | 2022双十一业务安全保卫战即日启动
|
人工智能 运维 负载均衡
国民级消消乐背后的网络技术支持:不畏巨“峰”,“运”筹帷幄 ——阿里云ALB助力乐元素构建用户体验更丝滑,运维管理更简单的网络
近日,阿里云网络携手乐元素共同部署建设了基于7层业务自动化调度的弹性网络架构,进一步提升乐元素在用户服务上的娱乐体验。提到乐元素相信大家都不陌生,作为从事移动网络游戏的研发、运营及广告平台,其代表作就是先前提到的国民级三消休闲游戏《开心消消乐》, 在中国消除类游戏排名连续多年领先。秉承将游戏和AI技术相结合,通过科技驱动体验的理念,乐元素通过出色的产品为世界各地的人们带来了无尽的欢乐。
788 0
国民级消消乐背后的网络技术支持:不畏巨“峰”,“运”筹帷幄 ——阿里云ALB助力乐元素构建用户体验更丝滑,运维管理更简单的网络
|
Web App开发 编解码 移动开发
淘宝超强“带货王”——直播低延迟的背后有何猫腻?
本次演讲来自阿里巴巴淘系技术部技术专家常高伟在 LiveVideoStack 2019深圳站上的演讲,主要面向直播行业从业者,以及对低延迟直播技术、 WebRTC 技术感兴趣的技术人员,介绍淘宝直播在低延迟直播技术上的探索,如何基于 WebRTC 实现一秒内的低延迟直播,以及低延迟直播对电商直播的业务价值。
2465 1
淘宝超强“带货王”——直播低延迟的背后有何猫腻?
|
双11 5G 数据可视化
媲美5G的Wifi网速、“备战”资产一键领……揭秘双11小二背后的保障力量
回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障也在不断升级。
1416 0
媲美5G的Wifi网速、“备战”资产一键领……揭秘双11小二背后的保障力量
|
API 容器 Kubernetes
为什么 K8s 集群达万级规模,阿里购物体验还能如丝顺滑?
阿里妹导读:本文主要介绍阿里巴巴和蚂蚁金服在大规模生产环境中落地 Kubernetes 的过程中,在集群规模上遇到的典型问题以及对应的解决方案,内容包含对 etcd、kube-apiserver、kube-controller 的若干性能及稳定性增强,这些关键的增强是阿里巴巴和蚂蚁金服内部上万节点的 Kubernetes 集群能够平稳支撑 2019 年天猫 618 大促的关键所在。
5400 0
|
机器学习/深度学习 前端开发 安全
【云周刊】第140期:阿里人打车不给钱?内部自研神器“欢行”首次曝光
阿里人打车不给钱?内部自研神器“欢行”首次曝光,无处可藏:人脸识别时代生活报告,机器学习的入门“秘籍” ,【云吞铺子】使用访问控制,保护你的云上资产...更多精彩技术资讯,尽在云周刊!
7942 0