1

我正在尝试构建的工作流程是这样的,将许多相关任务排入队列以并行运行(至少数千个)一旦所有相关作业完成,就会执行最终作业

我不知道如何执行那个单一的最终确定工作。我希望在所有相关任务完成后尽快执行此任务。但是,我唯一能想到的就是使用单线程轮询作业来检查所有任务是否已完成,并将完成任务排入队列。

我查看了管道文档https://code.google.com/p/appengine-pipeline/并查看了http://www.google.com/events/io/2010/sessions/high-throughput -data-pipelines-appengine.html起初看起来很有希望,但无法从中找到好的解决方案。

在考虑了更多管道库之后,我想我看到了一种模式,可以用来将等待的作业扩展到我想要的高数量。

有一个批处理入队作业,此作业一次将一批任务入队,然后启动另一个批处理入队作业,该作业等待入队的批处理完成。最后,如果没有更多批次要执行,则运行聚合器作业。

这是用于大量等待工作的模式吗?

4

2 回答 2

0

等待每个批次完成会使您的过程更加连续 - 以这种方式运行将需要更长的时间。

如果大量可变参数是一个问题,作为一种解决方法,您可以有一个对应于每个扇出的扇入任务,假设扇出一次不会分支超过 10 个任务。

于 2013-08-28T19:59:58.107 回答
0

我从来没有发布过这个描述,因为我还没有实现它,但下面是关于如何在不依赖第三方的系统(如 GAE)上完成大量所需任务后如何执行单个任务的高级描述框架。

扇出

  1. fanoutCount = # 扇出任务
  2. 创建并提交表条目 fanoutCount = #, completeCount=0, 字节数组,位数 = 到 fanoutCount
    • 由于最大表大小为 1Mb,这将支持数百万个作业。仍然可能是最安全的上限
  3. 迭代任务,使用实体键和任务索引(递增计数)将它们排入队列
    • 您可能希望实施一种策略来恢复部分完成的扇出任务。任务必须是幂等的,所以如果每次都识别到相同的工作就可以重新开始

任务消费者

  1. 执行所需的任何业务逻辑,我假设实体键是一个足够的标识符
  2. 使用 Job 条目记录 ID 和任务索引将条目排回队列中的风扇
  3. 注意:任务幂等性。不能保证一个任务不会多次执行。既可以
    • a) 在事务中执行业务逻辑和最终队列消息,检查内部业务逻辑是否尚未执行
    • b) 使单个业务逻辑步骤具有幂等性(扇入将忽略重复消息)

扇入

  1. 消耗队列中的风扇
  2. 交易中
    • Get the table entry (candidate for simple caching),
    • Set the bit of the array corresponding to the task index to 1 (if it was already 1 we are double processing, just continue)
    • Increment the completeCount,
    • if completeCount == fanoutCount enqueu your finalization job
    • Commit transaction
  3. Note: Concurrency. The entry can only take soo many transactions soo fast. The logic itself is simple though. Consider processing batch messages, with low (or no) concurrency. Especially if you only have 1 fan out executing at a time
于 2014-12-12T19:39:27.563 回答