Google app engine 任务队列、幂等性和对象化事务

Google app engine 任务队列、幂等性和对象化事务,google-app-engine,transactions,google-cloud-datastore,objectify,Google App Engine,Transactions,Google Cloud Datastore,Objectify,各国: 您可以将任务作为数据存储事务的一部分排队,这样,如果事务成功提交,该任务仅排队并保证排队 然而,两次声明我们应该尽可能使它们幂等,并且提交到任务队列不是幂等的。更进一步,解释了工作在其事务中必须是幂等的 那么,是否有一种标准的方法来处理这些建议/需求的组合,或者我应该使用我自己的技术(可能使用类似的方法)?还有一个问题,即任务可以执行两次(或更多)-队列提供“至少一次”语义,而不是“完全一次”语义。这是常见的 有些操作很容易使幂等(例如,“设置生日”)。有些操作可能很难使幂等(例如,“将

各国:

您可以将任务作为数据存储事务的一部分排队,这样,如果事务成功提交,该任务仅排队并保证排队

然而,两次声明我们应该尽可能使它们幂等,并且提交到任务队列不是幂等的。更进一步,解释了
工作在其事务中必须是幂等的


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

还有一个问题,即任务可以执行两次(或更多)-队列提供“至少一次”语义,而不是“完全一次”语义。这是常见的


有些操作很容易使幂等(例如,“设置生日”)。有些操作可能很难使幂等(例如,“将$5从帐户A转移到帐户B”)。对于困难的事务,通常技巧包括在事务序列的开始之外创建一个事务id,并确保该id遵循整个链,甚至贯穿整个任务。如果任何操作都重试并看到事务id已完成,则可以返回。

如果任务已排队,则其关联事务中的任何操作也已提交。是的,从技术上讲,一个事务可以被提交,但仍然可以得到 错误响应(例如,接受成功响应超时),尽管这并不常见。在任何情况下,您的任务也应该是幂等的(它可以使用提交的数据)
在它自己的事务中,以帮助)因为任务可以执行多次,即使您提交了一次。看。

我不确定你在哪里发现了矛盾。如果您在事务中,则会以事务方式添加任务,这样,如果事务失败,任务就不会排队。@DanielRoseman建议/要求事务为幂等的原因适用于以下情况:事务抛出
DatastoreFailureException
,但无论如何都会成功,因此,任务已排队。Objectify重试事务,并再次成功。现在您的任务已经排队两次了,因为让任务排队不是幂等的。Ohhh-看来任务队列文档的一部分不符合我的要求。谢谢你指出这一点!所以,答案是我必须使任务本身是幂等的,所以让一个任务排队两次是没有问题的!多谢各位。