本文基于大麦票夹过去工作以及未来思考总结而成。按基础电子票功能、行业无纸化、服务化的三个阶段阐述了大麦票夹的发展及背后技术架构的变化。希望以此引发大家一起思考:技术架构如何提前布局以满足业务在不同阶段的要求。

一、背景 - 什么是票夹

票夹,顾名思义,装票的小夹子。在大麦 APP 这个曾经工具性很强的应用中,承担起了电子票收录和使用的功能。

用户在大麦购买一张演出票,如果是电子票,出票后用户就可以在票夹找到这张票,看到票的场次、看台、座位号等基本信息。在入场的时候,可以展示票的二维码信息给验票设备,扫码验证通过后即可入场。
图 1

从上图可以看出来,为了方便使用票,所有票是按场次组织在一起的;如果该演出场次可以换纸质票,会有换票点的位置引导;在验票后会更新票的状态……

可以说,最初票夹的所有功能和交互设计都是为了方便用户行使最基本的使用权利。这也是第一阶段票夹所做的主要工作。下面从第一阶段开始介绍票夹的发展历程。

二、电子票基本服务

票夹第一阶段的重点是实现电子票服务的基本功能和可靠性。

基本功能很好理解,电子票如何加密,在 APP 侧的二维码如何生成;在验票端如何校验二维码是有效的。

为了利用好阿里生态,在大麦 APP 落电子票的同时还向用户的支付宝卡包中落入电子票,让用户不但可以使用大麦 APP 入场,还能使用支付宝卡包入场。

下图系统的描绘了大麦票夹的电子票基本服务。其核心还是二维码电子票部分,稍详细介绍一下。

图 2

1. 动态二维码

二维码电子票分静态二维码和动态二维码。

静态二维码就是一个固定的码,实现简单,但是安全性较低,如果二维码被拍照或者截图,理论上相当于这张票被复制了。

动态二维码在整个产票落票过程进行了多重签名和加密,在端上还通过算法结合 APP 环境进行了动态加密生产可变化的二维码,有效防止票被复制。

目前大麦主流使用动态二维码模型的电子票,在大麦 APP 和支付宝卡包同样支持。

2. 客户端本地化缓存

在现场验票的场景下,需要面对一些极端条件,其中之一便是用户手机的无线网络。目前 4G 网络已经普及,但是在大型演唱会的时候,场馆附近会聚集大量的人,每人一个手机很轻松就超过了 4G 基站的承载能力,导致现场用户手机端的网络很差或者几乎处于无网状态。

如果该演唱会采用电子票入场的方式,那就是场灾难,大批用户因为打不开大麦 APP 中的电子票无法验票入场。针对这种情况,大麦 APP 采用了客户端本地化缓存的方案。

APP 将请求过的票数据保存在本地数据库中,只要用户曾经在 APP 中打开过这个电子票,以后即时没有网络,也能从本地数据库中把票读取并展示出来。

但是电子票可能并不是下单完成后立刻出票的,也就意味着用户不一定有机会亲手点开电子票,我们采用的方法是在真正落票的时候,给 APP 端一个推送消息(通过长连接通道),APP 接收消息后会从后台拉取电子票保存到本地。

3. 票的状态实时更新

这其实是用户体验的提升点,即在验票扫码后,用户 APP 上的二维码立刻被打一个“已使用”的戳。

看似很简单的一个功能,其实需要全链路的配合。

首先,验票端在现场网络不是那么稳定的情况下,需要及时的将验票状态发送到验票服务系统;

其次,验票服务系统需要把状态更新告诉票夹;

再次,票夹需要通过长链接通道将票状态的变换推送到大麦 APP。

全链路整体延迟需要控制在 2 秒左右,再长用户就没机会看到实时状态变换了。
图 3

4.转赠

转赠服务是推广电子票特别是动态二维码形式的电子票必不可少的服务,是纸质票体感在电子票领域的自然延伸。

设想 4 个人相约去看一场球赛,其中一个人买了 4 张纸质票,因为座位不是连续的,入场时间不同,入场口可能也不一样,所以需要把票分给每个人,大家各自持票入场。

如果是电子票也存在这个场景,总不能大家先后用同一个人的帐号登录大麦 APP 入场,最自然的做法就是购票人将电子票以转赠的方式分发给每个人,大家各自持 APP 入场。

用户下单购票的时候,票和订单是绑定的,但是到转赠的时候,票和订单就无关了,只是持有人的信息发生了变换。

这里票夹维护了当前票和用户之间的关系,即一张票当前的所有人是哪个用户。
图 4

三、行业化

整个演出市场的总票量中大麦占了很大比重,可以将整体演出市场的票分为三大部分:

1)大麦自产的票;

2)大麦的部署给场馆方的麦座系统生产的票;

3)其它公司产票系统生产的票。

大麦票夹最初实现的电子票服务只是针对大麦自产票这一部分。但是要成为电子票的先行者,需要对整个行业的无纸化体验产生足够影响力。为了实现这个目标,大麦票夹需要具备开放性,能落其他票仓生产的票。

1. B 端多商户的支持

对于票夹来说,一个非大麦的商家就是一个入驻商户,独立产票,并使用票夹提供的电子票能力,同时又彼此隔离(数据和配置都隔离)。要做到这一点,需要解决很多问题。

1)统一的数据模型和开发接口(OpenAPI)

在面向大麦自产票的时候,因为只有一个用户,票夹专门设立了一个接入层应用来做票的接入。这个应用监听交易发出的消息,并查询产票系统获取票的详细信息,同时还查询场次、场馆等信息最终落票。但是在支持多商户后,票夹不可能针对每个商户都去了解对方的下单、产票逻辑来做票的接入。可行的办法是定义一套统一的接口和模型,由商户自己决定何时落票,自己按票夹的要求组织好相关信息,票夹只做信息完整性的校验。
图 5

2)商户间的分销关系

这里之所以叫商户而不是租户,是因为商户之间是可以有关联的,并不是简单的增加一个商户 ID 做隔离就一切 ok 了。

例如,商户 A 是产票方,除自己卖票外,还把票卖给商户 B、商户 C。大家落票的时候都是各自落入票夹,但是这些票是同一个场次的,商户 B 和商户 C 只需要使用产票商户 A 的场次信息即可,场次相关的配置也可以复用一套。

在行业票夹中就做了这样的支持,可以让商户直接复用产票方的场次数据,从验票系统的角度,只有一套场次,那就是产票方的场次数据,与验票相关的信息要与产票方保持一致。

图 6

2. C 端页面的复用与隔离

前面提到了,当电子票落入票夹,实际上就和订单没太大关系了,票夹主要维护的是用户和票的关系。而每个商家都是有自己的用户体系的,商户的隔离同时也要求 C 端用户的隔离。

大麦票夹是通过一套定制化的 OAuth 协议完成各商户的用户对票夹访问时的鉴权和数据隔离的。

图 7

四、聚焦服务

1. 为什么要聚焦服务

前面介绍的两个阶段,一个是提供基本的电子票服务,另一个是将基本的电子票服务推广到更多的用户。虽然对 B 端实现了平台化,但对 C 端始终还没有脱离一个工具化应用的范畴。

票夹这块阵地除了是用户使用票的入口,更是用户和演出方 / 场馆的连接点,我们的用户如果仅仅在入场或者换票的时候才进入票夹,那其实是巨大的浪费。

对用户来说,我们可以通过票夹让其在观演前后享受到更贴心的服务;对场馆 / 主办来说,可以通过票夹触达用户、了解用户、挖掘更多周边的价值。这两点如果做好,不但让我们的用户更有粘性,而且还会吸引更多非大麦的用户使用大麦 APP,进而转化成大麦的用户。

因此票夹需要从一个工具型的功能模块进化为一个服务的载体,串联整个用户购票、观演的生命周期,打通阿里生态甚至外部服务。

图 8

2. 票夹服务周期和对象的拓展

用户观演的整个周期并非始于演出开始的那一刻,从用户有观演的打算开始,这个周期就开始了,一个用户可能经历了想看、决定购票、下单、等待出票、筹划出行观演、出行、入场、观演、观演后这样一个漫长的周期,这个周期可能长达一个月甚至几个月,这是和看电影有巨大区别的地方。

图 9

一个工具化的票夹是服务于“购票后”和“观演”这两个阶段。而一个服务化的票夹是可以向前和向后拓展的,设想用户在未下单的时候就可以通过关注等方式为用户在票夹创建一个场次卡片,虽然还没有买票,用户已经可以开始享受服务了。即使用户没有选择在大麦买票,依然可以享受后续的一系列服务。

当票夹服务化之后,就不仅仅满足提供电子票功能了,购买纸质票的用户一样可以在票夹展示一个服务卡片,重点聚焦在服务上。这就对票夹的业务模型和架构提出了新的要求:

  • 从一开始的处处以票为中心进化到以演出卡片为中心,服务开始的起点从落票变为了用户创建一个场次卡片;
  • 整个服务周期的不同阶段,为用户提供不同的观演服务。

图 10

3. 观演服务组件化

当票夹的服务周期和对象都做了扩展,必然需要引入更多样化、个性化的服务。票夹在架构上需要支持大量服务的接入能力,同时可以在每个观演周期动态化、个性化的提供给用户使用。

我们希望对票夹的观演服务进行组件化设计,组件化这个概念很大,总体来说是关于软件模块的封装、定制和复用,在不同领域有不同的解释,这里不想对组件化展开讨论,但是针对票夹有必要思考清楚组件化的内涵和外延。票夹的观演服务组件化关乎如下几点:

1)观演服务的抽象与封装。

  • 票夹本身并不实现这些服务,而是服务的搬运工,充当整合与桥梁的作用为主。对于整合与桥梁这个目的,我们是可以将五花八门的观演服务进行抽象和归类的,这样票夹可以通过对少数几种模型的支持来快速接入各种个样的观演服务。比如,服务可以抽象为类
    banner 跳转类、信息透出类、三方客户端 SDK 类等几种类型。
  • 前后端对每种类型的组件数据定义、展示和逻辑的封装。

2)每个观演服务组件是可以跨商家、跨场次、跨场景复用的。

图 11

  • 组件是观演服务的最小单位,整个票夹平台维护所有支持的服务组件,每个商家可以定制自己支持的服务组件列表。每个观演服务组件之于一个商家是可以订制的,可订制的范围被明确定义并将操作接口暴露给商家。
  • 每个观演服务组件之于一个场次是有实例化数据 / 配置的,这部分数据 / 配置每个场次都可以不同。
  • 组件在 APP 出现的场景是可以订制的,可以出现在场次列表,也可以出现在场次详情;可以出现在观演前阶段,也可以出现在观演结束之后。

3)服务组件是能够支持个性化的。

针对不同的用户类型、推荐不同的观演服务。端上给用户展示的观演服务都有哪些,顺序是什么是可以进行个性化控制的。

4. 服务的接入

这部分主要是 B 端的范畴,我们的服务提供方可以是大麦(换验、转赠这种基本服务),也可以是第三方。第三方又可以进一步分为阿里系的服务提供方和阿里外的服务提供方。

  • 对于第三方的服务,是需要进行入驻管理的,入驻可以限定服务露出的目标组件、人群、项目类型、场馆等等条件,甚至可以千人千面;
  • 对于阿里外部的服务提供商,进行服务整合是需要外接的,及彼此接口级的互通。这部分也是可以与三方体系打通,通过统一的外接平台实现服务整合。

五、总结

本文从电子票基本功能展开,拓展到行业无纸化以及未来的服务化,思考和总结了票夹在其中的作用及应具备的技术能力。这些都是基于过去的环境和技术趋势,而对于未来,随着大的行业环境的变化以及技术趋势的改变,需要持续的创新,这里抛出几个问题请读者一起思考一下:

  • 基础的电子票能力从安全性、可靠性和便利性方面是否还有改进的空间?
  • 行业无纸化的推进过程,如何做到对不同票库进行电子票能力的输出?
  • 在行业电子票验真和票流转方面,如何形成行业公信力?
  • 围绕电子票,如何将服务更有效的串联在一起,为用户、场馆、内容方提供更大的价值?

作者简介:

阿里文娱技术专家 义豪

大麦票夹:从工具到服务的技术演进之路相关推荐

  1. 消息推送技术干货:美团实时消息推送服务的技术演进之路

    本文由美团技术团队分享,作者"健午.佳猛.陆凯.冯江",原题"美团终端消息投递服务Pike的演进之路",有修订. 1.引言 传统意义上来说,实时消息推送通常都是 ...

  2. 力谱宿云秦鹏:MaxLeap云服务基础架构演进之路-CSDN公开课-专题视频课程

    力谱宿云秦鹏:MaxLeap云服务基础架构演进之路-4058人已学习 课程介绍         MaxLeap从一个对内的私有云服务平台,发展到对外服务的BaaS平台,其功能覆盖了移动领域开发.运营的 ...

  3. 华为架构师8年经验谈:从单体架构到微服务的服务化演进之路

    本次分享的技术大纲如下: 传统应用开发面临的挑战 服务化实践 服务化不是银弹 服务化架构的演进方向 一 .传统应用开发面临的挑战 挑战1-- 研发成本高 主要体现在如下几个方面: 代码重复率高 在实际 ...

  4. 服务治理在猫眼娱乐的演进之路

    现实业务背景下的挑战 我们开篇之前,我们先来讨论一个问题,我们谈到服务治理的时候,说的其实是什么呢?我们认为,服务治理的关键要素在于两点,人和系统,我们在系统层面希望服务能够按照业务愿景和架构师的理念 ...

  5. Service Mesh(服务网格)技术演进

    文章目录 什么是服务网格 微服务及服务网格技术演进 服务网格演进总结 参考 什么是服务网格 用一句话简单概括什么是Service Mesh,可以将其比作是应用程序或者说微服务间的TCP/IP,负责服务 ...

  6. 文本分析软件_十大针对机器学习的文本注释工具与服务,你选哪个?

    房地产和键 [51CTO.com快译]目前,从搜索引擎与情感分析,到虚拟助手与聊天机器人,机器学习应用场景中的许多研究领域,都需要通过文本注释工具与服务来提供准确性.在AI研究与开发行业中,发现或创建 ...

  7. 开发环境与工具部署服务_开发与部署之间的区别

    开发环境与工具部署服务 多年以来,我是一名Smalltalk程序员,这种经验使我从不同的角度来观察编程世界中的思想. 例如,将源代码存储在文本文件中的想法已经习惯了一些. 作为程序员,我们经常在&qu ...

  8. 爬虫工具和服务——Python之外的选择

    转载自公众号:FightingCoder 在之前介绍过很多爬虫库的使用,其中大多数也是 Python 相关的,当然这些库很多都是给开发者来用的.但这对一个对爬虫没有什么开发经验的小白来说,还是有一定的 ...

  9. vs2015web开发_2015年最佳10+ Web开发工具和服务

    vs2015web开发 If you're looking to boost your productivity using awesome web tools and services, you'v ...

最新文章

  1. 让文本垂直居中的几个方法
  2. 2022.2.21显示器连接器引脚信号定义1
  3. datatables插件AJAX请求数据报错Uncaught TypeError: Cannot read property ‘length‘ of undefined
  4. 【转】Tomcat+MyEclipse
  5. 基于Verilog的4-PAM
  6. ubuntu文件右下角有锁的图标
  7. jhipster初接触
  8. webpack和 php配合,javascript - webpack和laravel-elixir-webpack的正确配合方式?
  9. 【Spark重点难点】你的数据存在哪了?
  10. CCNA-静态路由实验
  11. Learning through Auxiliary Tasks——辅助任务学习or自监督学习中的pretext
  12. [NOI2003] 文本编辑器
  13. 继续谈下脑残的NODE_MODULE_VERSION,全世界冷眼看着electron
  14. 三聚氰胺最新价格,创2017年以来价格新低
  15. arduino 土壤温湿度传感器_怎样将Arduino与土壤湿度传感器FC-28连接起来
  16. 广电系统三八红旗集体推荐材料_三八红旗集体事迹材料
  17. 汽车车门振动变形测量
  18. 比较简单的nginx搭建静态资源linux服务器教程
  19. ibernate、EJB3和JPA简介
  20. python群发手机短信_Python实现向手机号发送短信

热门文章

  1. 金庸小说人物知识图谱构建——以《雪山飞狐》为例
  2. 云洲智能,能否成为科创板无人船艇第一股?
  3. Hadoop大数据系列组键-部署
  4. 让你的工作事半功倍的语音转文字转换器
  5. 小程序中实现拍照,自拍功能
  6. 广告学本科--现代管理学--[00107]
  7. PHP面试题2021和2022面试、跳槽必备大全!
  8. Java代码给csv文件加水印_如何给CSV数据包的图片批量加上水印
  9. 做一个精致的电子工程师
  10. DataFrame入门丨Pandas数据分析基础(4)