设计健壮和幂等的 Web API

网络和服务端的问题都会导致 API 出错, 解决这个问题需要遵循 3 个原则:

  1. 网络故障后, 客户端需要重新发送请求来保持一致性
  2. 客户端因为网络故障重新发送的请求需要保持幂等性, 也就是说需要带上一个用于保持幂等的 id
    1. 在 RESTful API 中, PUT, GET, DELETE 这些动词都具有幂等性
    2. POST 不能保持幂等, 因此需要使用一个键 id 来区分请求. 这个键是这样用的:
      1. 如果客户端这一侧在发请求前失败了, 重发后对于服务端来说是透明的, 不存在什么问题
      2. 如果客户端发请求到服务端后, 服务端处理时出错了, 那么需要数据库具备 ACID 特性, 将处理包装成事务即可. 失败了就标记该 id 并返回错误.
      3. 如果服务端事务处理成功了, 但响应没能到达客户端, 那么客户端会重发请求, 服务端只需要根据 id 将缓存的结果返回即可
  3. 同时, 需要避免客户端重新发送请求的频率, 避免请求阻塞.

返回首页