本质
个人理解:在应用多机器集群部署环境下,针对特定业务场景为保证数据正确性,强制相关业务逻辑在集群范围内串行运行
典型业务场景
1. 全局参数设置
2. 特定业务消息消费
实现方式
分布式锁实现关键点:1、引入第三方介质构建锁对象 2、集群范围内同一时间只有唯一运行单元持有锁 3、防止死锁 4、特性扩充(阻塞、可重入) 5、执行性能。目前主要实现方式:数据库、高速缓存、zookeeper。
数据库:
锁对象—— 构建锁信息表存储锁对象,对象信息可以为:方法名、获取时间、过期时间、自定义信息等
锁持有唯一性保证——数据库唯一键约束保证,根据业务场景设定唯一键(如:方法名)
防止死锁——定时任务轮询,通过判断过期时间主动删除锁对象信息
特性扩充——阻塞(自旋轮询)、可重入(调整唯一键信息)
执行性能——较差
zookeeper:
锁对象—— 特定有序节点,最小序列节点构建方持有锁
锁持有唯一性保证—— 节点文件名唯一性、顺序节点、数据一致性
防止死锁—— 临时顺序节点,客户端异常断开自动清除
特性扩充—— 阻塞(通过Watcher 机制,监听比自己序列小节点)、重入(不支持?)
执行性能—— 文件机制限制性能一般
高速缓存(redis):
锁对象—— K-V结构缓存锁对象, key:自定义资源名称(可以为方法名) value:唯一标识随机数(可以为时间+IP),用于判定持有者
锁持有唯一性保证—— 多个redis master节点(不需要复制数据),客户端在这些节点上请求锁,若N/2+1节点设置成功则获取锁成功
特性扩充—— 阻塞(随机延时轮询重试)、可重入(Lua判定 value信息)
执行性能—— 应该是最高的
参考链接
https://www.cnblogs.com/siodoon/articles/5321987.html
http://ifeve.com/redis-lock/
网友评论