核算日终任务优化

系统现状

现在系统日终任务执行时间大概在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使用率过高
  • 准备充分的投产回滚方案,防止日终执行一半因异常无法继续,回滚也无法继续的情况发生
  • 日终任务有延期甚至无法完成的风险