REST状态代码和最终一致性?

时间:2014-04-08 10:00:45

标签: google-app-engine http rest jpa eventual-consistency

我有一个在Google App Engine上运行的RESTful网络服务,并使用JPA在GAE数据存储中存储实体。

使用POST请求创建新实体(因为服务器将生成实体ID)。

但是,我不确定要返回的最佳状态代码,因为GAE DS最终是一致的。我考虑过以下几点:

  • 200 OK:RFC声明响应正文应包含“描述或包含操作结果的实体”。这是可以实现的,因为实体在持久保存到DS时使用生成的ID进行更新,因此可以直接序列化并返回更新的实体。但是,ID对该实体的后续GET请求可能会失败,因为所有节点可能尚未达到一致性(这已被视为我的客户端应用程序的真实问题)。
  • 201已创建:如上所述,如果尚未达到一致性,则返回新实体的URI可能会导致客户端出现问题。
  • 202接受:将消除上述问题,但无法通知客户新实体的ID。

在这种情况下,最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

按键获取将始终保持一致,因此根据您的条件,200响应将是正常的,除非Google版权存在问题。你确定你观察到的问题来自获取而不是查询。按键选择KEY与GET的查询之间存在差异。

要使查询保持一致,它必须是祖先查询,或者GET是一致的,其他任何东西都可能看到不一致的数据,因为索引尚未更新。

这是假设谷歌土地没有实际问题。我们过去曾遇到过一些问题,那里的数据中心是迟到的复制,最终的整合很晚,有时甚至是几个小时。

但是你无法知道这一点,所以你要么必须假设一切都好,要么采取极其悲观的态度。

答案 1 :(得分:0)

这取决于您使用的JSON REST协议。只是总是返回一个json对象不是很RESTful。

你应该看看其中一些:

回答你问题: 我更喜欢使用一种格式,资源本身知道它的URL,所以我会使用201,但也返回整个资源。

最简单的方法是使用jsonapi和一个方便的url架构,这样你就可以通过url找到一个ressource,因为你知道id。