我想在django中实现一个幂等postapi来处理并发请求(比如retry)。我试着用下面的算法来计算:
客户端为每个事件生成一个唯一的id(如uuid)
客户端向api发送一个具有生成的id的事件
当api接收到事件时:
如果未注册事件,api将插入事件并更新相关统计信息(例如,增加用户表中的“事件数”列),然后将其发送回客户端
如果事件已经注册,只需将统计信息(由另一个并发请求计算)发送回客户端
下面的django程序是否如我所期望的那样有效?
def register_event(req: Request):
user_id: int = req.user_id
event_id: UUID = req.event_id
with transaction.atomic():
event, created = (
Event
.objects
.select_for_update() # row-level locking in transaction
.get_or_create(user_id=user_id, event_id=event_id, defaults={...})
)
if created:
# Update the related table based on the event
# Increment the number of events
User.objects.filter(id=user_id).update(num_events=F('num_events') + 1)
...
num_events = User.objects.get(id=user_id).num_events
return num_events
暂无答案!
目前还没有任何答案,快来回答吧!