学习笔记-如何设计离线跑批系统

article/2025/10/16 5:29:17

一、基本概念

离线跑批:通常指批量加工数据、完成一系列流程的定时任务。

业务场景:在银行、金融、支付出现较多,其他行业也可能涉及。
1. 定时的数据状态更新(到期失效)
2. 数据计算(计算罚息、计提)
3. 文件处理、生成文件(对账,同步文件)

二、系统特点

1. 容易造成OOM。对文件或数据库进行读取时,必须考虑线上数据量,如果一次性查询的数据量太大,则需要想办法从业务上拆分数据或进行数据分片,否则容易OutOfMemory。
2. 容易造成慢SQL。由于离线跑批通常会基于日期来做查询,而非实时接口中常见的有索引的查询字段——证件号、会员号等,对数据库进行读时,必须检查SQL是否能走索引及未来数据增长量。
3. 一定要高容错,否则运维成本极高
- 从离线跑批的概念我们可知,一旦任务出现程序bug、中间件或依赖服务宕机,这些批量处理的海量数据和执行流程,就极难人为恢复或处理(特别是和钱打交道的业务)。
- 因此,需要有重试、重跑、兜底处理、重复校验等等代码机制,这些机制则由更底层的事务、任务状态来保障。

重试 / 重跑 / 重复校验任务应是可以手动或自动多次重复执行的,例如虽然在业务上要求每天执行1次,但考虑到异常情况将任务配置成每天执行3次,则在当天有成功执行后就不必再执行了。
兜底处理与实时接口相同,在依赖第三方服务、中间件、文件处理等流程时,需要考虑边界值、异常值、空值等情况,结合业务为程序设计兜底处理方式。
事务 / 任务状态要保证任务能够重复校验,则需要依赖任务状态,进一步讲,任务的状态从初始态到终态,则又由事务来保障。

三、设计思路

1. 将整个业务流程拆分为多个步骤,步骤之间可串行或并行。步骤是带状态的,步骤在正常或异常结束后通过事务将状态更新。
2. 其他Tips
- 可根据业务进行技术选型,xxl-job、Spring Batch等。
- 数据库批量写处理。
- 有顺序的数据即可分片,分片后应可定位到每片数据。
- 纯运算型可通过 lambda并行流运算。

四、实例分析

1. 土豆烧牛肉(仅通过此例简单解释下设计思路,不必纠结细节)

整个流程:每天12点和18点需要制作10000份儿土豆烧牛肉,包括买菜、备菜、烹饪的过程。

步骤拆分:
- 买菜。提交金钱转换为食材事务。该定时任务可在0点~10点每小时执行一次,如果当天食材足够则跳过,否则进行食材购买。
- 备菜。提交食材转换为处理好的食材的事务。该定时任务可在8点~18点每10分执行一次。
- 烹饪。执行成功时,将处理好的食材转换为成品。该定时任务可在9点~18点每10分钟执行一次。
- 食材校验告警。每天10点执行一次,如果当天食材不足够,则发送告警短信提醒,需要人为干预处理。

2. 客户文件管理系统

流程背景:系统首先去指定SFTP下载合同文件到本地目录,之后进行文件签章,上传文件归档平台,最后清理本地目录文件。

步骤拆分:由于该业务流程天然面向过程化,可直接按照业务分为文件下载、文件签章、文件上传、文件清理备份。

3. 银行代扣系统

流程背景:用户从银行贷款后,银行每个月从客户的卡里扣钱。不同贷款产品代扣的时间不同,如房贷A每天9点扣款,车贷B每天12点扣款。每个客户的还款日不同。

步骤拆分:
- 生成批次。提交初始化批次数据的事务(按产品维度,每一个产品一条批次数据)。定时任务可每5分钟执行一次,每次扫描±10分钟内需要进行代扣的产品(这种情况是默认有一个业务配置中心,维护了每个产品的代扣时间,如果没有统一的配置中心,也可以每个产品为一个定时任务仅生成自己的批次)。
- 生成任务。提交初始化任务数据、更新批次表状态为处理中的事务。该定时任务可每5分执行一次。
- 发起代扣。查询任务表中非终态的任务数据,调用代扣接口,提交任务表更新、批次表更新的事务。任务包括初始化、进行中、失败、成功等状态,同时会进行失败重试,记录失败次数和失败原因。
- 失败告警任务。根据实际业务情况,针对失败次数和原因进行统计,或实时SQL进行短信告警。

五、参考文档

高效跑批设计思路——针对系统中的批量、日终任务 - appinn - 博客园


http://chatgpt.dhexx.cn/article/f766ZGDq.shtml

相关文章

跑批利器--示例

接下来我们将通过简单的一个在线商店的应用示例来展示如何使用SpringBatch.通过这个示例我们可以进一步去理解SpringBatch批量处理程序它是如何实现高效的读写数据,何时去使用内部组件,如何实现你自己的组件,以及如何配置一个批量任务在Spring容器中. 这里我们简单描述一下业务…

如何设计一个多线程处理跑批功能

一、背景 最近承接了一个需求,背景是用户当天可以参与比赛竞猜,当天20点前参与竞猜,第二天上午10点出结果。系统的实现思路是用户参与竞猜时增加竞猜记录,第二天早上9点开始进行跑批,跑批依赖业务的配置,要…

跑批利器--批处理应用程序

目前笔者正在进行直销银行互联网核心的设计和研发,在银行相关系统中有一块内容比较关键,那就是跑批.因此接触到了SpringBatch的相关内容,作为学习和记录,有必要将SpringBatch的相关技术点和实际项目中遇到的问题记录下来,同时也跟各位来进行分享和学习. 首先先了解一下什么是批…

跑批 流程、代码梳理

权限系统 全部——ETL服务——计划维护 日程表:到时间触发跑批任务 复制任务编号 ETL设计——作业设计——自定义java——插入语句 找到类所在位置 org.isscloud.portal.agent.scf.batch.FinaResultBatch base下的agent下的scf.batch包下的FinaResultBatch类 S…

跑批为什么这么难

文章目录 问题分析SPL用于跑批应用效果SPL资料 业务系统产生的明细数据通常要经过加工处理,按照一定逻辑计算成需要的结果,用以支持企业的经营活动。这类数据加工任务一般会有很多个,需要批量完成计算,在银行和保险行业常常被称为…

Java开源专业计算引擎:跑批真的这么难吗?

业务系统产生的明细数据通常要经过加工处理,按照一定逻辑计算成需要的结果,用以支持企业的经营活动。这类数据加工任务一般会有很多个,需要批量完成计算,在银行和保险行业常常被称为跑批,其它像石油、电力等行业也经常…

银行跑批业务 的 初步理解(批量批量.....流水账)

一、初步理解 白天的柜台交易, 实时的 对帐户进行操作。 晚上 批量 , 比如 一些报表的生成 , 定期储蓄到期的自动转存 , 行内行外业务清分清算 , 有时还可能赶上利息计算....... 当然 不是所有的数据都是实时操作 , 因此跑批就是为此诞生。 二、逐渐深入 批量…

跑批设计-如何才能让跑批更加高速

跑批的应用场景 在开发过程中跑批经常使用的地方: 消息类:到期失效以及到期批量通知客户计算类:在财务中的罚息、计提、计息文件类:对账信息、还款信息同步以及报表生成 跑批数据特点 数据量非常大实时性并不是特别高&#xf…

跑批bat、shell

“跑批”也叫“批量处理”。批处理,也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat 。 批处理定义:顾名思义&a…

gPRC基础教程

1.什么是RPC? RPC 远过程调用.在理解远程调用之前,首先我们来了解一下本地调用,只有更好的理解了本地调用,才能更好的理解RPC. 1.1 本地调用ex:本地的函数调用在函数调用的时候,一般会经过几个步骤 返回地址入栈参数入栈提升堆栈空间函数参数的复制执行函数调用清空堆栈 1.…

GPRM/GNRMC定位信息的读取与解析

GPRM/GNRMC定位信息的读取与解析 参考网址:http://www.cnblogs.com/88223100/p/GPRM_GNRMC_Transform.html 帧头 UTC时间 状态 纬度 北纬/南纬 经度 东经/西经 速度 $GPRMC hhmmss.sss A/V ddmm.mmmm N/S dddmm.mmmm E/W 节 方位角 UTC日期 磁偏角…

GPRMC转经纬度 地理位置

前言 一、GPRMC是什么? 二、GPRMC如何转经纬度 三、python加地图实现定位 1.Python代码 2.地图定位 四、通过python直接输出位置的尝试 1.需要用到的库geocoder 2.需要准备的库folium 总结 前言 在实际汽车路测的时候会出现GPS偏移,这个时候就需要将GPR…

USB转串口 模拟 PPS+GPRMC 进行授时

把 PC的系统时间 通过USB转串口发出来 来模拟 PPSGPRMC 授时, 这大冷天的, 用来在室内测试MCU或者SOC的授时功能, 传感器的授时与线束检测, 测试干扰等等, 还是比较合适的. 如下图, 左边为 USB转9针RS232串口, 右边为 USB转TTL串口 原理: PPS 有 3V3 / 5V / 12V 等规格, 这里…

GPC规范-SCP02

SPC02 流程 SPC02 指令 命令: 响应: 举例回复: 密钥分散数据: 0000FFFFFFFFFFFFFFFF Key Info: 20 02(scp02) Card挑战数: 001AC6619BE83082 Card加密值: 7…

STM32模拟GPS输出PPS、GPRMC与VLP16时钟同步

这里写目录标题 1.VLP16与GPS相关的管脚:2.利用GPS信息完成时间同步 TimeSynchronization3.查找同步关系4.修改ROS代码结论 1.VLP16与GPS相关的管脚: GPS-RECEIVE 接收GPS的GPRMC语句,注意是RS232电平(high 3-15V,low 1.2V以下)&…

c++处理GPRMC

#include <iostream> #include<string> #include<vector>// A::member 表示A成员中的member // namespace my_vary202234610229 namespace是c的关键字&#xff0c;将变量定义在自己创建的my_vary命名空间 // 访问命名空间中的变量需要作用域分解符 // 命名空…

gPRC基本介绍

1.说明 gRPC英文全名为Google Remote Procedure Call&#xff0c; 即Google远程过程调用&#xff0c; 是Google发布的一个高性能、通用的开源RPC框架&#xff0c; 2.gRPC定义 gRPC是一个现代的开源高性能RPC框架&#xff0c; 可以在任何环境中运行。 它可以高效地连接数据中心内…

自动驾驶时间同步分析概述--PPS/GPRMC/PTP/全域架构时间同步方案

时间同步的重要性在生活中已经充分体现。试想你因一个姑娘在酒吧和别人大打出手&#xff0c;并约定下周六早上九点在后海小树林里进行群体活动。为此你微信召集了在南非、印度、泰国干建筑的好兄弟。可在你如期赴约的时候&#xff0c;发现队友只有河畔的孤影。当你在病床上睁开…

U-BLOX GPS 模块及GPRMC指令解析

受朋友所托&#xff0c;调试一款GPS模块&#xff0c;该模块是UBLOX的NEO-6M GPS模组。想到用这款GPS的人较多&#xff0c;自己日后也有可能在用到这个模块&#xff0c;就写下这份笔记。 一、介绍 基本信息如下&#xff1a; 1、 模块采用U-BLOX NEO-6M模组&#xff0c;体积小巧&…

ROS节点解析GPS数据:GPRMC/GPFDP/HEADINGA

数据解析&#xff0c;肯定是要知道数据格式的&#xff1a; 数据格式参考&#xff1a;&#xff08;前人已经总结的比较齐全了&#xff09; https://blog.csdn.net/u010384390/article/details/78432016?ops_request_misc%257B%2522request%255Fid%2522%253A%2522163031225416…