You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求兼顾并发安全与性能的RuleValidation批量执行算法方案

批量RuleValidation优化方案:兼顾并发安全与性能

核心问题拆解

当前两个方案的致命缺陷:

  • 按用户分片会导致同一Duty被多批次同时处理,触发数据库写冲突
  • 按Duty分片会重复读取用户的7表关联数据,IO开销占比过高(20秒的读取是主要性能瓶颈)

最优解决方案:用户数据预加载 + Duty分片并发

这个方案从根源上解决两个问题,具体步骤如下:

  1. 一次性预加载全量用户关联数据

    • 批量查询所有涉及验证的用户(2000名)及其关联的7表资质数据(许可证、培训记录等),将数据整合后缓存到内存中(比如用HashMap<用户ID, 整合后资质数据>)。这一步只执行一次,把原本重复多次的IO操作压缩为单次,直接消除20秒的读取瓶颈。
  2. 按Duty维度分片,单分片单线程处理

    • 将所有需要验证的Duty划分为若干小批次,每个批次分配独立线程处理。关键原则:同一Duty只会出现在一个批次中,彻底避免多线程同时修改同一Duty的验证结果,解决并发冲突问题。
  3. 单Duty内批量验证并写入结果

    • 对每个Duty,直接从内存缓存中提取其所有分配用户的资质数据,执行RuleValidation逻辑;验证完成后,将该Duty下所有用户的验证结果批量写入数据库,减少数据库连接和IO次数。

多实例部署场景的扩展方案

如果系统是多服务实例部署,单进程分片无法充分利用算力,可引入分布式锁机制:

  1. 将预加载的用户全量数据存入分布式缓存(如Redis),让所有实例共享
  2. 使用Duty ID作为锁键,通过分布式锁(如Redisson的可重入锁)确保同一时间只有一个实例的线程处理该Duty
  3. 各实例线程随机获取未被锁定的Duty进行验证,处理完成后释放锁

辅助优化手段

  • 前置数据过滤:预加载用户数据时,直接过滤掉完全不满足任何Duty基础要求的用户(如许可证过期、未完成强制培训),减少后续验证的计算量
  • 异步批量写入:若验证结果不需要实时同步到业务链路,可将写入数据库的操作放入异步队列,先返回处理完成,后台批量执行写入,进一步压缩耗时
  • 数据库索引优化:检查用户关联数据查询的SQL,确保7张表的关联字段都建立了合适的索引,降低预加载阶段的查询耗时

内容的提问来源于stack exchange,提问作者Hiren Desai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:15:09