记一次问题梳理思路

(Situation)背景 在系统中,我们支持批量处理产品对接与修改。随着业务发展,用户希望一次批量操作上百甚至上千个产品。但我们发现,在和流程引擎联动进行批量任务时,系统出现了数据库连接池耗尽、发布失败的问题,影响了用…


(Situation)背景

在系统中,我们支持批量处理产品对接与修改。随着业务发展,用户希望一次批量操作上百甚至上千个产品。但我们发现,在和流程引擎联动进行批量任务时,系统出现了数据库连接池耗尽、发布失败的问题,影响了用户体验并造成流程失败。

一、后台系统 与 流程引擎的系统交互梳理

1.1 系统关系概述

  • flowable(流程引擎):负责流程任务调度、任务变量传递、打包发布、同步执行控制。
  • 后端系统(配置系统):接收 流程 调用,实现渠道产品的配置、复制等逻辑。

1.2 实际调用关系梳理

1.3 调用模式确认

  • ✅ 流程引擎 是串行调用 后台 接口的:每个产品单独发起一次调用,等待 IAC 响应后再处理下一个。
  • ⚠️ 系统 内部存在并发处理问题:使用了 parallelStream / CompletableFuture 一次性并发处理全部产品,容易压垮连接池。

T(Task)任务目标

  • 分析问题根源:找出为什么批量处理会失败。
  • 设计优化方案:在不影响流程引擎调用逻辑的前提下,实现大规模产品对接的能力。
  • 最终目标:支持上千产品的稳定对接,并提升系统性能与可维护性。

二、存在问题分析

问题点 描述 风险

❌ 系统并发处理产品 柳成荫串行调用 后端系统,但 后端系统 内部存在 并发处理多个产品的逻辑(如 parallelStream / CompletableFuture) 导致一个流程调用同时处理几十个产品,占满连接池,数据库连接池耗尽,接口阻塞

❌ 无事务优化 每个产品涉及 27 次数据库操作 无批处理,事务控制不统一

❌ 无任务状态跟踪 用户感知不到处理进度 可观测性差,无法失败重试

A(Action)采取的行动

三、整改优化(基于 流程引擎 串行调用)

3.1 后端系统 优化(重点)

✅ 代码层优化

  • 移除 parallelStream / CompletableFuture 的全量并发处理
  • 每次只处理当前这个产品,不在 IAC 内部并发多个产品

✅ 数据层优化

  • 涉及 27 张表的读写 每个产品在 copy 时会操作多个表:渠道产品表、展示信息表、扩展配置表…..and so on
  • 多表写入统一事务,避免碎片化连接调用

✅ 耗时监控

  • 增加日志记录每个产品处理耗时,用于后续定位瓶颈

Q&A

Q1:为什么现在有连接耗尽问题?

后端 内部对 流程引擎 发起的单个调用,错误地并发处理了全部产品,导致连接池耗尽。

Q2:为什么不是 流程引擎 的问题?

后端系统 是串行执行,每个产品逐个调用 后端系统 并等待完成,没有并发行为。

Q3:那应该怎么改?

保证每次调用只处理一个产品,移除并发逻辑,提升单次处理性能,配合数据库批处理优化。

Q4:是否可以无上限处理?

理论上可以,串行处理只需保证单次产品处理性能足够,系统资源充足即可;但建议仍设上限以避免极端数据导致接口处理超时。如果一次批量修改产品过多,需等待时间稍长,但是一个产品 处理2-3s 也不慢了。

R(Result)成果效果

指标/结果 优化前 优化后

接口并发量 全部产品同时执行 每次只处理 1 个产品

数据库连接 耗尽/阻塞 连接池保持正常

流程打包耗时 超时/失败 稳定处理,串行打包每个产品

系统稳定性 存在雪崩风险 明显提升,任务顺利推进

经验成长

  • 更清晰理解 调用链责任边界:流程引擎 负责流程调度,后端系统 专注单产品处理;
  • 提升了对 连接池/事务/线程池资源消耗 的认知;

评论