涉及RPC的HRD交易或交易如何在GAE上工作?

时间:2012-08-03 16:44:37

标签: python google-app-engine transactions

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

主要问题:

我正在尝试执行涉及对另一个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成功,我会遇到潜在的问题,但数据存储区事务无法保存。我该如何解决这个问题?

我心目中的朦胧概念是实施两阶段购买:

  1. 进行预购阶段,我在交易中创建实体A并设置预购标志。
  2. 执行购买交易的购买阶段,如果成功则更新A.清除预购标志。
  3. 拥有一个“fix-it”cron作业,该作业运行并使用预购标志扫描陈旧实体,并使用另一个RPC检查这些购买是否实际已经完成。
  4. 这是“最佳实践”方式吗,还是有更好的东西?

    关于交易的背景问题:

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

    谢谢!

1 个答案:

答案 0 :(得分:1)

你在这里有正确的想法:你应该这样做的方法是将RPC分配到单独的deferred task。在事务中排队的任务可以设置flag,以确保在事务成功时它们才会入队。

没有神奇的后端运行交易。并且它们不会自动重试:除非它们是任务的一部分,否则任务 重试,直到它们成功返回。