这将是一个组合问题,主要是因为我想获得更多背景信息。
主要问题:
我正在尝试执行涉及对另一个 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阶段购买:
- 做一个预购买阶段,我在交易中创建实体 A 并设置一个预购买标志。
- 执行购买阶段,我运行购买交易并在成功时更新 A。清除预购标志。
- 有一个“修复它”的 cron 作业,运行并扫描带有预购买标志的陈旧实体,并使用另一个 RPC 来检查这些购买是否实际完成。
这是做到这一点的“最佳实践”方式,还是有更好的方法?
关于交易的背景问题:
- 事务功能是否与其余代码一起在前端运行,还是以某种方式神奇地在数据存储后端运行?
- 如果正在运行事务的前端在事务中间死机(即超时),事务会在任何地方重试吗?或者交易根本没有发生?
谢谢!