【问题标题】:Task Queues, Idempotence, and Objectify Transactions任务队列、幂等性和对象化事务
【发布时间】:2014-08-17 21:33:53
【问题描述】:

documentation for GAE's Task Queue API 声明:

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

但是,documentation for datastore transactions 两次声明我们应该尽可能使它们具有幂等性,并且提交到任务队列不是幂等的。 documentation for objectify 更进一步,在其事务中解释了work MUST be idempotent

那么,有没有一种标准的方法来处理这些建议/要求的组合,或者我应该采用自己的技术(也许使用类似this)?

【问题讨论】:

  • 我不确定你在哪里找到了矛盾。如果您在事务中,则以事务方式添加任务,因此如果事务失败,则任务不会入队。
  • @DanielRoseman 推荐/要求事务是幂等的原因是针对这样的情况:事务抛出DatastoreFailureException,但无论如何都会成功,因此任务已入队。 Objectify 重试事务,并再次成功。现在您的任务已经入队两次,因为入队任务不是幂等的。

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


【解决方案1】:

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

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

【讨论】:

  • Ohhh - 似乎任务队列文档的部分内容不符合我的要求。谢谢你指出!所以,答案是无论如何我都必须让任务本身是幂等的,所以两次入队是没有问题的!非常感谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2023-03-26
    • 2019-07-25
    相关资源
    最近更新 更多