谷歌应用引擎人力资源开发——一致性与竞争性



我正在尝试为一个简单的图表编辑器建模,该编辑器将数据存储到GAE的HRD数据存储中,我面临的问题我想知道你是否可以给我一些建议。基本上,编辑器的模型是:

[图表]--包含-->[形状]--包含-->[文本]

最初,我将这些放在同一个实体组中,以确保数据一致。通过这样做,每当我添加新形状或向现有形状添加文本对象时,它们都会正确显示(从数据存储中查询);然而,我遇到了问题,因为用户可能会快速添加许多形状,这会导致每秒对图表对象进行一次以上的更新,从而导致写入争用。

或者,我可以这样设计:

[图表][形状-包含图表Id][文本-包含形状Id]

将它们放在不同的实体组中,当我创建一个新形状时,我只需要保存形状对象本身。这解决了写争用问题,但数据不再一致——取决于HRD提交写操作的时间,我可能会得到过时的数据。

我尝试了一些组合,比如将图表放在缓存中,只有在缓存中不包含图表的情况下才能从HRD中检索;然而,这是不可预测的,因为我不能确定图表是否在缓存中(我希望同时编辑许多图表)。。。

处理此类问题的最佳做法是什么?我正在使用Java和JDO,如果这有什么不同的话。。。

注意事项:

  1. 如果您使用get,则HRD读取是强一致的,如果使用query,则最终是一致的(因为查询依赖于索引,而这些索引需要时间来构建)。如果可能的话,你可以使用get来解决你的问题。

  2. 如果文本和形状是一个图表的一部分,并且您不需要单独访问它们,也不需要按文本或形状的属性进行搜索,那么您可以在图表中序列化文本和形状。我使用Objectify,这只是通过字段上的@Serialize注释实现的(我不使用JDO,所以不知道它)。

最新更新