业务分析
关键问题
问题 | 方案 |
---|---|
如果业务挂掉未能释放锁 | 给锁加上过期时间 |
如何为特定的资源生成锁,如何保证锁的唯一性 | 使用 uuid 作为键值,全局共享一个 uuid 生成器(或一个集群) |
如果业务未能结束就释放了锁 | 看门狗机制 |
单个 redis 示例挂掉了 | 进行集群化部署,基于红锁算法去取锁,这个在业务上实现 |
如何保证操作的原子性 | 手动制作回溯,以防对非原子操作的部分成功。 |
对于部分需要时间判断才能成功的条件? | 使用自旋锁 |
对于部分需要同时读的锁 | 使用可重入锁 |
锁的粒度问题 | 细份粒度为:读锁,写锁,读写锁 |
大数据竞争读写锁 | 锁分段,这个在业务上实现,不在包中取做。 |
次要问题
问题 | 方案 |
---|---|
减少对分布式锁的冲突访问 | 本地也用 mutex 做一次锁,这个在业务上取实现,不直接包含到本代码中 |
失败返回数据应该放什么 | 返回当前任务的uuid |
如何手工排障碍 | 写一个 强制释放的函数 |
如果我本地有特殊需求需要再锁定一段时间这个分布式锁 | 手动续期函数 |
看门狗机制
功能:预防业务工作的过程中锁到期释放
原理:在业务执行过程中开一个协程,用于不断延迟锁的过期时间
流程:
- 加锁成功,启动看门狗
- 看门狗线程不断延长锁的过程时间
- 解锁,关闭看门狗
代码
https://github.com/zouxingyuks/GoLockRedis