构建Google App Engine以实现强大的一致性

时间:2012-10-22 03:31:46

标签: google-app-engine

我想要完成这个计划,以实现与GAE结构的强烈一致性。目前,这就是我所拥有的(这很简单,我保证):

您有一个类(类意味着课堂而不是编程“类”)模型和分配模型以及用户模型。现在,Class有一个名为memberIds的整数列表属性,它是用户ID的索引列表。类还有一个Assignment id的字符串列表。

无论何时创建新的Assignment,其各自的Class实体也会更新,并将新的Assignment id添加到其列表中。

我想要做的是为用户获取新的分配。对于所有memberId = currentUserId的类,我所做的是查询。每个我上课的课程都有一个作业ID列表。我使用这些ID来按键获取各自的作业。使用这个数据模型几个月之后,我才意识到我可能与此没有很强的一致性(对于类查询部分)。

如果用户A发布了一个作业(因此更新了ClassA),那么稍后检查新作业的用户B可能还没有看到对ClassA的更新更改(对吗?)。

这是不受欢迎的。一个解决方案是用户祖先查询,但在我的情况下这是不可能的,并且实体组每秒限制为1次写入,我不确定这对我的情况是否足够。

所以这就是我的想法:无论何时发布新作业,我们都会这样做:

  • 获取相应的班级实体
  • 将作业ID添加到班级
  • 获取所有班级成员的ID
  • 按键
  • 获取所有成员用户
  • 用户实体具有用户所属的类列表。 (LocalStructuredProperty,有点像字典:{“classId”:“242”,“hasNewAssignment”:“是”})。我们将该类标记为hasNewAssignment = YES
  • 现在,当用户想要获得新作业时,而不是查询,而不是具有新作业且我是其成员的论坛,我 检查类的用户对象列表并检查哪些类具有 新任务。
  • 我按键检索这些类(到目前为止一直非常一致,对吗?)
  • 我检查了课程的作业列表,然后按键检索所有作业。

所以在整个过程中,我从未质疑过。所有结果应该是一致的,对吧?这是一个好的解决方案吗?我是不是太复杂了?我的读/写费用是否暴涨?你觉得怎么样?

2 个答案:

答案 0 :(得分:2)

查询不一致。获取非常一致。

我认为你做对了:

  1. 您的访问权限非常一致。
  2. 你的阅读会更便宜:一次获得便宜一半,然后查询返回一个实体。
  3. 您写的内容会更贵:您还需要更新所有用户实体。
  4. 因此,成本取决于您的使用模式:您创建了多少分配读取与新分配创建。

答案 1 :(得分:0)

我认为使用祖先查询是一种更好的解决方案。

  • 将分配实体的祖先设置为分配分配的类
  • 将学生实体的祖先设置为学生所属的班级。

这样,特定类中的所有作业和学生都属于同一个实体组。因此,一个只需要处理一个类的查询就可以保证强一致性。

N.B。我假设没有太多人不会同时在课堂上发布作业。 (但是任何数量的人都可以将作业分配到不同的班级,因为他们属于不同的实体组)