订单系统中的幂等实现

一.订单提交的例子

一个订单生成并支付的过程,大致为:用户点击前端页面提交订单->后端根据此次提交信息生成订单->用户确认订单并进行支付操作->支付成功。

主要分为前端层面,后端系统层面,数据库层面。前端层面不详述,大约是防抖动处理之类的(按钮几秒内禁用)。

1.1 后端系统层面

1.1.1 如何保证生成唯一的订单ID。

为用户界面生成唯一的++token++,并根据此token生成相应的订单ID。

token的获取:

通过令牌桶、队列等等方式。

针对该token对应的数据操作:

分布式锁、事务,保证该token操作的唯一性、原子性,直至生成订单行ID

1.1.2 如何保证订单支付幂等

以订单ID作为唯一标识,贯穿后续操作

订单状态验证、分布式锁、事务保证订单操作的正确性、唯一性、原子性:

其中状态验证主要是保证多线程的处理的时候,订单流转不错乱。

分布式锁保证只有一个线程在处理该带哪个单

事务保证一个线程种,订单相关操作的原子性,一致性。

通过同步接口、轮询机制、重试机制进行支付结果获取:

同步接口若直接返回支付成功,则支付成功。

若未返回,重试(这里要有支付唯一标识)或者轮询结果(查询接口),来获取支付结果,更新订单状态,返回给用户结果(同步接口直接返回,接口超时可以要求用户刷新页面等)。

待补充微服务间的接口、消息幂等,数据一致性等

相关推荐
地瓜伯伯9 小时前
Nginx终极配置指南:负载均衡、限流、反向代理、IP白名单、SSL、云原生、DNS解析、缓存加速全都有
spring boot·nginx·spring·spring cloud·微服务·云原生·负载均衡
Hernon11 小时前
微服务架构设计 - 配置中心的选择
微服务·架构
Crazy Struggle18 小时前
.NET 8 微服务框架长什么样?集成 AI 智能体、多租户、自动调度与实时通信
微服务·.net·.net 8.0
小安同学iter19 小时前
天机学堂day05
java·开发语言·spring boot·分布式·后端·spring cloud·微服务
明月惊雀20 小时前
微服务搭建踩坑
微服务·云原生·架构
闲人编程1 天前
微服务API网关设计模式
python·缓存·微服务·设计模式·系统安全·api·codecapsule
明月惊雀1 天前
微服务依赖版本管理
java·数据库·微服务
拾忆,想起1 天前
Dubbo服务访问控制(ACL)完全指南:从IP黑白名单到自定义安全策略
前端·网络·网络协议·tcp/ip·微服务·php·dubbo
拾忆,想起1 天前
Dubbo序列化性能优化实战:从协议选型到极致调优
前端·微服务·性能优化·架构·dubbo·safari
MC皮蛋侠客1 天前
使用 GoZero 快速构建高性能微服务项目
微服务·云原生·架构·go