写点什么

世界顶级赛事的票务支撑:百万座位与限时匹配

  • 2020-03-22
  • 本文字数:2504 字

    阅读完需:约 8 分钟

世界顶级赛事的票务支撑:百万座位与限时匹配

一、背景

麦座,是大麦旗下的票务系统。去年,我们承接了 2019 年国际篮联篮球世界杯(2019FBWC),核心目标是完成三种套票的运营及售卖。用户可选择的套票方案为:


  1. 球队套票:可以观看指定球队比赛;

  2. 城市套票:可以观看指定城市比赛;

  3. 单日套票:可以观看指定日期(同时也指定城市)的比赛。


要知道,2019FBWC 有 92 场比赛,共计 100 多万的座位,两场比赛间最短时间间隔仅有 10 多个小时,只有上一场比赛打完,才能确定下场比赛的对手和城市。我们的技术难点是,面对套票本身对阵关系及场次的不确定性,如何在百万座位中,快速为套票用户匹配座位。以下是我们的技术解法和总结,希望对大家有借鉴。

二、套票解法

1. 套票问题抽象


我们按照目标场次是否存在,把三种套票分为两类:


1)球队套票定金、城市套票、单日套票。特点在于目标场次一定存在,但是对阵关系和座位图不确定,可以抽象为无座场次下单模型,即在不确定具体场次和座位情况下通过售卖数字库存,为用户锁定某种资格(入场、后续购票等等);


2)球队套票后续阶段。特点在于目标场次不一定存在,败者球队不一定有后续比赛。但是随着赛程推进,一轮打完必然知道下一轮的对手以及比赛城市,此时只有已经交了球队套票定金的观众可以继续以较便宜的价格购买球队套票下一阶段的门票。


针对球队套票赛程阶段,我们需要提供的是锁定资格后不断购买指定球队后续比赛场次门票的能力,即给客户“配单”。而无论何种套票,用户最终还是要进场观赛,需要要在验票入场前告知用户实际座位,因此我们提供将无座订单转化为有座订单的能力,即给客户“配座”。


为了解决配单、配座问题,麦座设计了两个工具:


1)配单工具:球队套票,每个阶段之间通过工具,生成下一阶段待支付订单,延续用户购买套票资格;


2)配座工具:具体比赛场次出来后通过工具,将无座套票映射到有座场次,给用户机选座位,最终实现用户座位分配。


2. 解法一:配单


配单功能适用于球队套票的分阶段售卖,世界杯的球队套票分为六个阶段。



图 1 赛程抽象


第一阶段为定金支付,支付定金后,获得后续球队套票购买资格,后续共分为 5 个阶段,每个阶段对应小组赛到决赛的实际场次。配单工具要解决的核心问题在于:


1)利用当前阶段的订单信息生成下一阶段待支付订单,同时通知用户支付;


2)保持套票订单之间的关联关系,方便报表统计。



图 2 配单模型


如图所示,配单时基本上是按照原始订单的订单结构信息,复制出目标订单的结构信息,订单结构保持不变,同时所有后续阶段的订单都与最原始的定金订单建立关联关系,后续通过定金场次订单可以统计出套票生命周期的所有订单,方便报表统计。球队套票每个阶段都生成一个待支付的无座订单,并提醒用户及时支付。



图 3 处理流程


配单处理流程如图所示,由于处理时间较长,为了更好的用户体验和性能,需要在订单开始处理后及时返回用户“处理中”的状态,后台采取异步处理。通过消息中间件将处理任务分发到到集群处理节点,另一方面由于底层下单接口 TPS 承载有限,需要每个处理节点(应用实例)控制处理速率,做好限流,图中是通过线程池控制处理速率。



图 4 process 分解


单个 process 的内容如图所示,其中橙色框中的步骤标识有数据库写操作,需要做事务处理。扣减库存、订单保存、订单权限保存基本上是复用的麦座下单 process 中的的 step。


3. 解法二:配座


配座工具适用于所有套票映射最终有座场次的场景。从用户体验上讲,配座与配单不同,配单工具生成的订单需要用户支付,因此必然让用户感知到新订单的生成,而配座工具生成的订单实际上不需要用户支付,而且由于配座的场次非常多,会出现一个原订单生成最多十个目标订单的场景,因此如果让用户感知到其实是不合理的(考虑一个用户某天打开订单列表,可能看见若干莫名其妙的订单),所以订单结构上配座与配单也不尽相同。



图 5 配座模型


配单工具通过关联关系记录套票生命周期,而配座工具通过父子关系,更偏向于传统的购物车订单,即父订单收钱,子订单无需再次收钱。套票无座订单记为父订单,实际的有座场次与套票订单建立父子关系。另外由于配座时不需要用户支付,因此子订单都记为零元订单,以免后续报表和对账结算金额无法抹平。


球队套票每个阶段、城市套票、单日套票最终要映射到有座场次,座位的选择是通过机选实现,配座流程与配单流程大部分是可以复用的,不同之处在于配座需要为用户机选座位,因此需要插入机选步骤,如图 6 所示。同样,图中的橙色框标识有数据库写操作,需要做事务处理。



图 6 process 分解


配座是麦座与大麦票务中台融合的一次实践,也是大麦多年以来票务能力的资源整合。未来大麦票务中台的机选能力可以开放给更多的业务方使用。


5. 如何做的更加通用?


设计之初,我们考虑到了业务的通用性,虽然不同票务系统的差异,不太可能通过一套实现满足麦座、世界杯、票务云的需求,但是玩法是可以借鉴的,通过一套接口流程,可以将套票玩法沉淀下来,后续其他票务系统有类似的玩法需求,仅需要实现接口就可以方便快速的克隆套票玩法,因此我们将接口定义抽取了独立的业务插件(jar 包)。另一方面,使用插件而不是独立应用,是因为配单和配座不可避免的要做权限校验,jar 包可以复用接入系统的权限体系,这样工具只做核心的玩法部分,可以更聚焦。



图 7

三、效果以及未来展望

2019FBWC 总共 92 场比赛,共计进行了 5 轮配单配座,通过后续的业务数据检查,所有座位配置正确,无一错漏,配单配座工具将运营同学原本一周甚至更久的工作在十几分钟内搞定,达到了产品要求的准确、高效,效果得到业务方的认可。


大规模的配单配座在体育赛事中可能成为行业常态,事实上 2019FBWC 的玩法也同时得到了亚运会、冬奥会等赛事的关注,配单配座工具采用的技术并不是阿里特有,同时由于我们采用插件设计,也在一定程度上实现了可复用,方便的推广到其他票务平台。


作者介绍


阿里文娱技术专家 展恒


相关阅读


电影垂直行业的云智开放平台如何炼成?


阿里工程师带你了解 B 端垂类营销中心如何设计?


云智前端技术如何赋能场馆院线?


60 秒售出 5 万张票!电影节抢票技术揭秘


电影行业提升 DCP 传输效率,还能这样做!


超大型场馆的绘座选座解决方案


大型赛事稳定性保障:Dpath 为世界军人运动会护航


2020-03-22 10:001764

评论

发布
暂无评论
发现更多内容

kubernetes镜像构建和扫描

CTO技术共享

C++多态之析构和纯虚析构分析与示例(三)

CtrlX

c++ 后端 面向对象思想 8月月更

架构实战营 毕业总结

Gor

基于STM32L431设计的云端绿化管理系统(ESP8266+腾讯物联网云平台)

DS小龙哥

8月月更

软件测试中的树莓酱定律

BY林子

软件测试 敏捷测试 质量内建

Curve Testing Camp Time|万元大奖等你来拿!

张慧

分布式存储 curve

P6项目管理系统的优缺点是什么?

爱吃小舅的鱼

项目管理 项目管理软件

Latex安装教程(附美赛论文latex模板)

乌龟哥哥

8月月更

Excelize 发布 2.6.1 版本更新,支持工作簿加密保护

xuri

开源 数据分析 Go 语言 Excelize Excel工具

【Gopher 学个函数】边学边练,简单为 Go 上个分

梦想橡皮擦

Python 爬虫 8月月更

机器学习服务文本翻译能力升级,中文直译模型让译文表达更地道!

HarmonyOS SDK

企业分账如何帮助用户解决成本优化和预算分配的问题

阿里巴巴中间件

阿里云 Serverless 云原生 SAE

【算法实践】| 手把手带你实现快速排序算法

迷彩

快速排序 算法实践 8月月更

头脑风暴:最大子序和

HelloWorld杰少

数据结构 算法 LeetCode 8月月更

[JS真好玩] 遇到表格,手动翻页太麻烦?我教你写脚本,一页展示所有数据

HullQin

CSS JavaScript html 前端 8月月更

最新版MySQL8 绝对有用的lag函数实现同比、环比、均差计算

知识浅谈

MySQL 8月月更

动态尺寸模型优化实践之Shape Constraint IR Part II

阿里云大数据AI技术

深度学习 编译器 优化

RocketMQ高可用设计之消息重试机制

急需上岸的小谢

8月月更

SpringBoot 整合 Junit

springboot junit5 8月月更

什么是公共云、私有云、混合云、社区云,四者分别有啥区别?

wljslmz

云计算 8月月更

leetcode 560. Subarray Sum Equals K 和为 K 的子数组(中等)

okokabcd

LeetCode 算法与数据结构

程序员最容易读错的单词,听到status我炸了

艾小仙

Java 前端

电商秒杀系统设计(架构实战营 毕业设计项目)

Gor

golang实战之flag包

程序员欣宸

golang 8月月更

数据治理(六):编译Atlas安装包

Lansonli

数据治理 8月月更

《博弈论》— 人生何处不博弈

蔡农曰

读书笔记 博弈论

【Java】:二维数组的定义、初始化、长度以及循环遍历等...

翼同学

Java 学习 编程语言 分享 8月月更

为什么说:被观察者是 push 数据,迭代者是 pull 数据?

掘金安东尼

前端 函数式编程 8月月更

一对一语音直播系统源码——如何解决音视频直播技术难点

开源直播系统源码

软件开发 直播系统源码 语音直播系统源码 语音直播源码 一对一语音直播

灵活多样认证授权,零开发投入保障IoT安全

EMQ映云科技

安全 物联网 认证授权 emqx 8月月更

阿里云林小平:如何实现应用的持续发布?

阿里云弹性计算

持续发布 应用 自动化运维

世界顶级赛事的票务支撑:百万座位与限时匹配_文化 & 方法_阿里巴巴文娱技术_InfoQ精选文章