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

news2025/1/8 16:19:10

目录

  • 背景
  • 问题
  • 分析
  • 解决方案
    • 数据库问题
    • 分片广播
    • 分批获取
    • 事务控制
    • 充分利用服务器资源
    • MQ消费任务并行
    • 动态调整并发度
    • 失败任务如何继续
    • 下游接口时间
    • 线程安全
    • 异常 & 监控
  • 总结

在这里插入图片描述

背景

定义:跑批是指在特定日期对大量数据进行定时处理的过程。在金融领域,常见的跑批场景包括分户日结、账务计提、账单逾期处理和不良资产处理等。跑批具有高度的连贯性,通常在执行完跑批后,还需要对数据进行进一步处理,如发送消息队列(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消费、并发度调整、失败任务处理、下游接口时间、线程安全以及异常和监控等。通过合理的设计和优化,可以提高跑批任务的健壮性、可靠性和性能,从而确保业务的顺利进行.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑提示wlanapi.dll丢失怎么办?wlanapi.dll丢失的多种解决方法

电脑提示wlanapi.dll丢失?别担心,这里有多种解决方法! 作为软件开发领域的从业者,我深知电脑在运行过程中可能会遇到的各种问题,其中“wlanapi.dll丢失”这一报错信息就常常让用户感到困惑和不安。今天,我…

刷服务器固件

猫眼淘票票 大麦 一 H3C通用IP 注:算力服务器不需要存储 二 刷服务器固件 1 登录固定IP地址 2 升级BMC版本 注 虽然IP不一致但是步骤是一致的 3 此时服务器会出现断网现象,若不断网等上三分钟ping一下 4 重新登录 5 断电拔电源线重新登录查看是否登录成功

深入Android架构(从线程到AIDL)_13 线程安全的化解之例

目录 7、 线程安全的化解之例 复习:Android单线程环境 非单线程环境的线程安全议题 范例-1 范例-2​编辑 同步(Synchronization)化解线程安全的问题 7、 线程安全的化解之例 复习:Android单线程环境 View是一个单线程的类;其意味着&…

每日AIGC最新进展(80): 重庆大学提出多角色视频生成方法、Adobe提出大视角变化下的人类视频生成、字节跳动提出快速虚拟头像生成方法

Diffusion Models专栏文章汇总:入门与实战 Follow-Your-MultiPose: Tuning-Free Multi-Character Text-to-Video Generation via Pose Guidance 在多角色视频生成的研究中,如何实现文本可编辑和姿态可控的角色生成一直是一个具有挑战性的课题。现有的方法往往只关注单一对象的…

【多线程初阶篇¹】线程理解| 线程和进程的区别

目录 一、认识线程Thread 1.为啥引入线程 2.线程理解 🔥 3.面试题:线程和进程的区别 一、认识线程Thread 1.为啥引入线程 为了解决进程太重量的问题 解释(为什么说线程比进程更轻量?/为什么说线程创建/销毁开销比进程小&#…

Cursor 实战技巧:好用的提示词插件Cursor Rules

你好啊,见字如面。感谢阅读,期待我们下一次的相遇。 最近在小红书发现了有人分享这款Cursor提示词的插件,下面给各位分享下使用教程。简单来说Cursor Rules就是可以为每一个我们自己的项目去配置一个系统级别的提示词,这样在我们…

Tomcat解析

架构图 核心功能 Tomcat是Apache开源的轻量级Java Servlet容器,其中一个Server(Tomcat实例)可以管理多个Service(服务),一个Service包含多个Connector和一个Engine,负责管理请求到应用的整个流…

List-顺序表--2

目录 1、ArrayList 2、ArrayList构造方法 3、ArrayList常见方法 4、ArrayList的遍历 5、ArrayList的扩容机制 6、ArrayList的具体使用 6.1、杨辉三角 6.2、简单的洗牌算法 1、ArrayList 在集合框架中,ArrayList 是一个普通的类,实现了 List 接口…

【C++】字符数|组的输出详解与拓展

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯字符数组的输出:三种方法解析方法1:直接输出字符串代码示例解析与特点 方法2:使用while循环逐字符输出代码示例解析与特点 方法3&#x…

解决iNodeClient客户端出现查询SSL VPN网关参数失败的问题

一、问题: 使用iNodeClient连接VPN报错,校验网关、用户名、密码都没问题,仍然抱错查询SSL VPN网关参数失败,请检查网络配置或联系管理员。 二、解决方案: 2.1 方案一 重启iNodeAuthService服务 sudo /Library/Star…

数树数(中等难度)

题目: 解题代码: n,qmap(int,input().split())#分别输入层数和路径数量 for i in range(q):sinput()#输入“L”或“R”x1for j in s:if j "L":xx*2-1 #!!!规律else:xx*2print(x)

CAN201 Introduction to Networking(计算机网络)Pt.5 网络安全

文章目录 6. Network Security(网络安全)6.1 What is network security(什么是网络安全)6.2 Principles of cryptography(密码学的原则)6.2.1 Breaking an encryption scheme(破解加密方案&…

【ArcGIS Pro二次开发实例教程】(2):BSM字段赋值

一、简介 一般的数据库要素或表格都有一个BSM字段,用来标识唯一值。 此工具要实现的功能是:按一定的规律(前缀中间的填充数字OBJECT码)来给BSM赋值。 主要技术要点包括: 1、ProWindow的创建,Label,Comb…

ros2笔记-2.5.3 多线程与回调函数

本节体验下多线程。 python示例 在src/demo_python_pkg/demo_python_pkg/下新建文件,learn_thread.py import threading import requestsclass Download:def download(self,url,callback):print(f线程:{threading.get_ident()} 开始下载:{…

C语言练习:求数组的最大值与最小值

文章目录 1. 提出任务2. 完成任务2.1 方法一:通过返回结构体指针来间接返回结果2.1.1 编写程序,实现功能2.1.2 运行程序,查看结果 2.2 方法二:通过参数传递数组,并在函数中修改传入的参数2.2.1 编写程序,实…

conda安装及demo:SadTalker实现图片+音频生成高质量视频

1.安装conda 下载各个版本地址:https://repo.anaconda.com/archive/ win10版本: Anaconda3-2023.03-1-Windows-x86_64 linux版本: Anaconda3-2023.03-1-Linux-x86_64 Windows安装 环境变量 conda -V2.配置conda镜像源 安装pip conda…

【前端系列01】优化axios响应拦截器

文章目录 一、前言🚀🚀🚀二、axios响应拦截器:☀️☀️☀️2.1 为什么前端需要响应拦截器element ui的消息组件 一、前言🚀🚀🚀 ☀️ 回报不在行动之后,回报在行动之中。 这个系列可…

PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”

近日,全球 IT 市场研究和咨询公司 Gartner 发布最新报告《Magic Quadrant™ for Cloud Database Management Systems》(云数据库管理系统魔力象限),PingCAP 因其企业级开源分布式数据库 TiDB 在全球市场的表现,连续两年…

CSS——2.书写格式一

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写中&#xff1a;--><!--1.css 由属性名:属性值构成--><!--style"color: red;font-size: 20px;&quo…

QT上实现SVM进行数据分类

针对不了解SVM的原理的同学强推下面这个课程&#xff1a; 6.机器学习课程&#xff08;六&#xff09;支持向量机&#xff08;线性模型&#xff09;问题_哔哩哔哩_bilibili 一、QT实现SVM的方法 1.调用SVM的C语言库&#xff1a;麻烦&#xff0c;要专门去找库&#xff0c;cmak…