美文网首页Java互联网科技开发设计
一次性集中处理大量数据的定时任务,如何缩短执行时间?

一次性集中处理大量数据的定时任务,如何缩短执行时间?

作者: 程序员追风 | 来源:发表于2019-08-16 19:58 被阅读6次

作者:58沈剑

问题抽象:

(1)用户会员系统;

(2)用户会有分数流水,每个月要做一次分数统计,对不同分数等级的会员做不同业务处理;

数据假设:

(1)假设用户在100w级别;

(2)假设用户日均1条流水,也就是说日增流水数据量在100W级别,月新增流水在3kW级别,3个月流水数据量在亿级别;

常见解决方案:

用一个定时任务,每个月的第一天计算一次。

一个月执行一次的定时任务,会存在什么问题?

计算量很大,处理的数据量很大,耗时很久,按照水友的说法,需要1-2天。

画外音:外层循环100W级别用户;内层循环9kW级别流水;业务处理需要10几次数据库交互。

可不可以多线程并行处理?

可以,每个用户的流水处理不耦合。

改为多线程并行处理,例如按照用户拆分,会存在什么问题?

每个线程都要访问数据库做业务处理,数据库有可能扛不住。

这类问题的优化方向是:

(1)同一份数据,减少重复计算次数;

(2)分摊CPU计算时间,尽量分散处理,而不是集中处理;

(3)减少单次计算数据量;

如何减少同一份数据,重复计算次数?

如上图,假设每一个方格是1个月的分数流水数据(约3kW)。

3月底计算时,要查询并计算1月,2月,3月三个月的9kW数据;

4月底计算时,要查询并计算2月,3月,4月三个月的9kW数据;

会发现,2月和3月的数据(粉色部分),被重复查询和计算了多次。

画外音:该业务,每个月的数据会被计算3次。

新增月积分流水汇总表,每次只计算当月增量:

flow_month_sum(month, uid, flow_sum)

(1)每到月底,只计算当月分数,数据量减少到1/3,耗时也减少到1/3;

(2)同时,把前2个月流水加和,就能得到最近3个月总分数(这个动作几乎不花时间);

画外音:该表的数量级和用户表数据量一致,100w级别。

这样一来,每条分数流水只会被计算一次。

如何分摊CPU计算时间,减少单次计算数据量呢?

业务需求是一个月重新计算一次分数,但一个月集中计算,数据量太大,耗时太久,可以将计算分摊到每天。

如上图,月积分流水汇总表,升级为,日积分流水汇总表。

把每月1次集中计算,分摊为30次分散计算,每次计算数据量减少到1/30,就只需要花几十分钟处理了。

甚至,每一个小时计算一次,每次计算数据量又能减少到1/24,每次就只需要花几分钟处理了。

虽然时间缩短了,但毕竟是定时任务,能不能实时计算分数流水呢?

每天只新增100w分数流水,完全可以实时累加计算“日积分流水汇总”。

使用DTS(或者canal)增加一个分数流水表的监听,当用户的分数变化时,实时进行日分数流水累加,将1小时一次的定时任务计算,均匀分摊到“每时每刻”,每天新增100w流水,数据库写压力每秒钟10多次,完全扛得住。

画外音:如果不能使用DTS/canal,可以使用MQ。

总结,对于这类一次性集中处理大量数据的定时任务,优化思路是:

(1)同一份数据,减少重复计算次数;

(2)分摊CPU计算时间,尽量分散处理(甚至可以实时),而不是集中处理;

(3)减少单次计算数据量;

希望大家有所启示,思路比结论重要。

欢迎大家一起交流,喜欢文章记得关注我点个喜欢哟,感谢支持!

相关文章

  • 一次性集中处理大量数据的定时任务,如何缩短执行时间?

    作者:58沈剑 问题抽象: (1)用户会员系统; (2)用户会有分数流水,每个月要做一次分数统计,对不同分数等级的...

  • pm2(cluster)下的Nodejs,如何实现定时任务的维护

    说一下场景举例:某个功能需要在线创建定时任务,并可以修改任务的执行时间,定时任务修改时间之后如何立即停掉旧的定时任...

  • Go并发的控制

    这里写了个定时任务调度的方案:由定时器去触发一个job,job的执行时间不定,需要有超时处理。这里使用conten...

  • 从0到1搭建大数据平台之调度系统

    目前大数据平台经常会用来跑一些批任务,跑批处理当然就离不开定时任务。比如定时抽取业务数据库的数据,定时跑hive/...

  • iOS定时器NSTimer内存泄露原理分析+解决方案

    一、NSTimer简介 NSTimer是iOS开发执行定时任务时常用的类,它支持定制定时任务的开始执行时间、任务时...

  • 拥抱Kubernetes,再见了,SpringBoot cron

    项目开发中总是需要执行一些定时任务,比如定时处理数据之后发送邮件,定时更新缓存等等。 Java定时任务 基于 ja...

  • Odoo12实现定时任务

    在ERP实施过程中,定时自动执行一些数据处理任务是非常有必要的,比如每月初将上月某些数据设置为过期,可以大量减少人...

  • 2018-07-09

    工作情况: 1、关于Azkaban 设定执行时间的问题,如何设置按奇偶小时执行(拓展:Azkaban的定时任务的详...

  • 定时任务

    1.设置定时任务可以定时启动特定任务 2.定时任务需可手动启动 3.如果定时任务跑的数据有问题,如何修复? 删除错...

  • Linux定时任务

    Linux定时任务 一. at一次性定时任务 查看at是否安装chkconfig --list | grep at...

网友评论

    本文标题:一次性集中处理大量数据的定时任务,如何缩短执行时间?

    本文链接:https://www.haomeiwen.com/subject/gtxcsctx.html