本文共 1980 字,大约阅读时间需要 6 分钟。
一、先聊聊需求
说起这次优化,有点奇葩,从耗时12小时到1分钟,优化经历了三次,和自己纠结了N次,看看结果还算安慰。
1.故事背景
恰逢大促东风,不如顺势来个商品破盘,运营、技术、产品联手一搏提升商品的丰富度。那这次的问题就从这个需求开始了。。。
2.需求描述:快速提升商和品的数量,从现有的商品池中捞出符合规则的数据。
3.功能实现:功能很简单,就是后台通过定时JOB的方式将疑似商品表的数据进行状态更新。over~
二、再聊聊方案
1. 第一种方案(标签:单线程执行、无缓存、有三方依赖)
(1)方案图
(2)执行逻辑
类似的小任务也写过不少,自以为轻车熟路,方案也很顺手,顺手就是一坨代码:
step1:从ODPS表中将疑似商品数据同步到应用的DB表中,做好数据准备step2:分页获取offer数据,每页必须按照50条数据来执行逻辑。之所以定死这个页数上线,是由于标第三方HSF的接口的限制,用过的童鞋都知道,性能上限每次最多传入50条Id。先忍一忍,继续实现功能。step3:循环遍历每页,通过第三方接口check是否打上标。然后把已打上标的商品放到一个list集合中。step4:将list里offer依次循环回写状态至此coding结束,迫不及待的将任务Run起来。又看看表已凌晨1点多,算了,睡上一觉明天收割数据。早上醒来,蛋疼是事情发生了,才跑了100w的数据,并且一直在报超时。异常显示“HSF TimeOut:OfferQueryServiceException:xxxx”,很显然批量接口不行了,必须优化。(3)执行结果
本次执行task处理offer数量180w+条,总耗时739分钟,虽然能顺利跑完,但已吐血。简单总结下~
本方案满足了三无条件:
本方案暴露的问题:
2.第二种方案(标签:多线程执行、有缓存、有三方依赖)
(1)方案图
(2)执行逻辑
按照方案一的暴漏问题,逐一优化:
(3)执行结果
本次执行task处理offer数量180w+条,总耗时127分钟,时间提升82%,期间无任何异常抛出,终于可以静静的吃瓜了。但又想了想,是不是还有更好的思路可以解决这个问题呢:
本方案也暴露一些问题:
3.第三种方案(标签:嵌套SQL、无三方依赖、批量优化)
(1)方案图
(2)执行逻辑
从头开始理解需求,无非就是想把疑似商品找出来,然后回写状态。能不能找到替代调用三方接口的方案来验证结果。脑暴一番,果然有。。。(3)执行结果
本次执行task处理offer数量180w+条,总耗时<<1分钟,时间提升100%,期间无任何异常抛出。
三、小结
回头想想这次优化的经历,总结有三点:
转载地址:http://wcyax.baihongyu.com/