Google Cloud端点与Android - 缓存响应?

时间:2014-09-02 19:03:39

标签: java android google-app-engine google-cloud-endpoints datastore

我正在使用 Google Cloud Endpoints (Java)作为 Android 应用的后端。后端上的数据存储在数据存储区中。

问题是Android客户端通常无法从后端接收正确的数据。重复请求后,最终会收到正确的数据。

你能告诉我什么可能导致这个问题吗? Cloud Endpoints库中是否存在某种响应缓存?或者在Datastore中缓存?

我已经阅读过Datastore提供的最终一致性,所以我尝试在下一次查询请求之前更新实体后至少等待10秒。这够了吗?

非常感谢。

2 个答案:

答案 0 :(得分:2)

直接来自Structuring Data for Strong Consistency的文档:如果您始终要求数据存储区查询的结果保持一致,则需要根据文章中的示例代码使用祖先查询:

Query query = new Query("Greeting", guestbookKey).setAncestor(guestbookKey);

您不能依赖延迟来获得一致性,因为它依赖于跨数据中心的复制,而且这种情况的持续时间永远不会是一致的:)

答案 1 :(得分:1)

听起来,您构建数据模型的方式不符合您希望使用数据模型的方式。如果没有看到您的数据模型示例,我无法向您提供有关如何更改数据的提示,但这是一个可能对您有帮助的简单示例。

假设我有一个" Post"实体和" CommentForPost"实体。用户可以为每个Post条目创建许多CommentForPost条目。从逻辑上讲,CommentForPost是Post的一个孩子,但是如果你不让Post成为所有CommentForPost条目的祖先,那么就不能保证立即的一致性。如果用户A创建了评论然后查询,他们可能不会立即看到该条目。

另一方面,如果您将Post实体作为所有CommentForPost条目的父级,那么您将保证立即一致性,因为它们被保存为单个EntityGroup。如果用户A创建了一个条目并立即查询它(使用Post键作为祖先),那么他们肯定会得到准确的数据。

此处的限制是您每秒只能创建一个CommentForPost条目。这是给予和接受的地方。如果您需要在短时间内进行大量更新,则无法保证一致性(例如,100个用户同时添加了CommentForPost条目)。如果您想保证一致性,那么您将无法在短时间内获得大量更新。

有意义吗?