1 回答
TA贡献1876条经验 获得超5个赞
在分布式系统中有很多方法可以做到这一点(分布式锁定),目前我可以想出一些方法:
使用
redis
(或任何其他类似服务)锁。然后您可以user_id
在收到第一个请求时锁定每个请求并拒绝其他请求,user_id
因为您无法锁定它。Redis的锁一般都有过期时间所以不会死锁。参考:https ://redis.io/docs/reference/patterns/distributed-locks/使用数据库锁。你应该小心使用数据库锁,但一个简单的方法是使用唯一索引:上传前创建一个
uploading
带有约束的记录,unique(user_id)
上传后删除它。有可能忘记/未能删除记录并导致死锁,因此您可能希望向expired_at
记录添加另一个字段,在上传前检查并删除它。(特定于问题的场景)使用唯一约束
(user_id, upload_status)
。这称为部分索引,您只会在 时检查此唯一索引upload_stats = 'uploading'
。然后您可以为每个请求创建一条uploading
记录,并拒绝另一个请求。过期也需要,所以你需要跟踪start_time
上传和清理长时间上传记录。如果您不需要重新申请磁盘空间,您可以简单地将记录标记为failed
,这样您还可以跟踪这些上传在数据库中失败的时间和方式。
警告:
看来您正在使用 Kubernetes,因此应谨慎使用任何非分布式锁,具体取决于您想要获得的一致性级别。Pod 是易变的,很难依赖本地信息并实现一致性,因为它们可能被复制/杀死/重新安排到另一台机器。这也适用于具有自动缩放或调度机制的任何其他平台。
一个用户拥有的多个客户端与服务器之间的同步过程至少需要处理请求排序、请求去重和最终一致性问题(例如,Google Doc 可以支持多人同时编辑)。有一些通用算法(如操作转换),但这取决于您的具体用例。
- 1 回答
- 0 关注
- 79 浏览
添加回答
举报