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

 

本文探讨了在项目中优化锁粒度的需求,特别是在处理员工每日作业数据上报时,由于数据上报可能乱序,需要避免并发更新对时间范围(biz_time)的覆盖。当前系统使用乐观锁(version控制),但面临并发量大的挑战,因此希望改用分布式锁来解决单行数据的并发数据竞争问题。目标是实现以[user_id + [start_time, end_time]]为粒度的锁,类似于数据库的间隙锁,锁定特定用户在特定时间范围内的作业记录,以防止并发更新导致的数据错误。

🔑 **问题背景与痛点**:项目需要优化锁的粒度,以解决员工每日作业数据上报时的并发更新问题。核心痛点在于,作业数据上报可能发生乱序,导致更新时间范围(biz_time)的左右区间被并发覆盖,引发数据错误。现有乐观锁机制在高并发下难以满足需求。

🔒 **解决方案设想**:提出将乐观锁改造为分布式锁,以实现对单行数据的更精细化并发控制。期望的锁粒度为[user_id + [start_time, end_time]],即锁定特定用户在特定时间段内的作业数据,类似于数据库的间隙锁,从而有效避免并发覆盖问题。

💡 **技术挑战与请教**:在实现上述[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

相关标签

分布式锁 并发控制 锁粒度 作业数据 乐观锁
相关文章