精选30+云产品,助力企业轻松上云!>>>

点击蓝色“大数据每日哔哔”关注我

加个“星标”,第一时间获取大数据架构,实战经验



摘要:由于影院单日售票在 3000W 张,预售将近 1 亿张票,计算量大,写入频 次高,从感知影院售票到客户端呈现数据,采用什么样的方案,什么样的技术,能够通过最小 的改动让数据最快的呈现出来,成了技术考虑的难点。主要内容包括:

  1. 技术挑战

  2. 技术策略

  3. 落地方法

  4. 总结沉淀

  5. 专业名词解释

作者: 阿里大文娱 | 奋氛

背景

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

一、技术挑战

灯塔数据系统(前身淘票票专业版)从 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 三个数据源来实现 高写入,高并发、高可靠的数据系统,希望能给后续更多的业务系统提供参考和指导。

专业名词解释:

Tair 是一个高性能、分布式、可扩展、高可靠的Key-Value nosql结构存储系统,专注于高速缓存场景。

HBase 是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。

缓存击穿:通常我们在使用缓存时都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。

查询一个数据库中不存在的数据,比如商品详情,查询一个不存在的ID,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成过大的压力。

当通过某一个key去查询数据的时候,如果对应在数据库中的数据都不存在,我们将此key对应的value设置为一个默认的值,比如“NULL”,并设置一个缓存的失效时间,这时在缓存失效之前,所有通过此key的访问都被缓存挡住了。后面如果此key对应的数据在DB中存在时,缓存失效之后,通过此key再去访问数据,就能拿到新的value了。

▼ 更多实战技术文章 ▼


日均万亿条数据如何处理?爱奇艺实时计算平台这样做

58全站用户行为数据仓库建设及实践

kafka 在 360 商业化的实践

干货 | 携程机票数据仓库建设之路

干货 | 携程Hadoop跨机房架构实践

(完)


专注大数据技术、架构、实战

关注我,带你不同角度看数据架构

本文分享自微信公众号 - 大数据每日哔哔(bb-bigdata)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

  1. 容器云平台、灰度发布系统、微服务网关的高可用实践

    http://www.sohu.com/a/227223771_355140 系统高可用是互联网企业系统架构的基础要求之一,一个好的高可用架构可以以最低的成本.更灵活的方式,满足企业用户需求.相反,糟 ...

  2. 十年电影票房数据爬取与分析 | 免费数据教程

    3月8日妇女节,我很期待的超级英雄电影<惊奇队长>上映了,票房表现很快过亿,但大众口碑却让人失望. 一个有趣且常见的现象是,隔壁获奖无数,口碑爆炸的<绿皮书>,票房却远远不如& ...

  3. python电视剧口碑分析_用Python分析IMDB历届电影票房数据(上)

    一.我们需要什么结论? 我们首先要做的就是定义我们想要的结论.那么根据这份IMDB网站上提取的100年间,65个国家,4937部电影数据,我们想要分析什么呢? 根据我的框架我想知道的结论有以下几点:电 ...

  4. python实现的、带GUI界面电影票房数据可视化程序

    代码地址如下: http://www.demodashi.com/demo/14588.html ##详细说明: Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从 ...

  5. python实现的电影票房数据可视化

    代码地址如下: http://www.demodashi.com/demo/14275.html ##详细说明: Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从 ...

  6. CnOpenData中国电影票房数据简介

    目录 一.数据简介 二.样本时间 三.字段展示 四.样本数据 五.数据更新频率 六.联系我们 一.数据简介 随着社会经济发展,文化产业日益繁荣,根据美国电影协会发布的电影市场数据报告显示:仅在2016 ...

  7. python爬虫实战三:近十年中国电影票房数据爬取与分析

    近十年中国电影票房数据爬取与分析 前言 爬取 分析 十年top10 年度top5 每年电影数 每年总票房 二八原则 代码与数据 前言 这篇文章主要讲述的是近十年(2010-2019)中国电影票房数据的 ...

  8. 手把手教你用Python爬中国电影票房数据

    我发现自学Python数据分析的一个难点是资料繁多,过于复杂.大部分网上的资料总是从Python语法教起,夹杂着大量Python开发的知识点,花了很多时间却始终云里雾里,不知道哪些知识才是真正有用的. ...

  9. 项目三:近10年来中国电影票房数据爬取分析

    近10年来中国电影票房数据爬取分析 前言 数据采集与存储 数据清洗和简单分析 引入库,导入数据 近10年top 年度top5 每年电影数 每年总票房 结论 二八原则 end 点击跳转到总目录 前言 这 ...

最新文章

  1. 虽未达到科幻中的未来,人工智能革命仍已到来
  2. 网络爬虫框架cetty的实现
  3. bootstrap-daterangepicker插件运用
  4. 【无人机】他把死去的猫做成无人机,网友愤怒了!
  5. 2019胡润全球富豪榜发布:最有钱的华人还是他!
  6. k8s核心技术-持久化存储(PV和PVC)---K8S_Google工作笔记0051
  7. 《如何搭建小微企业风控模型》第十二节 模型检验 节选
  8. VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结...
  9. 传递给 left 或 substring 函数的长度参数无效_MySQL:函数入门实例
  10. ELK之ES-Logstash-Kibana互联
  11. Flink DataStream 关联维表实战
  12. JDK 1.8 新特性学习(Stream)
  13. 用户故事与敏捷方法 - 第二章 编写故事
  14. 安卓耳机左右音量调节_安卓/IOS系统通用耳机调音PCBA 按键调节音量 一键转换三星苹果...
  15. 【数据结构】串(定长顺序串、堆串、块链串)的存储结构及基本运算(C语言)
  16. 项目总结报告(小米商城)
  17. 这个地图绘制工具太赞了,推荐~~
  18. 红警2你值得拥有(游戏人生)
  19. lucene 分词源码分析
  20. Sigmoid函数以及传统线性函数

热门文章

  1. EmptyPage(空白页组件)原理与使用
  2. CentOS6.9安装Kafka
  3. eclipse黑色主题
  4. 浏览器安全与MSAA
  5. Docker storage driver(十四)
  6. laravel修改.env不生效原因以及解决办法
  7. TypeScript 元组(Tuple)
  8. Spring教程 - Spring核心框架教程
  9. Django---启动admin的报no such table: auth_user错误
  10. linux 系统文件目录颜色及特殊权限对应的颜色