Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何进行千万级别数据跑批优化

如何进行千万级别数据跑批优化

作者头像
用户11397231
发布于 2025-06-02 05:18:23
发布于 2025-06-02 05:18:23
1410
举报
文章被收录于专栏:算法算法

背景

定义:跑批是指在特定日期对大量数据进行定时处理的过程。在金融领域,常见的跑批场景包括分户日结、账务计提、账单逾期处理和不良资产处理等。跑批具有高度的连贯性,通常在执行完跑批后,还需要对数据进行进一步处理,如发送消息队列(MQ)给下游系统,或由数据仓库进行分析等。

问题

在处理大数据量的跑批任务时,会遇到许多挑战,包括:

  • OOM(内存溢出):如果在查询跑批数据时未进行分片处理,随着业务的发展,数据量增大,很容易导致内存溢出.
  • 未进行批量处理:在业务处理过程中,如果没有采用批量处理的方式,会导致处理时间过长,并且频繁的IO操作也会成为问题.
  • 避免大事务:直接使用@Transactional注解来覆盖所有业务是不可取的,这会导致问题定位困难,并且会延长方法的处理时间.
  • 下游接口的承受能力:在设计跑批任务时,还需要考虑下游系统的承载能力。如果大量数据分批发送,而下游系统没有足够的能力进行处理,可能会引发灾难性的问题.
  • 任务时间上的隔离:通常在大数据量跑批任务之后,还会有其他业务处理任务。因此,需要严格控制跑批任务的时间和健壮性,以避免对后续业务产生影响.
  • 失败任务补偿:在分布式任务调度中,创建跑批任务后,会将任务拆分为多个子任务并发地发送到消息队列中,然后由线程池执行任务并调用远程接口。在这个过程中,任何步骤都可能出现问题,导致任务失败.

分析

通过对上述问题的总结,我们可以得出,在进行大数据量跑批任务时,代码设计需要具备以下素质:

  • 健壮性:跑批任务需要定时处理数据,不能因为其中一条数据出现异常就导致整批数据无法继续操作,因此必须具备健壮性.
  • 可靠性:针对异常数据,后续可以进行补偿处理,因此必须具备可靠性.
  • 隔离性:要避免干扰其他应用程序的正常运行.
  • 高性能:由于跑批任务通常需要处理大量数据,不能让处理时间过长,否则会挤压后续其他连贯性业务处理的时间,因此必须考虑其性能.

解决方案

数据库问题

  • 使用数据库扫表问题:遍历数据会对数据库产生很大的压力,处理速度也会越来越慢.
    • 解决方法:在每次查询时,携带上一次查询的极值,使分页查找的偏移量始终控制在0.

分片广播

  • 分片:在生产环境中,通常采用集群部署。如果一个跑批任务只在一个机器上运行,效率会很低。可以利用xxl-job的“分片广播”和“动态分片”功能.
    • 分布式调度幂等:分布式任务调度只能保证准时调用一个节点,而且通常具有失败重试功能。因此,任务幂等性是必要的,可以通过分布式锁来实现。简单起见,可以使用数据库,通过在任务表中插入一条唯一的任务记录,利用唯一键来防止重复调度.
      • 除了使用唯一键,还可以在记录中增加一个状态字段,使用乐观锁来更新状态。例如,初始状态为“初始化”,更新为“正在运行”的状态,如果更新失败,则说明其他节点已经在执行该任务.当然,分布式锁的实现方案有很多,如Redis、ZooKeeper等.
    • 集群分布式任务调度xxl-job:在执行器集群部署时,“分片广播”以执行器为维度进行分片。当任务路由策略选择“分片广播”时,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时系统自动传递分片参数;可以根据分片参数开发分片任务.
      • 分片任务场景:例如,一个拥有10个执行器的集群来处理10万条数据,每台机器只需要处理1万条数据,耗时降低10倍.
      • 广播任务场景:广播执行器机器运行shell脚本、广播集群节点进行缓存更新等.

分批获取

  • 设置步长:分派到一个Pod负责的数据量也是庞大的,如果一次性查询出来,耗时过长容易导致超时。通常会引入步长的概念,例如,分派给Pod 1万条数据,可以将其划分为10次查询,每次查询1千条数据,从而避免数据库查询数据耗时过长.
  • 空间换时间:跑批可能会涉及到数据准备的过程,边循环跑批数据边查找所需的数据,涉及多个for嵌套的循环处理时,可以采用空间换时间的思想,将数据加载到内存中进行筛选查找,但要做好OOM防范措施,例如使用包装类来接收查找出来的数据等,毕竟内存不是无限大的.
  • 深分页:分批查询时,limit的偏移量越大,执行时间越长。例如,limit a, b会查询前a + b条数据,然后丢弃前a条数据,select *会查询所有的列,也会有回表操作。可以使用子查询优化SQL,先查出id后分页,尽量使用覆盖索引来优化.

事务控制

  • 这些操作自身是无法回滚的,这会导致数据不一致。可能RPC调用成功了,但本地事务回滚了,而RPC调用无法回滚.
  • 在事务中有远程调用,会拉长整个事务,导致事务的数据库连接一直被占用,从而可能导致数据库连接池耗尽或者单个连接超时。因此,要熟悉调用链路,将事务粒度控制在最小范围内.

充分利用服务器资源

  • 需要充分利用服务器资源,采用多线程,MySQL的CPU在罚息期间也是低于50%、IOPS使用率低于50%.
  • 其实跑数据是IO密集型的,不需要非得压榨服务器资源.

MQ消费任务并行

  • MQ消费消息队列的消息时,要在每个节点上同时运行多个子任务,才能最大化资源利用。那么就使用到线程池了,如果选择的是Kafka或者RocketMQ,他们的客户端本来就是线程池消费的,只需要合理调整客户端参数就可以了。如果使用的是Redis,那就需要自己创建一个线程池,然后让一个EventLoop线程从Redis队列中取任务,放入线程池中运行,因为我们已经使用Redis队列做缓冲,所以线程池的队列长度设为0,这里直接使用JDK提供的SynchronousQueue。(这里以Java为例)

动态调整并发度

  • 跑批任务中能动态调整速度是很重要的,有两个地方可以进行操作:
    • 任务中调用远程接口:这个速度控制其实用Thread.sleep()就好了.
    • 控制任务并发度:就是有多少个线程同时运行任务。这个控制可以通过调整线程池的线程数来实现,但线程池动态调整线程数比较麻烦。动态调整可以通过开源的限流组件来实现,比如Guava的RateLimiter。可以在每次调用远程接口前调用限流组件来控制并发速度.

失败任务如何继续

  • 一般分布式调度路径:
    • 分布式任务调度创建跑批任务;
    • 拆分子任务多线程并发地发送到消息队列;
    • 线程池执行任务调用远程接口;
  • 在这个链条中,可能导致任务失败或者中止的原因无非下面几个:
    • 服务器Pod因为其他业务影响重启导致任务中止;
    • 任务消费过程中失败,达到最大的重试次数;
    • 业务逻辑不合理或者数据膨胀导致OOM;
    • 消费时调用远程接口超时(这个很多人专注自己的业务逻辑从而忽略第三方接口的调用).
  • 其实解决起来也简单,因为其他因素导致失败,你需要记录下任务的进度,然后在失败的点去再次重试.
    • 记录进度:我们需要知道这个任务执行到哪里了,同时也要记录更新的时间,这样才知道补偿哪里,例如进行跑批捞取时,要记录我们捞取的数据区间.
    • 任务重试:编写一个补偿式的任务(比如FixJob),定时地去扫描处在中间态的任务,如果扫描到就触发补偿机制,将这个任务改成待执行状态投入消息队列.

下游接口时间

  • 跑批最怕的就是上来就干,从不考虑涉及到第三方接口时的响应时间。如果不考虑第三方接口调用时间,那么在测试时会发现频繁的YGC,这是很致命的问题,属于你设计之外的事件,但也是你必须要考虑的.
  • 解决起来也简单,在业务可以容忍的情况下,可以将调用接口的业务逻辑设计一个中间态,然后挂起我们的这个业务,随后用定时任务去查询我们的业务结果,在收到信息后继续我们的业务逻辑,避免它一直在内存中堆积.

线程安全

  • 在进行跑批时,一般会采用多线程的方式进行处理,因此要考虑线程安全的问题,比如使用线程安全的容器,使用JUC包下的工具类.

异常 & 监控

  • 异常:要保证程序的健壮性,做好异常处理,不能因为一处报错,导致整个任务执行失败,对于异常的数据可以跳过,不影响其他数据的正常执行.
  • 监控:一般大数据量跑批是业务核心中的核心,一次异常就是很大的灾难,对业务的损伤不可预估,因此要配置相应的监控措施,在发生异常前及时察觉,进而做补偿措施.

总结

在处理大数据量的跑批任务时,需要综合考虑多个方面,包括数据库优化、分片广播、分批获取、事务控制、资源利用、MQ消费、并发度调整、失败任务处理、下游接口时间、线程安全以及异常和监控等。通过合理的设计和优化,可以提高跑批任务的健壮性、可靠性和性能,从而确保业务的顺利进行.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
服务端开发必备:9大性能优化秘技
笔者最近对负责项目做了一些服务性能优化的工作,主要优化了项目中的一些不合理设计,例如:服务间使用 json 传输数据;监控上报处理逻辑在主流程中;重复数据每次都请求下游服务;多个耗时操作串行请求等。取得了 A 服务平均耗时跟 p99 耗时均下降 80% 、事件底层服务平均耗时下降 50% 的业务收益。 本文总结了在服务架构设计时,提升服务性能的 9 大常用办法,相信可以有效帮到你的日常工作。期待你的点赞转发收藏一键三连!
腾讯云开发者
2024/08/06
9080
服务端开发必备:9大性能优化秘技
分布式任务调度框架技术选型
很多业务场景需要我们某一特定的时刻去做某件任务,定时任务解决的就是这种业务场景。一般来说,系统可以使用消息传递代替部分定时任务,两者有很多相似之处,可以相互替换场景。如,上面发货成功发短信通知客户的业务场景,我们可以在发货成功后发送MQ消息到队列,然后去消费mq消息,发送短信。
lyb-geek
2019/10/10
5.7K0
分布式任务调度框架技术选型
又一批长事务,P0故障谁来背锅?
面试时,大家可能都会碰到关于事务相关的问题,升级版的可能是分布式事务的问题。在互联网行业中,一句马马虎虎的补偿事务就能蒙混过关,毕竟都是些短小精悍的接口。 但在很多企业级应用中,这行不通。我们必须直面惨淡的现实。
xjjdog
2020/04/10
1.1K0
又一批长事务,P0故障谁来背锅?
梁老师小课堂|谈谈分布式任务调度
我们常说的定时任务有两种架构,一种是本地定时任务调度,另外一种是分布式的。前者将任务参数硬编码在代码配置中,通常还和业务代码混合在一起,部署时通过环境变量来区分。后者通过控制台动态管理任务配置,不需要重启服务,就可以调整执行参数和频率,还可以进行任务的启动、暂停和停止。
公众号_松华说
2020/12/08
6750
梁老师小课堂|谈谈分布式任务调度
数据工程领域当前遇到的挑战
现代系统正变得越来越复杂,从单线程到多线程,从单体到微服务,从单节点到分布式,从本地到云端... … 复杂度使得程序产生预期的结果需要越来越多的必要条件,而每种条件都有其自身的成功概率,即使每种条件的成功概率都很高,根据墨菲定律,或早或晚一定会遇到不可预知的结果。
ThoughtWorks
2023/08/08
1980
数据工程领域当前遇到的挑战
如何实现 1 小时内完成千万级数据运算
作者:ninetyhe,腾讯 CDG 后台开发工程师 本文详细描述如何实现:目前手上可用的资源仅剩一个 16 核剩余 4-8G 内存的机器,单点完成在 1 个小时内千万级别 feed 流数据 flush 操作(主要包括:读数据,计算综合得分,淘汰低分数据,并更新最新得分,回写缓存和数据库)。 背景 目前工作负责的一款产品增加了综合得分序的 Feed 流排序方式:需要每天把(将近 1000W 数据量)的 feed 流信息进行算分计算更新后回写到数据层。手上的批跑物理机器是 16 核(因为混部,无法独享 CPU
腾讯技术工程官方号
2022/07/06
8210
如何实现 1 小时内完成千万级数据运算
宜信微服务任务调度平台建设实践|分享实录
导读:如今,无论是互联网应用还是企业级应用,都充斥着大量的批处理任务,常常需要一些任务调度系统帮助我们解决问题。随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、微服务架构。
宜信技术学院
2019/10/22
1.2K0
分布式任务调度的解决方案
随着系统规模的发展,定时任务数量日益增多,任务也变得越来越复杂,尤其是在分布式环境下,存在多个业务系统,每个业务系统都有定时任务的需求,如果都在自身系统中调度,一方面增加业务系统的复杂度,另一方面也不方便管理,因此需要有一个任务平台对分散的任务进行统一管理调度,基于目前的情况,任务平台需要支持以下几个方面:
慕容千语
2021/07/20
1.5K0
“多线程去刷一张大表数据,发现任务老是中断,怎么解决?”
会有10个任务同时执行,在这10个任务未结束前,新添加的任务会放到等待队列,当队列中存够500个任务时,则会报错,不会新启动线程来处理任务,因为maxPoolSize是10与corePoolSize相同。
烟雨平生
2025/01/19
1050
“多线程去刷一张大表数据,发现任务老是中断,怎么解决?”
分布式调度XXL-JOB特性介绍
最近居家办公,对于分布式调度的XXL-JOB开源组件进行了了解和学习,后期会持续分享关于分布式调度的文章,对于新手可以学习和了解如何使用分布式调度,对于已经在使用分布式调度的同学,可以思考一下自己在使用过程中,是否有遇到什么问题,自己如何解决的,也欢迎大家一起探讨。
xdd
2022/07/12
8490
分布式定时任务调度系统技术选型
原文链接:https://blog.csdn.net/guyue35/article/details/84883408
业余草
2019/10/22
3.6K0
分布式定时任务调度系统技术选型
一篇文章全面解析大数据批处理框架Spring Batch
如今微服务架构讨论的如火如荼。但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易。在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理。针对OLTP,业界有大量的开源框架、优秀的架构设计给予支撑;但批处理领域的框架确凤毛麟角。是时候和我们一起来了解下批处理的世界哪些优秀的框架和设计了,今天我将以Spring Batch为例,和大家一起探秘批处理的世界。 初识批处理典型场景 探秘领域模型及关键架构 实现作业健壮性与扩展性 批处理框架的不足与增强 批处理典型业务场景 对账是典型的批处理业务
yuanyi928
2018/04/02
4.4K0
一篇文章全面解析大数据批处理框架Spring Batch
谈谈对分布式事务的一点理解和解决方案
最近,工作中要为现在的老系统做拆分和升级,刚好遇到了分布式事务、幂等控制、异步消息乱序和补偿方案等问题,刚好基于实践结合个人的看法记录一下一些方案和思路。
本人秃顶程序员
2019/05/22
1.5K0
分布式任务调度平台 XXL-JOB 2.0.0 发布
XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
Debian中国
2018/12/21
1.1K1
宜信开源|分布式任务调度平台SIA-TASK的架构设计与运行流程
无论是互联网应用或者企业级应用,都充斥着大量的批处理任务。我们常常需要一些任务调度系统来帮助解决问题。随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、微服务架构。在此背景下,很多原先的任务调度平台已经不能满足业务系统的需求,于是出现了一些基于分布式的任务调度平台。
宜信技术学院
2019/06/28
1.7K0
宜信开源|分布式任务调度平台SIA-TASK的架构设计与运行流程
8000字 + 25图探秘Xxl-Job核心架构原理
这里还是老样子,为了保证文章的完整性和连贯性,方便那些没有使用过的小伙伴更加容易接受文章的内容,快速讲一讲Xxl-Job中的概念和使用
三友的java日记
2023/12/04
3.7K0
8000字 + 25图探秘Xxl-Job核心架构原理
分布式任务调度:你知道和不知道的事
导语 对于定时任务大家应该都不会陌生,从骨灰级别的Crontab到Spring Task,从QuartZ到xxl-job,随着业务场景越来越多样复杂,定时任务框架也在不断的升级进化。 那么今天就来跟大家从以下三个方面聊一聊分布式任务调度:从单机定时任务到分布式任务调度平台的演进过程、腾讯云分布式任务调度平台TCT是如何应运而生的、TCT具体落地案例情况和解决了哪些核心问题。 作者简介  崔凯 腾讯云 CSIG 微服务产品中心产品架构师 多年分布式、高并发电子商务系统的研发、系统架构设计经验,擅长主流微服务
腾讯云中间件团队
2022/03/10
2.2K0
快速学习-XXL-JOB总体设计
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
cwl_java
2020/09/24
2K0
快速学习-XXL-JOB总体设计
springboot整合xxl-job 分布式任务调度
注意:调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例,如果mysql做主从,调度中心集群节点务必强制走主库
用户10125653
2022/11/10
1.3K0
springboot整合xxl-job 分布式任务调度
【进阶之路】定时任务调用平台xxl-job
.markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{line-height:1.5;margin-top:35px;margin-bottom:10px;padding-bottom:5px}.markdown-body h1{font-size:30px;margin-bottom:5px}.markdown-body h2{padding-bottom:12px;font-size:24px;border-bottom:1px solid #ececec}.markdown-body h3{font-size:18px;padding-bottom:0}.markdown-body h4{font-size:16px}.markdown-body h5{font-size:15px}.markdown-body h6{margin-top:5px}.markdown-body p{line-height:inherit;margin-top:22px;margin-bottom:22px}.markdown-body img{max-width:100%}.markdown-body hr{border:none;border-top:1px solid #ddd;margin-top:32px;margin-bottom:32px}.markdown-body code{word-break:break-word;border-radius:2px;overflow-x:auto;background-color:#fff5f5;color:#ff502c;font-size:.87em;padding:.065em .4em}.markdown-body code,.markdown-body pre{font-family:Menlo,Monaco,Consolas,Courier New,monospace}.markdown-body pre{overflow:auto;position:relative;line-height:1.75}.markdown-body pre>code{font-size:12px;padding:15px 12px;margin:0;word-break:normal;display:block;overflow-x:auto;color:#333;background:#f8f8f8}.markdown-body a{text-decoration:none;color:#0269c8;border-bottom:1px solid #d1e9ff}.markdown-body a:active,.markdown-body a:hover{color:#275b8c}.markdown-body table{display:inline-block!important;font-size:12px;width:auto;max-width:100%;overflow:auto;border:1px solid #f6f6f6}.markdown-body thead{background:#f6f6f6;color:#000;text-align:left}.markdown-body tr:nth-child(2n){background-color:#fcfcfc}.markdown-body td,.markdown-body th{padding:12px 7px;line-height:24px}.markdown-body td{min-width:120px}.markdown-body blockquote{color:#666;padding:1px 23px;margin:22px 0;border-left:4px solid #cbcbcb;background-color:#f8f8f8}.markdown-body blockquote:after{display:block;content:""}.markdown-body blockquote>p{margin:10px 0}.markdown-body ol,.markdown-body ul{padding-left:28px}.markdown-body ol li,.markdown-body
南橘
2021/04/02
1.1K0
【进阶之路】定时任务调用平台xxl-job
相关推荐
服务端开发必备:9大性能优化秘技
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档