在appengine HRD上的实体之间具有一致的继承属性

时间:2012-01-27 21:48:48

标签: google-app-engine google-cloud-datastore eventual-consistency

我正在实施一个文件系统。每个文件夹都有一个ACL,它基本上只是一个允许读/写文件夹的用户ID列表。我想通过将ACL从上层文件夹复制到较低级别文件夹来实现这一点 - 我希望继承权限,但我不想在读取时查找它们。我将文件夹之间的关系存储为子文件夹中超级文件夹的引用。

然后,HRD很难解决以下操作顺序:

  1. 将文件夹B作为文件夹A的子文件夹放在数据存储区中,该文件夹已存在。
  2. 更改A。
  3. 的权限

    问题在于,当我在步骤2中更改A的权限时,我需要查找A的所有子项,以便我也可以将权限更改应用于它们。不幸的是,这意味着一个查询,因此B可能不会出现在该查询中。 B可能会错过许可变更!

    到目前为止,我所考虑的唯一解决方案是双向存储“子文件夹”关系:A引用其所有子文件夹,B引用其超级文件夹。然后我可以使用跨组事务同时更新A和B,并且在步骤2中不需要查询。这可能更好,因为直接获取可以轻松缓存,不需要索引扫描等。

    有没有其他想法?我不喜欢这个解决方案的冗余存储需求,也不喜欢XG事务的需要。

1 个答案:

答案 0 :(得分:1)

数据存储区中唯一的事务性和强一致性单元是实体组。因此,如果您希望B的读者了解A对事务保证的更改,则A和B需要位于同一组中。听起来你正试图避免这种方法的缺点(争用,每组写入率),所以我们需要找到一个可接受的权衡。

例如,如果A和B实体属于同一组是不可接受的,但是这种元数据的实例存在于同一组中是可以接受的(例如,如果很少更新),与原始实体分开(如果实体的XG更新和此元数据正常),您可以将数据保持独立和类似。

如果您的数据结构可以快速识别B的所有层次结构祖先,则可以在确定B及其祖先的聚合元数据属性时执行所有祖先的异步读取。您可以通过存储实体的完整路径来管理它。这涉及更多数据存储操作(按路径长度的顺序),但请求时间不多,您可以保持此数据的标准化。