同步方案的幂等设计:充值送token任务非异步设计下如何实现幂等性-CSDN博客
1.幂等边界不同
- 同步(syncChain):
整条链路在一个 @Transactional 事务内完成(RechargeService.sync),幂等
只需防「同一请求重复进入」。idempotencyCheckCmp 命中已有订单即 isEnd() 终止整
链,后续全部跳过。
- 异步(produce + consume):
拆成两个独立事务 + MQ 传递。幂等边界从「单 DB 事务」扩展为「DB + MQ + 消费者
进程」,必须防消息重复投递 / redelivery / DLQ 重放 / 生产者重扫,而不仅是客户端重
试。
2.幂等粒度与幂等键不同
|
入口幂等键 |
idempotentKey(订单级) |
produce 端同样用 idempotentKey |
|
发放幂等键 |
复用订单号 orderNo 作为 bizId |
consume 端用 orderNo/bizId 做发放幂等 |
|
检查点 |
idempotencyCheckCmp(订单是否存在) |
produce:idempotencyCheckCmp;consume:consumeIdempotencyCmp(流水是否存在) |
异步把「订单创建幂等」与「Token 发放幂等」拆成两层:
produce 端防重复建单,consume 端防重复发放
3.同步仅靠 DB 约束 + CAS
异步额外需要消息可靠性 + 消费幂等
同步方案仅需要一个事务包着就可以了,而异步方案需要生产端用事务包着、消费端用事务包着;中间依托消息队列,配合本地消息表、重投、死信、双层幂等来实现最终一致性,无法做到全局原子性。其他部分同步和异步方案相比,异步任务节点有调整、幂等多了一层、异步会出现订单已支付但奖励未发放的中间状态,除此之外底层很多业务组件、DB 兜底逻辑区别不大。
网硕互联帮助中心






评论前必须登录!
注册