阿里终面:业务主表读写缓慢如何优化?

简介: 阿里终面:业务主表读写缓慢如何优化?

大家好,我是不才陈某~

无论多么复杂的业务场景,一条数据的一生都体现在CRUD操作上,正是创建查询修改删除。正如人的生死轮回,数据亦是如此,一条数据随着时间的流逝,其价值也是在逐渐变小。

数据存在的价值则是在于它被使用的程度,在不同的系统中,人们对于不同时期的数据有着不同的需求。

比如12306携程上的火车、机票订单,人们往往只关注30天之内的订单,而携程正是默认只保留30天的订单信息,超过30天的订单需要通过手机号查找。

携程订单

携程为什么要这么做?

其实仔细想想不难明白,作为全国购票平台,每年数以亿计的订单,如果全部能够开放操作(CRUD),那么系统将会瞬间崩溃

一个订单走到终态的标志则是这笔订单的完成,也就意味着这笔订单除了查询的需求,不再任由用户修改、删除。

其实携程所用的架构方法正是:冷热分离

什么是冷热分离?

冷热分离则是在处理数据时将数据库分为热库冷库两个库。冷库存放的是走到终态的数据,热库存放的是还需要修改的数据。

比如30天之内的机票、火车票订单,用户可能需要对这期间的订单做出退票开发票的操作,但是30天之前订单却只有查询的需求,因此可以将30天之内的订单放到热库中,之前的订单存放到冷库中。

那么这里又引出了两个概念,分别是:

  • 热数据:被频繁更新;响应时间有要求
  • 冷数据:不允许更新(具体业务系统具体分析),偶尔被查询;响应时间无要求。

什么情况下需要使用冷热分离?

在大型的互联网系统中,如果出现了以下场景则应该考虑冷热分离:

  1. 主业务响应延迟太大,比如12306下订单太慢了。
  2. 数据走到终态后,没有更新需求,只有读的需求,比如订单的完成状态。
  3. 用户能够接受新旧数据分开查询,比如携程的订单查询30天之前的需要用手机号查询。

补充:当然现在有些系统不像携程那样将往期订单分开查询,但是其实内部也是做了冷热分离,只不过是在你无感知的情况下完成的。

如何判断一个数据是冷数据还是热数据?

这个就要根据自己业务系统来区分了,一般而言是根据主表中的一个或者多个字段进行标识区分,比如订单的时间,这个是时间维度,可以将3个月之前的数据定义为冷数据,最近3个月的数据定义为热数据。

当然也可以是状态维度,比如订单的状态,已完结的订单定义为冷数据,未完结的订单定义为热数据。

同样的也可以将时间维度和状态维度组合起来,比如下单时间大于3个月且订单状态为已完结的定义为冷数据,反则为热数据。

总之:根据自己业务需求,具体问题具体分析。

但是需要注意以下两点:

  1. 如果一个数据被标识为冷数据,业务代码不会再对它进行写操作
  2. 不会同时存在读冷/热数据的需求。

如何实现冷热数据分离?

一切的理论知识都要经过实战的检验,基础知识了解了,那么如何实现冷热数据的分离呢?下面介绍三种常见的方法。

1、业务代码修改

这种方案是直接修改业务代码,对代码的侵入性比较高,无法按照时间进行区分,在数据修改时触发冷热分离。

该种方案需要在业务代码层面判断是否需要冷热分离,比如订单的状态修改,一旦状态为终态则将这条数据标记为冷数据,然后触发冷热处理,将其写入冷库,同时删除热库中的这笔数据。

2、监听数据库日志

该种方案需要监听binlog日志的方式进行触发,比如订单状态修改了,则触发冷热分离。

同样的这里无法按照时间区分但是对代码无侵入

监听binlog日志的工具有很多,前面介绍过,比如阿里的canal,还有其他的开源中间件可供选择,如下:

对于MySQL数据库建议选择canal,使用方式看:实战!Spring Boot 整合 阿里开源中间件 Canal 实现数据增量同步!

整个流程如下图:

3、定时任务扫描

该种方案可以按照时间区分,与业务代码解耦,是个不错的选择。

流程如下:

总结

解决读写缓慢的问题冷热分离是个不错的选择,上述介绍了三种方案实现冷热分离,虽说都能实现,但是仍然要考虑诸多问题,最棘手的问题就是数据一致性的问题。

在冷热分离的处理逻辑中一定要保证热库、冷库中的数据一致性问题,手段很多,这里就不再过多介绍了。

相关文章
|
4天前
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
24 8
|
3月前
|
存储 NoSQL 数据处理
【MongoDB大神级操作】揭秘聚合框架,让你的数据处理能力瞬间飙升,秒变数据界的超级英雄!
【8月更文挑战第24天】MongoDB是一款备受欢迎的非关系型数据库,以其灵活的文档模型和出色的可扩展性著称。其聚合框架尤其亮眼,能高效地对数据库中的数据执行复杂的转换与聚合操作,无需将数据导出到应用端处理,极大提升了数据处理的效率与灵活性。例如,在一个大型电商数据库中,聚合框架能轻松分析出最热卖的商品或特定时段内某类别商品的销售总额。通过一系列管道操作,如$unwind、$group等,可以对数据进行逐步处理并得到最终结果,同时还支持过滤、排序、分页等多种操作,极大地丰富了数据处理的能力,成为进行数据分析、报表生成及复杂业务逻辑实现的强大工具。
75 2
|
5月前
|
存储 关系型数据库 分布式数据库
突破大表瓶颈|小鹏汽车使用PolarDB实现百亿级表高频更新和实时分析
PolarDB已经成为小鹏汽车应对TB级别大表标注、分析查询的"利器"。
突破大表瓶颈|小鹏汽车使用PolarDB实现百亿级表高频更新和实时分析
|
6月前
|
存储 消息中间件 Java
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的高可靠消息服务设计实现
在深入研究了 **“【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现”** 设计实现后,我们意识到,尽管API网关为服务商提供了高效的数据获取手段,但实时数据的获取仍然是一个亟待解决的问题。
100 1
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的高可靠消息服务设计实现
|
存储 监控 关系型数据库
传统库分表麻烦查询慢?TDengine 如何解决“搜狐基金”的应用难题
搜狐基金团队使用的 MySQL 数据库在面对海量数据时存在能力瓶颈,在此背景下,其决定基于 TDengine 尝试一下全新的方案。
135 0
|
存储 关系型数据库 MySQL
太强了!三种方案优化 2000w 数据大表!
太强了!三种方案优化 2000w 数据大表!
162 0
|
存储 缓存 测试技术
三十、如何迅速分析出系统I/O的瓶颈在哪里?
最容易想到的是存储空间的使用情况,包括容量、使用量以及剩余空间等。我们通常也称这些为磁盘空间的使用量,因为文件系统的数据最终还是存储在磁盘上。
301 0
|
SQL 关系型数据库 MySQL
线上千万级大表排序:优化攻略揭秘,轻松应对海量数据!
前段时间应急群有客服反馈,会员管理功能无法按到店时间、到店次数、消费金额 进行排序。经过排查发现是Sql执行效率低,并且索引效率低下。遇到这样的情况我们该如何处理呢?今天我们聊一聊Mysql大表查询优化。
线上千万级大表排序:优化攻略揭秘,轻松应对海量数据!
|
缓存 数据挖掘 BI
面试官问你:日亿万级请求日志收集如何不影响主业务?你怎么回复
数据收集 上篇详细讨论了写缓存的架构解决方案,它虽然可以减少数据库写操作的压力,但也存在一些不足。比如需要长期高频插入数据时,这个方案就无法满足,接下来将围绕这个问题逐步提出解决方案。
|
存储 SQL canal
业务单表 读写缓慢 如何优化?
业务单表 读写缓慢 如何优化?