
核算日终任务优化
核算日终任务优化
系统现状
现在系统日终任务执行时间大概在3个半小时,每个步骤详细时间如下:
步骤说明 | 任务名称 | 总耗时 | 多节点 | 优化建议 |
---|---|---|---|---|
批量初始化 | loans.deProcJob.init | 0:00:14 | 否 | |
借据新五级分类更新 | loans.deProcJob.lgrd | 0:23:15 | 否 | 改造支持多节点 |
客户新五级分类更新 | loans.deProcJob.cgrd | 0:07:29 | 否 | 改造支持多节点 |
代偿更新逾期标识 | loans.deProcJob.lnyq | 0:04:50 | 否 | |
日终借据宽限期调整 | loans.deProcJob.lnkx | 0:00:03 | 是 | |
日终借据宽限期调整 | loans.deProcJob.lnkx | 0:00:06 | 是 | |
阶段发生变化时更新借据表的利率 | loans.deProcJob.lstl | 0:00:16 | 否 | |
90天形态转移 | loans.deProcJob.lnan | 0:01:52 | 否 | |
批扣文件配置隔日生效 | loans.deProcJob.lnpk | 0:00:00 | 否 | |
逾期本金核算规则更改 | loans.deProcJob.lnxx | 0:00:30 | 是 | |
逾期本金核算规则更改 | loans.deProcJob.lnxx | 0:00:32 | 是 | |
生成对内还款计划 | loans.deProcJob.lngl | 0:00:38 | 是 | |
生成对内还款计划 | loans.deProcJob.lngl | 0:00:38 | 是 | |
利息计提 | loans.deProcJob.lnae | 0:17:34 | 是 | 增加节点 |
利息计提 | loans.deProcJob.lnae | 0:20:57 | 是 | 增加节点 |
滚积数 | loans.deProcJob.lnjs | 0:01:35 | 是 | |
滚积数 | loans.deProcJob.lnjs | 0:01:44 | 是 | |
代偿滚积数 | loans.deProcJob.lnjsr | 0:02:51 | 否 | |
延期滚积数 | loans.deProcJob.lnjsd | 0:07:29 | 否 | |
五级分类 | loans.deProcJob.ln05 | 0:00:08 | 否 | |
金额摊销 | loans.deProcJob.lntx | 0:00:03 | 是 | |
金额摊销 | loans.deProcJob.lntx | 0:00:03 | 是 | |
特殊新五级分类更新 | loans.deProcJob.ogrd | 0:07:21 | 否 | 改造支持多节点 |
计算服务费 | loans.deProcJob.lnsc | 0:00:18 | 否 | |
推送信贷文件到总账 | loans.deProcJob.lnsf-build | 0:02:19 | 否 | |
营业日期切换 | loans.deProcJob.cutday | 0:00:02 | 否 | |
日初内部信息更新 | loans.deProcJob.lnao | 0:02:16 | 否 | |
信贷文件推送总账系统 | loans.deProcJob.lnsf | 0:00:20 | 否 | |
正常利息结息 | loans.deProcJob.lnab | 0:00:52 | 是 | |
正常利息结息 | loans.deProcJob.lnab | 0:01:05 | 是 | |
罚息复利结息 | loans.deProcJob.lnaa | 0:00:10 | 是 | |
罚息复利结息 | loans.deProcJob.lnaa | 0:00:15 | 是 | |
贷款滞纳金违约金结记 | loans.deProcJob.lncf | 0:00:21 | 否 | |
代偿延期费用计算 | loans.deProcJob.lnpsr | 0:02:21 | 否 | |
摊销新规处理 | loans.deProcJob.lame | 0:00:02 | 否 | |
代偿罚息复利结息 | loans.deProcJob.lnaar | 0:00:27 | 否 | |
延期罚息复利结息 | loans.deProcJob.lnaad | 0:00:05 | 否 | |
费用结算 | loans.deProcJob.lnfs | 0:00:09 | 是 | |
费用结算 | loans.deProcJob.lnfs | 0:00:09 | 是 | |
借据机构变更 | loans.deProcJob.lnyy | 0:00:04 | 否 | |
向核心同步借据状态 | loans.deProcJob.tbhx | 0:00:58 | 否 | |
同步代偿登记簿 | loans.deProcJob.dcop | 0:04:55 | 否 | |
入催数据同步和汇总发送借据信息-前置 | loans.deProcJob.deletebefore | 0:00:00 | 否 | |
入催数据同步 | loans.deProcJob.qyod | 0:17:22 | 否 | 改造支持多节点 |
入催数据迁移 | loans.deProcJob.qyot | 0:00:40 | 否 | |
汇总发送借据信息 | loans.deProcJob.lsts | 0:22:20 | 否 | 改造支持多节点 |
放置通知核心缓存 | loans.deProcJob.lstc | 0:00:00 | 否 | |
宽限期恢复 | loans.deProcJob.loga | 0:00:00 | 否 | |
日终结束 | loans.deProcJob.end | 0:01:01 | 否 | |
会计引擎日终 | pollingRedisJob | 1:19:12 | 否 | |
会计引擎日终 | deProcJob | 0:32:42 | 否 | |
会计引擎切日 | systemChangeDate | 0:00:00 | 否 |
优化方案
针对当前日终任务执行时间较长的几个任务,提出以下优化方案:
- 借据新五级分类更新(loans.deProcJob.lgrd)
耗时:0:23:15
优化方案:移出日终跑批任务,改造代码,优化为多节点跑批 - 客户新五级分类更新(loans.deProcJob.cgrd)
耗时:0:07:29
优化方案:移出日终跑批任务,改造代码,优化为多节点跑批 - 利息计提(loans.deProcJob.lnae)
耗时:0:20:57
优化方案:直接增加节点进行跑批 - 特殊新五级分类更新(loans.deProcJob.ogrd)
耗时:0:07:21
优化方案:移出日终跑批任务,改造代码,优化为多节点跑批 - 入催数据同步(loans.deProcJob.qyod)
耗时:0:17:22
优化方案:改造代码,优化为多节点跑批。检查SQL执行时间,考虑SQL优化空间。查询生产own-batch日志获取以下数据:- 逾期笔数总耗时
- 当前账单金额总耗时
- 平均回款天数总耗时
- 借据所有回款金额总耗时
- 当天回款金额总耗时
- 批扣扣款失败原因总耗时
- 借据逾期信息总耗时
- 汇总发送借据信息(loans.deProcJob.lsts)
耗时:0:22:20
优化方案:移出日终跑批任务,改造代码,优化为多节点跑批 - 会计引擎日终(pollingRedisJob)
耗时:1:19:12
优化方案:增加account-service服务数量,加速消息队列消费 - 会计引擎日终(deProcJob)
耗时:0:32:42
优化方案:验证生产环境分录校验SQL执行时间,再具体分析
实施步骤
阶段一:从生产获取跑批的实时监控数据,论证上述改造方案的合理性与可行性
- 分析
入催数据同步
和会计引擎日终
任务的SQL耗时,先从SQL优化入手 - 当前任务耗时统计只有每个任务的耗时,要具体到每个分片,每个服务的耗时
- 要考虑到MySQL数据库的负载,避免增加节点引起MySQL数据库服务器的超负荷
- 要考虑Redis服务器的运行内存,避免增加节点导致记账消息队列堆积过多的消息,导致Redis内存不足
阶段二:可以多节点跑的任务,修改代码支持多节点跑批
- 评估多节点跑批代码修改方案
- 后续关于增加日终任务都要首先考虑能否支持多节点跑批
阶段三:构建孤岛环境,导入生产数据,模拟测试日终优化效率
- 从生产导出全量数据,导入到孤岛环境,并验证数据完整性
- 增加两台孤岛环境服务器
- 增加account-service服务到六个节点,own-batch服务到四个节点
- 修改日终任务配置文件,移除五级分类和汇总发送借据信息,修改支持多节点的任务为四个节点
- 开始持续的日终跑批,同时检测服务器、数据库、Redis、核算微服务各项指标
- 模拟投产回滚方案,使日终批处理在执行一半时可以正常回滚,并完成所有任务的执行
阶段四:生产环境投产
- 按照准生产环境的配置和部署方式同步投产到生产环境,进行日终跑批耗时验证,同时要着重关注服务器、数据库、Redis、核算微服务各项指标。
- 准备投产回滚方案,在日终任务执行无法进行时,保留好所有监控信息,服务日志,执行回归方案,保证日终不延期
风险管理
- 防止多节点跑批改造有任务重复执行、数据遗漏和重复的情况
- 防止因节点增加,消息队列消息堆积,导致Redis内存不足的情况
- 防止 MySQL 数据库连接数不足和查询时间、锁等待时间变长
- 防止 MySQL 数据库服务器出现CPU使用率过高
- 准备充分的投产回滚方案,防止日终执行一半因异常无法继续,回滚也无法继续的情况发生
- 日终任务有延期甚至无法完成的风险
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自Tony's Blog