Google 应用引擎 - REST 状态代码和最终一致性



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

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

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

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

在这种情况下,什么将被视为最佳实践?

获取键将始终保持一致,因此根据您的条件,200 响应将是 Ok,除非 google land 出现问题。 您确定观察到的问题来自获取而不是查询吗? 选择 KEY 的查询与通过键选择 GET 的查询之间存在差异。

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

这一切都是假设谷歌土地没有实际问题。我们过去也遇到过一些问题,其中数据中心的延迟复制和最终一致性非常晚,有时甚至数小时。

但是你没有办法知道这一点,所以你要么假设一切都好,要么采取极其悲观的方法。

这取决于

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

您应该查看其中的一些:

  • jsonapi.org/format/
  • http://stateless.co/hal_specification.html
  • http://amundsen.com/media-types/collection/

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

最简单的方法是将 jsonapi 与方便的 url 模式一起使用,这样您就可以通过 url 找到资源,因为您知道 id。

最新更新