总体思路

悲观锁 + 短事务

  1. 如何实现短事务

    1. 业务流程处理中不开事务,将需要完成的DB操作存到一个ThreadLocal中
    2. 当前节点处理完成时,开启事务把DB操作提交掉

      幂等

      并发支付,支付单落数据库时,唯一键冲突

      前置幂等表(确定分库分表位)

      解决分布式场景下,一笔请求的分库分表位的一致性问题(跨库幂等)
  2. 请求落库的分库分表位

    1. 依据请求唯一键来决定(外部单号+机构号)
  3. 业务分库分表位
    1. 业务单的中的唯一键

业务幂等表(同库幂等)

关键幂等字段

  1. 外部请求号+交易类型
    1. 有些机构支付和退款会用同一个请求单号

业务流程

数据库唯一键冲突异常捕获流程:
DDD视角下的分布式与一致性解决方案 - 图1

幂等处理流程:
DDD视角下的分布式与一致性解决方案 - 图2

幂等但报文摘要不一致

并发锁

业务锁——基于数据库的业务锁

  1. Save支付操作时上订单锁——操作锁订单
    1. 落支付单
    2. 订单锁操作
    3. 同时落守护异步命令
  2. 支付操作执行完成后释放锁

DDD视角下的分布式与一致性解决方案 - 图3

  1. // 事务

乐观锁——基于版本号的乐观锁

一致性守护(异步命令)