写点什么

电影票房数据查询服务高性能与高可用实践

  • 2020-03-24
  • 本文字数:2498 字

    阅读完需:约 8 分钟

电影票房数据查询服务高性能与高可用实践

灯塔是阿里大文娱旗下一站式宣发平台,同时也是阿里巴巴为数不多对外提供数据的数据平台。作为数据平台,数据的时效性和准确性一直技术需要突破的重点和难点。

一、技术挑战

灯塔数据系统(前身淘票票专业版)从 2017 年开始建设,最开始采用 MYSQL 作为数据存储,基础数据定时计算写入数据库,经过 2 年多的建设,产品已经基本成形,但对于数据的实效性有了更高的要求,由于影院单日售票在 3000W 张,预售将近 1 亿张票,计算量大,写入频次高,从感知影院售票到客户端呈现数据,采用什么样的方案,什么样的技术,能够通过最小的改动让数据最快的呈现出来,成了技术考虑的难点。

二、技术策略

首先是缩小数据量,找出数据规律,实现数据的实时计算,各维度数据汇总如图:



(图片:灯塔专业版数据汇总关系图)


各维度数据在业务应用的场景中,均可以按照时间、地区、业务主键进行检索,根据这个特征,我们生成了天然的 Key 组合,时间、地区、业务主键,并排列组合出三种 Key:时间_地区_业务主键,时间_业务主键_地区,地区_业务主键_时间。按照以上三种 Key 组合,在已知任何两个条件的情况下,均能实现对业务数据的检索。此时我们已经锁定了数据的存储平台 HBase。剩下的就是如何改造系统实现实时化。

三、落地方法

数据源有了,MYSQL 和 HBase,HBase 是实时数据,MYSQL 是离线数据,为了让上层业务无感知,特在底层数据做处理,实现离线数据和实时数据的结合,数据处理流程如图:



(图片:灯塔专业版数据处理流程图)


用户在请求票房数据的时候,先根据业务开关,决定请求实时数据还是离线数据,离线数据直接请求 MYSQL。实时数据,优先查询缓存,若缓存存在且不过期,直接返回缓存数据。缓存数据失效的情况下,查询 HBase,重新写入缓存。


系统日常还是有上千的 QPS,为了防止缓存击穿,对数据源造成压力,需要对热数据进行缓存预热。由于数据的特殊性,T 日为最热数据,占到总流量的 80%以上,这时候,缓存预热成了承受高并发访问的关键。定时任务每秒将 T 日数据整体刷入缓存,防止缓存失效击穿(因为都是 key-valu 存储,后续考虑热数据直接写入缓存,直接替代预热方案)。其实为了防止击穿,这部分数据是 24 小时不过期的,数据的更新是依赖定时任务的,一但数据链路故障、HBase 故障或算法异常,只需要停止定时任务,就能暂时止血,给技术留出处理时间不至于故障升级。同时 HBase 做了主备链路,而且主链路和备用链路的的算法略有不同,保证主备链路不会同时出问题。这样的架构,对于应用而言,就有了 4 套不同的数据源做保证的。架构上线至今,数据未曾出现一次问题。而且无形中解决了高 QPS 的问题,数据的提供主要依靠 TAIR,而缓存应对 QPS 就显得简单的多了。



(图片:灯塔专业版数据源关系图)


系统的难点在于实时数据和离线数据的结合。数据结合共分为以下几类:


  1. T 日查询,非实时即离线,如查询今日大盘票房;系统首先定义了一个方法,根据日期判定数据应该查询实时还是查询离线,由于行业数据是按照 6 点到 6 点,即 T 日数据,在第二日 6 点后才变为离线数据,且由于专资办数据回刷的问题,防止数据回跳,会在数据回刷后才切换为离线数据。当查询单日数据时,针对查询日期,判定数据源,进行数据转换;

  2. 日期范围查询,即有实时又有离线,如查询影片每日票房情况;当查询日期范围时,由于日期范围时连续的,特将范围日期拆散成每一天,按照方法 1 中的判定规则,切分日期范围为离线日期和实时日期,然后数据源根究日期范围取最小日期和最大日期进行范围查询,查询后进行数据组合后返回数据;

  3. 范围统计,离线+实时,如本周票房;当进行范围统计查询时,首先去离线数据,然后根据日期判定,如果 T-1 数据还未回刷,则去 T-1 和 T 日数据,否则只去 T 日数据即可,将实时数据和离线数据进行加和,返回查询数据结果;

  4. 榜单查询,离线补实时,如影片榜单。榜单查询由于榜单数据范围不好确定,范围查询有可能查询数据太多,所以在查询排行榜时,先取离线数据 2 倍的数据量,然后根据离线数据返回业务主键,查询当前的实时数据,将实时数据覆盖到离线数据后,进行内存排序和截取,最终返回榜单数据。榜单数据略有不同,比如院线影片,由于全国院线一共 49 家,此时不做离线查询,直接查询所有实时数据进行排序。


针对以上数据整合的各种可能,参照以往出现的各种问题,封装代码如下:



(图片:示例代码 1)



(图片:示例代码 2)


通过以上处理,在上层业务无感知的情况下,下游数据实现了整体实时化的切换。而且通过 switch 开关控制针对数据源能够实现单业务主备切流,实时离线数据转换,使得数据的稳定性更可靠,为底层数据改造和升级留下了充足的扩展空间。


有了架构还不够,还需要感知能力,业务异常感知还是比较简单的,但是对于灯塔来说,有数不代表正常,数据到底对不对,这是问题感知的关键,这时候需要一个智能化的监控系统。针对票房数据,在不改造代码的情况下,我们设计了一个切面,引入脚本代码,针对特定数据来源做数据动态处理,将返回数据整合在一起,并提取出来,通过算法识别票房数据行为趋势,如图:



(图片:灯塔专业版票房监测趋势图)


针对数据的趋势做智能化监控,当数据异常变化或者超过业务限定范围,就会通知告警,以此来有效的规避数据异常的情况,并能及时感知问题。

四、总结沉淀

随着 B 端业务的发展,数据的作用越来越大,在海量数据存储和更新的需要下,关系型数据库已经越来越无力,各种类型的数据存储起到了不同的作用,多数据源的整合也越来越重要。本文介绍了灯塔为了做到实时的数据系统,是如何组合 Mysql、Hbase、Tair 三个数据源来实现高写入,高并发、高可靠的数据系统,希望能给后续更多的业务系统提供参考和指导。


作者介绍


阿里大文娱高级开发工程师 奋氛


相关阅读


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


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


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


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


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


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


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


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


前端技术:Webpack 工程化最佳实践


2020-03-24 10:001215

评论

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

《零基础学 Java》 FAQ 之 11-为什么构造方法中调用重载的构造方法必须得是在第一行

臧萌

2020 年 5 月 23 日 Java 集合专题

瑞克与莫迪

Java

Tekton 的工作原理

张晓辉

Kubernetes cicd 云原生

Flask-SQLAlchemy 多表对单模型

Leetao

Python flask 编程语言 flask-sqlalchemy

new() 和 make的区别

陈思敏捷

源码 源码分析 Go 语言

你是个伪工作者么?

池建强

个人成长 伪工作者

我的编程之路 -5(停滞)

顿晓

网络编程 操作系统 编程之路 停滞 三年

云直播平台的选型与使用

音视频专家-李超

Mysql增量更新-ON DUPLICATE KEY UPDATE

BerryMew

MySQL 增量更新 ON DUPLICATE KEY UPDATE

Go: g0, 特殊的goroutine

陈思敏捷

原理 Go 语言

区块链2.0--以太坊概述

皮卡丘的猫

《零基础学 Java》 FAQ 之 10-Scanner里nextInt的小坑

臧萌

Java

利与弊-传统框架要不要部署在Serverless架构上

刘宇

Serverless Web

Java环境搭建

编号94530

Java java8 Java环境 环境安装 jdk安装

python实现·十大排序算法之插入排序(Insertion Sort)

南风以南

Python 排序算法 插入排序

k8s上运行我们的springboot服务之——cloud gateway

柠檬

k8s Spring Cloud

JUC整理笔记一之细说Unsafe

JFound

Java

看完这篇 Session、Cookie、Token,和面试官扯皮就没问题了

苹果看辽宁体育

https

RocketMQ - 什么是RocketMQ

Java收录阁

RocketMQ

游戏夜读 | 怎么让游戏跑起来?

game1night

Go: Trace包探秘

陈思敏捷

原理 Go 语言

python实现·十大排序算法之快速排序(Quick Sort)

南风以南

Python 排序算法 快速排序

除了直接看余额,谁更有钱还能怎么比(一)

石君

零知识证明 多方计算 同态加密

谈谈控制感(8):元控制感

史方远

职场 心理 成长

工作=投资=创业?

二鱼先生

个人成长 工作思路 工作方式 创业心态 创业者

Go: 应该使用指针还是结构体副本?

陈思敏捷

struct 原理 pointer Go 语言

圆圈正义 - 读后感

石云升

读书笔记 法律 公平 现实

prometheus中honor_labels配置项的源码分析

陈思敏捷

Prometheus Go 语言

《零基础学 Java》 FAQ 之 12-理解引用

臧萌

Java

其实你就是我羡慕的别人

小天同学

个人成长 感悟 日常思考

我是如何拿下PMP认证和系统架构设计师考试的?

Nick

电影票房数据查询服务高性能与高可用实践_文化 & 方法_阿里巴巴文娱技术_InfoQ精选文章