Files
geMoldInsight/docs/PERFORMANCE_SCALABILITY_PLAN.md
T
2026-03-25 23:59:29 +08:00

2.0 KiB

性能与扩展性评估补充(模具订单/采购主线)

1. 高并发冲突面与加固点

1.1 新增/修改模具订单的锁冲突来源

  • 冲突对象:同一仓库同一物料的 inventory 行。
  • 冲突操作:创建订单自动扣料、按单领料、修改订单回补再扣减。

1.2 已落地的并发加固

  • 对库存扣减采用原子更新(UPDATE ... SET quantity = quantity - :qty WHERE quantity >= :qty RETURNING quantity),避免“读-改-写”丢失更新与超卖。

2. 慢 SQL 发现与清单产出方法

2.1 生产环境抓取

  • 启用 pg_stat_statements 并定期采样均值/最大耗时 TopN。
  • 参考脚本:scripts/db/030_pg_stat_statements.sql。

2.2 代码层高风险查询点(需要重点盯)

  • 订单列表/详情:按 customer_id/status/order_date 过滤 + 明细表 join。
  • 库存流水:按 warehouse_id/created_at 分页、按 reference_type/reference_id 追溯。
  • 物料需求计算:必须避免 N+1(已将 BOM 查询批量化)。

3. 索引与查询重写(可执行脚本)

  • scripts/db/002_indexes_and_constraints.sql 覆盖:
    • 订单头状态/客户组合索引
    • 明细表 order_id/product_id 索引
    • 流水 warehouse_id+created_at、reference_type+reference_id 索引
    • 库存唯一约束与关键 check 约束

4. 千万级订单量扩展路线

4.1 优先方案:PostgreSQL 分区

  • 表:sales_orders、purchase_orders 按 order_date 月分区。
  • 参考模板:scripts/db/010_partitioning_template.sql。

4.2 分库分表(必要时)

  • 拆分键:org_id(库路由)+ order_date(表分区)。
  • 灰度步骤:双写→读切换→写切换→数据校验→下线旧库。

5. 缓存建议(可选)

  • 读多写少:产品/BOM/供应商/客户可使用本地缓存(Caffeine 类似策略在 Python 可用 LRU/TTL)或 Redis。
  • 幂等:新增订单建议引入 idempotency_key(请求头/字段),避免重复提交造成重复扣料与重复下单。