0

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

主要问题:

我正在尝试执行涉及对另一个 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 来检查这些购买是否实际完成。

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

关于交易的背景问题:

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

谢谢!

4

1 回答 1

1

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

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

于 2012-08-03T17:01:44.273 回答