gpt4 book ai didi

django、多数据库(写入器、读取复制)和同步问题

转载 作者:行者123 更新时间:2023-12-03 21:42:50 25 4
gpt4 key购买 nike

所以...为了响应 API 调用,我这样做:

i = CertainObject(paramA=1, paramB=2)
i.save()
现在我的作家数据库有一个新记录。
处理可能需要一点时间,我不希望推迟对 API 调用者的响应,因此下一行我将使用 Celery 将对象 ID 传输到异步作业:
run_async_job.delay(i.id)
立即或几秒钟后取决于队列 run_async_job尝试从提供该 ID 的数据库加载记录。这是一场赌博。有时它有效,有时不取决于只读副本是否更新。
是否有模式可以保证成功并且不必在阅读或希望好运之前“ sleep ”几秒钟?
谢谢。

最佳答案

最简单的方法似乎是使用 Greg 和 Elrond 在他们的答案中提到的重试。如果您使用的是 shared_task 或 @app.task 装饰器,则可以使用以下代码片段。

@shared_task(bind=True)
def your_task(self, certain_object_id):
try:
certain_obj = CertainObject.objects.get(id=certain_object_id)
# Do your stuff
except CertainObject.DoesNotExist as e:
self.retry(exc=e, countdown=2 ** self.request.retries, max_retries=20)
我在每次重试之间使用了指数倒计时。您可以根据需要对其进行修改。
您可以找到自定义重试延迟的文档 here .
还有另一个文档解释了这个 link 中的指数退避。
当您调用重试时,它将使用相同的任务 ID 发送一条新消息,并确保将消息传递到与原始任务相同的队列。您可以在文档 here 中阅读更多相关信息。

关于django、多数据库(写入器、读取复制)和同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66467136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com