2014-04-25 61 views
1

我必须在AppEngine上的多租户环境中实施重复执行的任务。真正的用例是“实施循环发票”。管理多租户应用程序中的任务队列 - GAE

我在怀疑3种方法,从集中管理到每个命名空间分散到每个计划任务的分散。寻求反馈。

  • 集中管理:有一个“主要任务队列”或cron作业定期检查其命名空间作业必须被执行,然后踢他们。每个名称空间查找要完成的任务。

  • 每个命名空间分散:有定期检查它属于需要做什么样的命名空间的任务或每个命名空间cron作业。

  • 每个任务分散处理:当在命名空间中创建新作业时,立即为该任务在将来期望的点处安排任务队列。没有“管理”任务队列。

我冒充自己的问题在每一种方法:

  • 集中管理:魂斗罗 - >不结垢,它需要迭代在所有 '客户' 的命名空间。 PRO - >更易于管理/控制正在发生的事情。

  • 分散给每个名字空间:两全其美?

  • 分散每个任务:专业 - >规模好,没有管理开销; CONTRA - >什么时候版本升级,如果有一个错误和安排没有正常工作,你必须纠正......听起来像一场噩梦。如果安排失败会怎样?我可以拥有100%的玩家吗?一年后计划完成的任务能够完成吗?

有没有人有很好的建议/经验?

回答

0

您可能从现在起一年内没有该客户,或者条款可能会发生变化等,更不用说所有的技术挑战了。未来的方案计划将不起作用。

我没有看到其他两种方法之间的区别,除非你有数以百万计的名字空间。

我不知道你如何存储你的数据。您是否考虑创建一个单独的表/实体进行开票,而与名称空间无关?您在那里插入一条记录,与您的“未来”方法类似,并创建一个cron作业,以每天/每周/每月检查一次该表。如果您删除客户或更新条款,那么您也可以在此时更新此表。

+0

thx ...我认为第三种方法也不好。 – koma

+0

小后续问题:我不能通过名称空间进行事务处理,对吗?因此,在全局名称空间中标记记录并保存记录记录不能在事务中完成! – koma

+1

看看这段代码:https://developers.google。com/appengine/docs/java/multitenancy/multitenancy#Java_Using_namespaces_with_the_Datastore可以使用类似的方法:更新所选命名空间中的实体,并创建一个任务来更新全局名称空间。如果此过程失败,请向管理员发送消息。它可能永远不会发生,但以防万一。 –