AppEngine Java的Reindex任务/映射器/作业

时间:2013-03-06 21:16:34

标签: java google-app-engine indexing mapreduce objectify

是否有人知道可以用来重新索引所有/某些命名空间中的所有/某些实体的库或良好的代码示例?

如果我自己实现这个,MapReduce是我应该考虑的吗?

“我需要重新索引吗?”感觉像许多开发人员遇到的问题,但我能找到的最接近的是this,这可能是一个好的开始?

其他选项是使用任务队列的homebrewn解决方案,它迭代数据存储区名称空间和实体,但我不希望重新发明轮子并寻找一个强大的,经过验证的解决方案。

有哪些选择?

1 个答案:

答案 0 :(得分:2)

我担心我不知道任何预先构建的系统。我认为你基本上需要创建一个游标来迭代你所有的实体,然后对它们进行get和put(或者在执行put之前检查它们是否在索引中 - 如果你有一些赢得了'需要更新,这将以读取和/或小操作为代价节省写入。

按照此处的示例: https://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Cursors

  1. 创建一个java.util.concurrent.SynchronousQueue来保存批量的数据存储区密钥。
  2. 使用ThreadManager创建10个新的使用者线程(当前限制): https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager 这些线程应该执行以下操作:
    1. 创建一个新的objectify实例并关闭会话缓存和memcache以进行客观化。
    2. 从SynchronousQueue获取一批密钥。
    3. 使用批量获取来获取所有这些实体。
    4. 可选择使用相关属性对所有这些实体执行仅限密钥查询。
    5. 将所有这些实体(或排除上面返回的实体)
    6. 从第2步开始重复。
  3. 在循环中,使用仅键游标查询获取接下来的30个键并将它们放入SynchronousQueue。
  4. 将所有项目放入SynchronousQueue后,设置一个属性,以便在完成所有工作后停止所有用户线程。