任务队列,幂等和物化交易

时间:2014-06-26 21:28:02

标签: google-app-engine transactions google-cloud-datastore objectify

documentation for GAE's Task Queue API州:

  

您可以将任务排队作为数据存储区事务的一部分,这样只有在事务成功提交的情况下,该任务才会入队并保证排队。

然而,documentation for datastore transactions状态两倍,我们应该尽可能使它们成为幂等的,并且提交到任务队列并不是幂等的。 documentation for objectify更进一步,在其交易中解释work MUST be idempotent

那么,是否有一种标准方法来处理这些建议/要求的组合,或者我应该采用自己的技术(可能使用this之类的东西)?

2 个答案:

答案 0 :(得分:2)

还有一个问题是任务可以执行两次(或更多次) - 队列提供"至少一次"语义不是"恰好一次"语义。这很常见。

某些操作很容易使幂等(例如,"设置生日和#34;)。某些操作可能很难使幂等(例如,"从账户A转移5美元到账户B")。对于困难的,通常技巧涉及在事务序列的开始之外创建事务id,并确保id跟随整个链,即使通过任务。如果有任何重试并且看到事务ID已经完成,您可以返回。

答案 1 :(得分:1)

如果任务已排队,则其关联事务中的任何其他事件也已提交。是的,从技术上讲,交易可能会被提交并且仍然可以获得 错误响应(例如,接受成功响应的超时)虽然这并不常见。在任何情况下,您的任务也应该是幂等的(它可以使用提交的数据) 在它自己的事务中帮助那个)因为即使你提交了一次任务也可以执行多次。见Why Google App Engine Tasks can spuriously be executed more than once?