这将是一个组合问题,主要是因为我想获得更多背景信息。
主要问题:
我正在尝试执行涉及对另一个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成功,我会遇到潜在的问题,但数据存储区事务无法保存。我该如何解决这个问题?
我心目中的朦胧概念是实施两阶段购买:
这是“最佳实践”方式吗,还是有更好的东西?
关于交易的背景问题:
谢谢!
答案 0 :(得分:1)
你在这里有正确的想法:你应该这样做的方法是将RPC分配到单独的deferred task。在事务中排队的任务可以设置flag,以确保在事务成功时它们才会入队。
没有神奇的后端运行交易。并且它们不会自动重试:除非它们是任务的一部分,否则任务 重试,直到它们成功返回。