当前位置: 首页 > news >正文

接口幂等设计

幂等接口设计
常见策略
唯一索引/约束
去重表(配合唯一索引)
状态机幂等
Token 机制(适用于防止重复提交)
分布式锁(Redis/ Zookeeper)
总结
幂等接口设计
网络重试
客户端因超时重试导致请求重复提交

消息重复
消息队列中间件可能重复投递消息

用户误操作
用户多次点击提交按钮

系统容错
分布式系统依赖重试保证最终一致性,幂等性是基础

常见策略
唯一索引/约束

利用数据库的唯一索引防止重复数据插入。
适用于创建业务单据(如订单号、支付流水号唯一)

CREATE TABLE order (
id bigint(20) NOT NULL AUTO_INCREMENT,
order_no varchar(64) NOT NULL COMMENT '订单号',
status tinyint(4) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_order_no (order_no)
) ENGINE=InnoDB;
去重表(配合唯一索引)

使用独立的去重表记录已处理的请求标识,利用数据库唯一约束实现幂等

@Transactional
public void processOrder(Request request) {
String requestId = request.getRequestId();
// 插入去重记录,利用数据库唯一约束
try {
deduplicationDao.insert(requestId);
} catch (DuplicateKeyException e) {
// 已处理,直接返回或抛出异常
return;
}
// 执行实际业务逻辑
orderDao.create(request.getOrder());
}
状态机幂等

对于有状态变更的业务(如订单状态流转),通过限制状态转移方向实现幂等

public boolean payOrder(String orderId) {
Order order = orderDao.selectByOrderId(orderId);
if (order.getStatus() == OrderStatus.PENDING_PAY) {
order.setStatus(OrderStatus.PAID);
orderDao.update(order);
return true;
}
// 已经支付过了,视为成功但不再重复处理
return false;
}
Token 机制(适用于防止重复提交)

服务端生成唯一token下发到客户端(如表单隐藏域)

// 生成token
public String generateToken(String userId) {
String token = UUID.randomUUID().toString();
redisTemplate.opsForValue().set(TOKEN_PREFIX + userId, token, 30, TimeUnit.MINUTES);
return token;
}

// 执行业务前校验token
public boolean checkAndRemoveToken(String userId, String token) {
String key = TOKEN_PREFIX + userId;
String storedToken = redisTemplate.opsForValue().get(key);
if (token.equals(storedToken)) {
redisTemplate.delete(key);
return true;
}
return false;
}
分布式锁(Redis/ Zookeeper)

public void handleRequest(String orderId) {
String lockKey = "lock:order:" + orderId;
boolean locked = redisLock.tryLock(lockKey, 10, TimeUnit.SECONDS);
if (!locked) {
// 未获取到锁,可能是重复请求,直接返回或稍后重试
return;
}
try {
// 检查是否已处理(结合去重表)
if (processedChecker.isProcessed(orderId)) {
return;
}
// 业务处理
doBusiness(orderId);
// 标记已处理
processedChecker.markProcessed(orderId);
} finally {
redisLock.unlock(lockKey);
}
}
总结

新增数据:唯一索引、去重表
状态变更:状态机、乐观锁
防止重复提交:Token、分布式锁
通用方案:幂等键+存储去重+结果缓存

http://www.jsqmd.com/news/424482/

相关文章:

  • 2026年AI搜索优化公司权威榜单:维艺网络如何以GEO定义品牌智能增长新范式 - 呼呼拉呼
  • 2026年质量好的保安公司/高端场所保安公司高效服务推荐 - 行业平台推荐
  • 2026年国防特色专业的靠谱高校,为学生搭建多元成长平台 - 工业品网
  • 2026年综合型农文旅景区策划/实战景区策划规划案例丰富推荐 - 行业平台推荐
  • 2026年九江性价比高的拥有国防特色专业的学校,江西万通职业学院入选 - 工业设备
  • Inno Setup Compiler 超详细使用教程:从零打包 Windows 软件
  • Java高并发核心知识点完整总结
  • 2026年质量好的日本西铁城机床/西铁城宫野机床行业推荐 - 行业平台推荐
  • 湖南口碑好的代理记账品牌盘点,企鑫财税经验丰富吗? - myqiye
  • 2026年经验丰富的shopfiy网站谷歌优化/谷歌优化实力推荐 - 行业平台推荐
  • 话费卡如何在线回收?教你找到放心平台的秘诀 - 团团收购物卡回收
  • 2026年评价高的服务器机箱/服务器网卡优质供应商推荐 - 行业平台推荐
  • 解读2026年湖北开放教育,探讨中专学历能报开放教育吗及转专业问题 - 工业品牌热点
  • 2026年质量好的KNX智能家居系统售后/KNX智能家居灯光源头工厂推荐 - 行业平台推荐
  • 总结2026年上饶智能网联专业学校服务,哪家专业靠谱 - 工业品网
  • 梳理广州地区SCI投稿服务,靠谱的品牌费用多少钱 - 工业推荐榜
  • 瑞祥商联卡回收技巧揭秘 - 团团收购物卡回收
  • 聊聊2026年开车方便到学校的学区房怎么选择 - 工业设备
  • 瑞祥商联卡最新回收方法,教你轻松变现! - 团团收购物卡回收
  • 2026年知名的乙醚/工业乙醚厂家综合实力对比 - 行业平台推荐
  • 分析2026年全屋定制哪家专业,亿方凡工艺精细超靠谱 - 工业品牌热点
  • 2026年热门的大角度二段力铰链/小角度二段力铰链专业制造厂家推荐 - 行业平台推荐
  • 2026年江苏地区靠谱的氧化铝陶瓷厂家排名,推荐国泰陶瓷优质之选 - 工业推荐榜
  • 2026年,成都防水堵漏公司口碑测评|3家本地正规机构实测,避坑指南+选购干货 - 宁夏壹山网络
  • 2026年知名的弥散供氧系统/弥散供氧设备源头厂家推荐几家 - 行业平台推荐
  • 2026年廊坊整屋全包公司排名,推荐一下整屋全包专业公司 - mypinpai
  • 2026年热门的轻奢全屋定制五金/成都全屋定制五金实力品牌厂家推荐 - 行业平台推荐
  • 2026年行业顶尖的智算中心数据中心展/智能运维数据中心展系统推荐 - 行业平台推荐
  • 改稿速度拉满!10个一键生成论文工具测评:本科生毕业论文+科研写作必备推荐
  • Electronic Toll Collection (ETC)