世界顶级赛事百万座位如何做到票务限时匹配?
作者 | 阿里文娱技术专家 展恒
出品 | AI科技大本营(ID:rgznai100)
背景
麦座,是大麦旗下的票务系统。去年,我们承接了 2019 年国际篮联篮球世界杯(2019FBWC), 核心目标是完成三种套票的运营及售卖。用户可选择的套票方案为:
1. 球队套票:可以观看指定球队比赛;
2. 城市套票:可以观看指定城市比赛;
3. 单日套票:可以观看指定日期(同时也指定城市)的比赛。
要知道,2019 FBWC 有 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 分解
配座是麦座与大麦票务中台融合的一次实践,也是大麦多年以来票务能力的资源整合。未 来大麦票务中台的机选能力可以开放给更多的业务方使用。
4. 如何做的更加通用?
设计之初,我们考虑到了业务的通用性,虽然不同票务系统的差异,不太可能通过一套实 现满足麦座、世界杯、票务云的需求,但是玩法是可以借鉴的,通过一套接口流程,可以将套 票玩法沉淀下来,后续其他票务系统有类似的玩法需求,仅需要实现接口就可以方便快速的克 隆套票玩法,因此我们将接口定义抽取了独立的业务插件(jar 包)。另一方面,使用插件而不 是独立应用,是因为配单和配座不可避免的要做权限校验,jar 包可以复用接入系统的权限体系, 这样工具只做核心的玩法部分,可以更聚焦。
图 7
效果以及未来展望
2019FBWC 总共 92 场比赛,共计进行了 5 轮配单配座,通过后续的业务数据检查,所有座位配置正确,无一错漏,配单配座工具将运营同学原本一周甚至更久的工作在十几分钟内搞定,达到了产品要求的准确、高效,效果得到业务方的认可。
大规模的配单配座在体育赛事中可能成为行业常态,事实上 2019 FBWC 的玩法也同时得到了亚运会、冬奥会等赛事的关注,配单配座工具采用的技术并不是阿里特有,同时由于我们采 用插件设计,也在一定程度上实现了可复用,方便的推广到其他票务平台。
【end】
欢迎所有开发者扫描下方二维码填写《开发者与AI大调研》,只需2分钟,便可收获价值299元的「AI开发者万人大会」在线直播门票!
推荐阅读全球呼吸机告急!医疗科技巨头美敦力“开源”设计图和源代码中国无人机“老炮儿”回忆录
互联网之父确诊新冠,一代传奇:任谷歌副总裁、NASA 访问科学家微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!在Kubernetes上部署一个简单的、类PaaS的平台,原来这么容易!2020年,这20个大家都认识的加密交易所过得怎么样?你点的每个“在看”,我都认真当成了AI
相关文章:

[转](不理想)Ubuntu下更改主显示器
参考链接:http://www.cnblogs.com/feng_013/archive/2012/03/05/2380111.html 查看显示器信息: fdmfdm-OptiPlex-780:~$ xrandr 设置主显示器 fdmfdm-OptiPlex-780:~$ xrandr --output HDMI1 --auto --primary 设置副显示器在主显示器右边 fdmfdm-OptiPl…

Nginx源码分析--数据对齐posix_memalign和memalign函数
posix_memalign函数() /* * 背景: * 1)POSIX 1003.1d * 2)POSIX 标明了通过malloc( ), calloc( ), 和 realloc( ) 返回的地址对于 * 任何的C类型来说都是对齐的 * 功能:由posix_memalign分配的内存空间&…

不要一辈子靠技术生存
今天看了一篇文章,感受挺深的,人的一生不能一辈子靠技术生存,尽管你的技术能力很强.(文章转载出处忘记,有哪位朋友知道的提醒一下)一、 在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你千万更不要认为哪些从事 市场开发,跑腿的人&am…
中国顶尖的技术社区们在一个群里,会聊什么…
* 文中表情包图片来自网络

矩阵中路径数目问题
在如下8*6的矩阵中,请计算从A移动到B一共有____种走法。要求每次只能向上或向右移动一格,并且不能经过P。 8*6的矩阵,从左下角A到右上角B,一共需要走12步,其中5步向上,7步向右,因此总的走法一共…
RANet : 分辨率自适应网络效果和性能的best trade-off | CVPR 2020
作者 | VincentLee来源 | 晓飞的算法工程笔记简介深度CNN带来了性能提升的同时也带来了过高的计算量,许多研究放在了如何进行网络加速上面,其中比较直接的是根据样本难易程度进行自动调整的自适应网络。基于对自适应网络的研究,论文提出了自适…

strcpy,memcpy和memmove区别
strcpy和memcpy都是标准C库函数,它们有下面的特点。 strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。 已知strcpy函数的原型是:char* strcpy(char* dest, const cha…

WinForm 读写配置文件
读配置文件 方法(1) //ConfigurationManager.RefreshSection("appSettings");stringsettingValue ConfigurationManager.AppSettings.Get("setting1");读配置文件 方法(2) Configuration config ConfigurationManager.OpenExeConfiguration(ConfigurationU…

PHP 读取数据库内容并以二维数组按指定列输出实例
最新PHP 读取数据库内容并以二维数组按指定列输出实例以下是三零网为大家整理的最新PHP 读取数据库内容并以二维数组按指定列输出实例的文章,希望大家能够喜欢!<?php$host "localhost"; //主机名$user "root"; //mysql用户名$passwor…
指针的本质2-void和void*及其应用在nginx中的应用
指针本质论指针有两个属性:指向变量/对象的地址和长度。 但是指针只存储地址,长度则取决于指针的类型,编译器根据指针的类型从指针指向的地址向后寻址, 指针类型不同则寻址范围也不同,比如: int*从指定地址向后寻找4字节作为变量的存储单元&…
首次揭秘!大麦如何应对超大规模高性能选座抢票?
作者| 阿里文娱技术专家恒磊、高级开发工程师新钱出品 | AI科技大本营(ID:rgznai100)背景介绍随着现场娱乐行业的不断发展,各类演出层出不穷,越来越多的演出开启选座购票满足用 户的自主选座需求。大麦的选座不仅面向中小场馆类的…

华为交换机密码恢复
华为交换机密码恢复说明:以下方法将删除原有config文件,使设备恢复到出厂配置。在设备重启时按CtrlB进入BOOT MENU之后,Press Ctrl-B to enter Boot Menu... 5Password : 缺省为空,回车即可1. Download application file to flash…
nginx源码分析--内存对齐处理
1.nginx内存对齐主要是做2件事情: 1) 内存池的内存地址对齐; 2) 长度按照2的幂取整.因为前面结构体已经是对齐了,如果后面的内存池每一小块不是2的幂,那么后面的就不能对齐 2.通用内存对齐理论 内存对齐:数据项只能…

七喜携手AMD,摆脱英特尔“潜规则”
七喜携手AMD,摆脱英特尔“潜规则”<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />最近,在PC市场随着七喜董事副总裁毛骏飙揭发英特尔制定的潜规则,“游戏规则都是英特尔制定的,全…
半小时训练亿级规模知识图谱,亚马逊AI开源知识图谱嵌入表示框架DGL-KE
出品 | AI科技大本营(ID:rgznai100) 知识图谱 (Knowledge Graph)作为一个重要的技术,在近几年里被广泛运用在了信息检索,自然语言处理,以及推荐系统等各种领域。学习知识图谱的嵌入表示 &#x…

数组的各类排序
1 package sort;2 3 /**4 * 数组的各种排序操作5 * Created by liuwei on 16/3/6.6 */7 public class MSort {8 9 /**10 * 直接插入排序11 * 外层一个循环,从第2个元素开始(下标为1),遍历后面的所有元素12 * 内层一个循环,从当前位置position i 开始,每次…
Virtualbox安装使用注意
1.VirtualBox升级到4.3以后不能打开 提示创建 COM 对象失败 应用程序将被中断 解决方案:右键VirtualBox的桌面快捷方式,选择属性,选到兼容性选项卡,勾选“以兼容模式运行这个程序”,下拉框选择Windows Server 2008 …
机器学习项目模板:ML项目的6个基本步骤
来源 | DeepHub IMBA每个机器学习项目都有自己独特的形式。对于每个项目,都可以遵循一组预定义的步骤。尽管没有严格的流程,但是可以提出一个通用模板。准备问题不仅是机器学习,任何项目的第一步都是简单地定义当前的问题。您首先需要了解背景…

ib_logfile 在数据库中有何作用?
ib_logfile 在数据库中有何作用? ib_logfile0/ib_logfile1 文件在数据库中起什么作用? 如果被删除,对数据库有何影响? ----->>>>>>>>>>> 回复 #1 mugua_xinli 的帖子 用于存放InnoDB引擎的事…

Podfile 常见语法
source URL : 指定镜像仓库的源 platform : ios, 6.0 : 指定所支持系统和最低版本 inhibit_all_warnings! :屏蔽所有warning workspace 项目空间名: 指定项目空间名 xcodeproj 工程文件名:指定xcodeproj工程文件名 …

今天学完了ccna
通过10天的学习,终于学完了NA,但是会不会呢?还是个未知数,再就也一知半解的。觉得基础知识太差了,可是看书,又觉得太长了,太多了,晚上老是停电 白天啥也看不进去。热。还是静不下心&…
攀登数据科学家和数据工程师之间的隔墙
来源 | 数据派 THU机器学习的教育和研究重点往往集中在数据科学过程的模型构建、训练、测试和优化等方面。要使这些模型投入使用,需要一套工程专长和组织结构,对于其中的标准尚不存在。有一个架构可以指导数据科学和工程团队相互协作,从而将机…

js变量以及其作用域详解
2019独角兽企业重金招聘Python工程师标准>>> 一、变量的类型 Javascript和Java、C这些语言不同,它是一种无类型、弱检测的语言。它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变…
在A*寻路中使用二叉堆
在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序: 这一篇文章,是“A* Pathfinding for Beginners.”,也就是我翻译的另一篇文章A*寻路初探…
“Hey Siri” 背后的黑科技大揭秘!
作者 | Vishant Batta译者 | 苏本如,责编 | 伍杏玲出品 | CSDN(ID:CSDNnews)以下是译文: 如今苹果手机可随时检测并回答“Hey Siri”命令,有人可能会想,它是不是在随时记录我们的日常生活对话呢…

[ASP.NET4之旅]Circular file references are not allowed
将ASP.NET 2.0的项目升级到ASP.NET 4后,用VS2010编译站点,某些控件出现编译错误“Circular file references are not allowed”,比如: <% Control Language"C#"ClassName"NewsRight"%>解决方法…

IOS-XMPP
一、即时通讯技术简介 即时通讯技术(IM -- Instant Messaging)支持用户在线实时交谈。如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容有许多的IM系统,如AO…

libcurl使用
官网:http://curl.haxx.se/libcurl/c/libcurl-tutorial.html #curl-config --libs 得到 -lcurl #cc libcurl_test.c -o libcurl_test -lcurl 所有的例子:http://curl.haxx.se/libcurl/c/example.html 例子: /***********************…

RH5.4下samba共享配置实例(3)
一、基于用户名的访问控制实例: 王乾大哥写的比较详细了,我是跟着他的教程学习的,按照他的教程走一边; 要求如下: 1、创建一个公共的交换文件夹,所有人都可以写入删除,但不能删除修改其他人的文…

《评人工智能如何走向新阶段》后记(再续21)
346.中国抗疫十大黑科技(以人工智能为主力的黑科技) 摘自数邦客(2020.3.30发布) 负压救护车 人工智能机器人:如送餐机器人、消毒机器人、服务型机器人,及机器人呼叫等呼吸道病毒核配检测试剂盒…