一、幂等性
1.定义:
HTTP 方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。说白了就是,同一个请求,发送一次和发送 N 次效果是一样的!幂等性是分布式系统设计中十分重要的概念,而 HTTP 的分布式本质也决定了它在 HTTP 中具有重要地位。
我们不能轻易假设分布式环境的可靠性。
【问题】
withdraw 的语义是从 account_id 对应的账户中扣除 amount 数额的钱;如果扣除成功则返回 true,账户余额减少 amount;如果扣除失败则返回 false,账户余额不变。
一种典型的情况是 withdraw 请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了 withdraw 被调用两次,账户也被多扣了一次钱。
【解决】
我们可以通过一些技巧把 withdraw 变成幂等的,比如:
int create_ticket()
bool idempotent_withdraw(ticket_id, account_id, amount)
create_ticket 的语义是获取一个服务器端生成的唯一的处理号 ticket_id,它将用于标识后续的操作。idempotent_withdraw 和 withdraw 的区别在于关联了一个 ticket_id,一个 ticket_id 表示的操作至多只会被处理一次,每次调用都将返回第一次调用时