涉及RPC的HRD事务或事务如何在GAE上工作?

2024-06-01 06:08:33 发布

您现在位置:Python中文网/ 问答频道 /正文

这将是一个组合问题位,主要是因为我想得到一些更多的背景资料。你知道吗

主要问题是:

我正在尝试执行一个事务,该事务涉及对另一个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. 执行预购买阶段,在该阶段中,我在事务中创建实体并设置预购买标志。你知道吗
  2. 执行一个购买阶段,在该阶段我运行购买事务,如果成功,则更新。清除prepurchase标志。你知道吗
  3. 有一个“fix it”cron作业,它运行并扫描带有pre-purchase标志的过时实体,并使用另一个RPC检查这些购买是否已经完成。你知道吗

这是“最佳实践”方法吗,还是有更好的方法?你知道吗

交易背景问题:

  • 事务函数是在前端与其余代码一起运行,还是在数据存储后端神奇地运行?你知道吗
  • 如果事务运行的前端在事务处理过程中死亡(即超时),是否会在任何地方重试该事务?或者交易根本就没有发生?你知道吗

谢谢!你知道吗


Tags: 数据函数代码实体get远程标志rpc
1条回答
网友
1楼 · 发布于 2024-06-01 06:08:33

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

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

相关问题 更多 >