【问题标题】:HRD transaction that involves an RPC or How do Transactions work on GAE?涉及 RPC 的 HRD 事务或事务如何在 GAE 上工作?
【发布时间】:2012-08-01 17:58:43
【问题描述】:

这将是一个组合问题,主要是因为我想了解更多背景信息。

主要问题:

我正在尝试执行涉及对另一个 REST 服务的 RPC 调用的事务,这将更新一些远程数据。例如,假设 RPC 调用告诉远程服务器我购买了一些东西。在非功能性 python 伪代码中,它会是这样的:

def txn_purchase():
    a = ModelA.objects.get(blah)
    httpresult = HttpPurchaseRPC(url, a.foo)
    a.receipt = httpresult.get_receipt() # This raises an error if the request fails
    a.save()

db.run_in_transaction(txn_purchase)

我很确定事务只确保数据存储的一致性(因此在这种情况下,实体 a 将是一致的),而不能确保与 RPC 的一致性。是否有可能在此基础上构建一些东西来确保与 RPC 的一致性?

在我看来,如果 RPC 成功,但数据存储事务无法保存,我可能会遇到问题。我该如何解决这个问题?

我脑海中的朦胧概念是实现2阶段购买:

  1. 执行预购买阶段,我在交易中创建实体 A 并设置预购买标志。
  2. 执行购买阶段,我运行购买交易并在成功时更新 A。清除预购标志。
  3. 有一个“修复”cron 作业运行并扫描带有预购买标志的陈旧实体,并使用另一个 RPC 来检查这些购买是否实际完成。

这是做到这一点的“最佳实践”方式,还是有更好的方法?

关于交易的背景问题:

  • 事务函数是否与其余代码一起在前端运行,还是以某种方式神奇地在数据存储后端运行?
  • 如果正在运行事务的前端在事务中间死机(即超时),是否会在任何地方重试事务?或者交易根本没有发生?

谢谢!

【问题讨论】:

  • 除非他们提供回滚更改的操作,否则无法在您的事务中涉及外部远程服务 - 否则数据库回滚如何知道联系他们的 API?
  • @mattb 什么情况下会发生回滚?我认为使用 cron 作业处理前滚案例就足够了。

标签: python google-app-engine transactions


【解决方案1】:

您在这里有一个正确的想法:您应该这样做的方式是将 RPC 外包给一个单独的 deferred task。在事务中排队的任务可以设置flag,以确保它们只有在事务成功时才被排队。

没有运行事务的神奇后端。而且它们不会自动重试:同样,除非它们是任务的一部分,因为任务会重试,直到它们成功返回。

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多