V2EX 07月29日 02:20
[程序员] 分布式锁是否能实现锁住一个 key 范围
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

在处理员工每日作业数据上报时,遇到了并发更新覆盖的问题。由于作业数据上报存在乱序,并且需要精确控制时间范围的更新,原有的乐观锁机制在高并发下显得不足。文章旨在探讨如何将单行数据的并发控制从乐观锁优化为分布式锁,以实现类似数据库间隙锁的效果,即根据 user_id 和时间范围([start_time, end_time])进行锁定,从而有效避免数据竞争和覆盖更新,保证数据的一致性和准确性。

🔑 **当前痛点:** 现有系统采用乐观锁(version控制)处理作业数据上报的并发更新,但随着并发量的增加,这种方式在高并发场景下容易出现数据覆盖问题,无法保证时间范围更新的准确性,特别是当多个作业任务的上报时间存在乱序时。

💡 **优化目标:** 将并发控制机制从乐观锁升级为分布式锁,以实现更精细化的粒度控制。目标是能够基于“用户ID + 作业时间范围([start_time, end_time])”进行锁定,类似于数据库的间隙锁,确保在特定用户、特定时间段内,数据更新不会发生并发冲突。

🚀 **技术选型思考:** 文章提出需要引入分布式锁来解决单行数据并发竞争问题。这暗示了需要考虑分布式锁的实现方式,例如基于Redis、ZooKeeper或其他分布式协调服务,并需要设计锁的获取、释放以及续期等机制。

🎯 **期望的锁定粒度:** 期望实现的锁定粒度是“user_id + [start_time, end_time]”。这意味着当一个用户的某一段时间内的作业数据正在被处理或更新时,其他对同一时间段的更新操作将被阻塞,直到锁被释放,从而有效防止数据覆盖。

最近项目中需要对锁的粒度进行优化,使用分布式锁的场景是:一个员工每天会进行作业,每次作业都会上报一条作业数据,其中有个 biz_time 字段表示作业实际发生的时间(系统会合并统计它多个作业任务的开始时间和结束时间,即最后数据表中会记录这个人当天的第一个任务的开始时间为 start_time ,最后一个任务的结束时间为 end_time ),但是上报作业数据是会发生乱序的,每次更新时间范围的左右区间不能发生并发覆盖更新。当然系统需求会更加复杂,例如他的不同作业类型切换,需要终止当天的作业时长统计,并开启一段新作业的统计等等,先不用考虑。

现在是用乐观锁通过 version 控制的,由于并发量比较大,希望改造成分布式锁来实现单行数据的并发数据竞争。预期能实现成[user_id + [start_time, end_time]]粒度,也就是某个人的作业时间在某个时间范围被锁住(类似数据库的间隙锁,锁定一个范围)。但是没有思路怎么实现,在此请教一下各位大佬!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

分布式锁 并发控制 数据上报 乐观锁 优化
相关文章