我正在使用 Google Cloud Endpoints (Java)作为 Android 应用的后端。后端上的数据存储在数据存储区中。
问题是Android客户端通常无法从后端接收正确的数据。重复请求后,最终会收到正确的数据。
你能告诉我什么可能导致这个问题吗? Cloud Endpoints库中是否存在某种响应缓存?或者在Datastore中缓存?
我已经阅读过Datastore提供的最终一致性,所以我尝试在下一次查询请求之前更新实体后至少等待10秒。这够了吗?
非常感谢。
答案 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条目)。如果您想保证一致性,那么您将无法在短时间内获得大量更新。
有意义吗?