App Engine管道 - 我应该使用return_task = True更可靠吗?

时间:2014-09-26 13:13:22

标签: google-app-engine appengine-pipeline

今天在浏览源代码时,我在Pipeline.start方法中注意到了这条评论:

Returns:
  A taskqueue.Task instance if return_task was True. This task will *not*
  have a name, thus to ensure reliable execution of your pipeline you
  should add() this task as part of a separate Datastore transaction.

有趣的是,我 希望可靠执行我的管道。

我怀疑评论有点不准确,因为如果您使用默认的return_task=False选项,则无论如何都会在事务中添加任务(_PipelineContext.start)...这似乎是您的原因&# 39; d想要自己添加任务,只有当你希望管道的启动依赖于你自己的事务中某些事情的成功时。

任何人都可以证实我的怀疑,或建议在评论的建议之后如何影响和可靠地执行您的管道' ?

1 个答案:

答案 0 :(得分:0)

如果您在调用Pipeline.start()包含该参数,则该任务将在由Pipeline的内部变量上下文(类型{ {1}})。此队列的默认名称为_PipelineContext

如果您在调用"default"执行包含该参数,则该任务不会在这些方法中排队。 Pipeline.start()将返回Pipeline.start(),我们发现它依赖于内部方法_PipelineContext.start()。此方法是带注释的事务性的,因为它首先为用于运行此管道的数据存储区记录执行一些簿记。然后,在完成此簿记之后,它会创建一个没有txn()属性的任务(请参阅the Task class definition here)。

如果未提供 name ,则会继续将该(未命名)任务添加到此管道上下文的默认队列中。它还为该任务设置return_task,以便它将成为一个"事务性任务"只有在成功提交封闭数据存储区事务时才会添加(即,transactional方法中的所有簿记都成功,以便此任务在运行时将与管道的其他部分正确交互等)

另一方面,如果 txn() 未定义 ,则会返回未添加到队列中的未命名任务。尽管如此,仍会进行return_task簿记工作以使其准备好运行。 txn()返回_PipelineContext.start(),用户代码将获取未命名的未添加任务。

如果您希望管道执行成为代码中事务的一部分,那么您想要使用此模式的原因绝对正确。也许您希望接收和存储一些数据,启动管道,并将管道ID存储在数据存储区中某个用户的配置文件中。当然,这意味着您不仅需要将数据存储区事件,还需要将管道执行事件组合到此原子事务中。这种模式可以让你做这样的事情。如果事务失败,则事务任务将不会执行,Pipeline.start()将能够捕获TransactionFailedError并运行pipeline.abort()以确保数据存储区的簿记数据已被销毁。从未跑过的任务。

管道未命名的事实不会导致任何中断,因为如果名称未定义,并且事实上not having a name is actually a requirement for tasks which are added with transactional=True,则在添加到队列时,未命名的任务会自动生成唯一名称。

总而言之,我认为评论只是意味着由于返回的任务是事务性的,为了使其可靠地执行,您应该确保handle_run_exception()发生在交易。它不是说返回的任务是某种方式"不可靠"仅仅因为你设置了task.add (queue_name...),它基本上使用的是"可靠的"多余的,因为任务是在事务中运行的。

相关问题