分布式幂等性

35 阅读1分钟

解释下幂等性

幂等性的意思是一次请求和多次请求结果都是一样。

数学函数:
f(x) = f(f(x)) 函数套函数结果还是等于函数
abs(x) = abs(abs(x)) 绝对值套绝对值还是等于绝对值

为什么有幂等性?

服务之间的调用有三种情况:成功,失败,超时
超时情况:

  • 丢包:我发起请求,对方没收到或者对方收到了没处理

举几个例子:第一次调用创建订单服务超时了,再重试一次

  • 多创建一次订单
  • 多扣一次库存
  • 多扣一次钱

有什么办法做到幂等性

全局ID 为什么不用uuid?

  • 占用空间大
  • 不利于阅读
  • 不是自增,不利于索引。每次插入数据,索引树都要调整
  • 生成的成本高

解决方法:

  • 雪花算法(适合分布式)
    • 64bit
    • 排序性好
    • 索引好
    • 高性能
  • 自增ID(适合单数据库)
    • 查询快
    • 存储小
    • 调试友好
  • 时间戳+业务ID
    • 订单号
    • 流水号

http幂等性

  • get获取资源,不应该有副作用,幂等

image.png

  • delete删除资源,有副作用,应该满幂等

image.png

  • post创建资源,有副作用,不满足幂等

image.png

  • put创建或更新,有副作用,应该满足幂等

image.png