当前位置: 首页 > 科技观察

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

时间:2023-03-19 22:54:04 科技观察

不管业务场景多么复杂,一条数据的生命体现在CRUD操作上,即创建、查询、修改、删除。就像人类的生死轮回一样,数据也是如此。随着时间的推移,一条数据的价值逐渐降低。数据的价值在于它被使用的程度。在不同的系统中,人们在不同时期对数据的需求是不同的。比如12306和携程上的火车票和机票订单,人们往往只关注30天内的订单,而携程默认只保留30天的订单信息,超过30天的订单需要手机搜索数字。携程订单携程为什么要这样做?其实仔细想一想也不难理解,作为全国性的票务平台,每年的订单数以亿计。如果都可以打开运行(CRUD),系统会瞬间崩溃。一个订单到达最终状态的标志是订单的完成,这意味着除查询需求外,该订单不再允许用户修改或删除。事实上,携程采用的架构方式就是:冷热分离。什么是冷热分离?冷热分离就是在处理数据时,将数据库分为热存储和冷存储。冷库存放的是已经达到最终状态的数据,热库存放的是需要修改的数据。例如30天以内的机票、火车票订单,用户可能需要在此期间为订单退款或开发票,而30天之前的订单只需要查询,那么30天以内的订单可以下达至热库,之前的订单要冷库。那么这里引入两个概念,即:热点数据:经常更新;需要响应时间;冷数据:不允许更新(具体业务系统具体分析),偶尔查询;不需要响应时间。什么情况下需要使用冷热分离?在大型互联网系统中,如果出现以下场景,则应考虑冷热分离:主业务响应延迟过大,如12306下单速度过慢。数据到达最终状态后,不需要更新,只需要读取,比如订单的完成状态。用户可以接受新旧数据分别查询。比如携程的订单查询需要通过手机号查询30天前。补充:当然有些系统没有像携程那样单独查询过往订单,但实际上内部是冷热分离的,只是在你没有感知的情况下完成的。如何判断一条数据是冷数据还是热数据?这个需要根据自己的业务系统来区分。一般来说,主表中的一个或多个字段用于标识和区分,例如订单的时间。这是时间维度。3个月之前的数据可以定义为冷数据,最近3个月的数据可以定义为热数据。当然也可以是状态维度,比如订单的状态。已完成的订单定义为冷数据,未完成的订单定义为热数据。同样,时间维度和状态维度也可以结合。比如订单时间超过3个月,订单状态为完成,则定义为冷数据,否则为热数据。总之:根据自己的业务需求,具体问题具体分析。但需要注意以下两点:如果一条数据被标记为冷数据,业务代码将不再写入,也不需要同时读取冷/热数据。如何实现数据冷热分离?所有的理论知识都必须在实战中得到检验。了解了基础知识后,如何实现数据冷热分离呢?下面介绍三种常用方法。1.业务代码修改该方案是直接修改业务代码,对代码侵入性比较大,不能按时间区分,修改数据时触发冷热分离。该方案需要在业务代码层面判断是否需要冷热分离。例如修改一个订单的状态,一旦状态确定,这条数据就会被标记为冷数据,然后触发冷热处理写入冷库,同时删除.热库中的此数据。2、监控数据库日志这个方案需要通过监控binlog日志来触发。比如修改订单状态,就会触发冷热分离。同样这里不能按时间区分,但是不侵入代码。监控binlog日志的工具有很多。前面说了,比如阿里的canal,还有其他的开源中间件可以选择,如下:对于MySQL数据库,建议选择canal。看使用方法:实战!SpringBoot集成阿里开源中间件Canal实现增量数据同步!整个流程如下图所示:3.定时任务扫描这个方案可以按时间区分,和业务代码解耦,是一个不错的选择。过程如下:总结解决读写慢的问题,冷热分离是个不错的选择。介绍上述三种方案,实现冷热分离。虽然可以实现,但仍有许多问题需要考虑。最困难的问题是数据一致性。问题。在冷热分离的处理逻辑中,需要保证冷热存储中数据的一致性。方法很多,这里就不多介绍了。