我爱编程

分布式锁-记录

2018-06-21  本文已影响0人  板栗南瓜

本质

个人理解:在应用多机器集群部署环境下,针对特定业务场景为保证数据正确性,强制相关业务逻辑在集群范围内串行运行

典型业务场景

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/

上一篇 下一篇

猜你喜欢

热点阅读