解释下幂等性
幂等性的意思是一次请求和多次请求结果都是一样。
数学函数:
f(x) = f(f(x)) 函数套函数结果还是等于函数
abs(x) = abs(abs(x)) 绝对值套绝对值还是等于绝对值
为什么有幂等性?
服务之间的调用有三种情况:成功,失败,超时
超时情况:
- 丢包:我发起请求,对方没收到或者对方收到了没处理
举几个例子:第一次调用创建订单服务超时了,再重试一次
- 多创建一次订单
- 多扣一次库存
- 多扣一次钱
有什么办法做到幂等性
全局ID 为什么不用uuid?
- 占用空间大
- 不利于阅读
- 不是自增,不利于索引。每次插入数据,索引树都要调整
- 生成的成本高
解决方法:
- 雪花算法(适合分布式)
- 64bit
- 排序性好
- 索引好
- 高性能
- 自增ID(适合单数据库)
- 查询快
- 存储小
- 调试友好
- 时间戳+业务ID
- 订单号
- 流水号
http幂等性
- get获取资源,不应该有副作用,幂等
- delete删除资源,有副作用,应该满幂等
- post创建资源,有副作用,不满足幂等
- put创建或更新,有副作用,应该满足幂等