使用幂等性抑制API服务中的重复请求 - tkareine


将幂等性作为建立 API 设计原则来支持。我在这里选择使用 GraphQL 作为应用层协议,但无论使用其他协议,例如 REST 或 RPC,原理都是相同的。

  1. GraphQL 查询操作根据服务器的当前状态返回数据。预计随着时间的推移请求具有特定输入的查询可能会返回不同的数据作为输出,反映服务当前状态的变化。
  2. 所有 GraphQL 变异操作都必须在名为 的参数中包含操作标识符作为输入transactionId。两个具有相同transactionId值的请求表示请求是重复的。客户端必须将标识符生成为随机 UUIDv4值。
  3. 服务器必须仅对特定transactionId值应用一次操作 ,即服务器第一次收到transactionId尚未处理的请求时。
  4. 对具有特定transactionId值的 GraphQL 变异操作的响应 必须始终产生相同的逻辑输出。如果服务器成功处理了变更,则响应必须为所有具有相同transactionId 值的请求发出成功信号。类似地,如果服务器以失败的方式完成处理,则对相同的所有响应都transactionId必须表示该失败。特别是,成功响应可能包含反映数据当前状态的输出,但是当客户端再次请求相同的更改(另一个更改可能已更改数据)时,该输出可能会有所不同。
  5. transactionId必须按原样将相同的值传递给相关服务。

这些原则同样适用于公共 API 和内部 API。
除了第一个原则,我会一一介绍这些原则,它应该是自给自足的。
第二个原则可以区分两个请求并判断它们是否出于相同的目的,即使输入的有效载荷是相同的。
详细点击标题