REST API:如何确保原子性?

时间:2016-05-27 06:24:06

标签: rest error-handling crash atomicity

我正在开发一个小型REST API。当我开始分析所有可能的故障情况时,我必须处理以创建一个可靠和稳定的系统,我开始考虑如何使我的API成为原子。

如果我们采用通过POST API创建联系人的简单案例。

  • 服务器获取新联系人的POST请求。
  • 在数据库中创建联系人。
  • 创建回复以发送回客户端。
  • 服务器在发送响应之前崩溃。
  • 客户端收到超时错误(或拒绝连接?)

客户端必然会认为联系人创建失败了,但事实上,联系人是在数据库中。

这是一个我们可以忽略的罕见案例吗?大公司如何处理这样的问题?

2 个答案:

答案 0 :(得分:2)

要处理这个问题,你应该使你的写API具有幂等性,即如果多次执行相同的操作,结果应该与操作只进行一次相同。

要在当前示例中实现此目的,您需要能够基于某些参数(例如emailAddress)唯一地标识联系人。因此,如果使用相同的emailAddress再次调用createContact,请检查数据库中是否已存在与emailAddress的联系人。如果是,请返回现有联系人。否则,使用emailAddress创建一个新联系人并将其返回。

希望这有帮助。

答案 1 :(得分:1)

如果请求超时,客户端不应对其失败或成功做出任何假设。

如果只是一个用户从Web表单发出请求,那么超时应该只暴露给用户,他们可以点击后退按钮并检查操作是否成功,如果不是,他们提交请求再次。 (只要你始终保持一致的状态,这就没问题。如果你的操作有多个步骤并且在中途失败,你需要回滚。)

但是,如果可靠的消息传递对您的应用程序很重要,则必须使用库或构建自己的可靠消息传递层。这可以通过让客户端为每个请求分配唯一ID,并使用另一个请求来让您稍后检查该请求ID的结果来实现。然后,您可以进行自动重试,但仅在必要时进行。