【Java高级工程师蜕变之路】066 分布式服务治理之服务协调
分布式服务治理
服务协调
分布式协调主要用来解决分布式环境中多个进程之间的同步,让他们有序的去访问临界资源,防止造成脏数据的后果。
分布式锁是分布式协调技术的核心内容。
分布式锁的实现方式
-
基于缓存(redis)实现分布式锁
-
获取锁的时候,使用
setnx
加锁,并使用expire
命令为锁添加一个超时时间,超过该时间自动释放锁,锁的value
值为一个随机生成的UUID,释放锁的时候进行判断。 -
获取锁的时候,还设置一个获取的超时时间,若超过这个时间放弃获取锁。
-
释放锁的时候,通过UUID判断是不是改锁,若是改锁,则执行
delete
进行锁释放。setnx:set一个key为value的字符串,返回1。若key存在,则什么都不做,返回0。
expire:为key设置一个超时时间,单位为second,超过这个时间锁自动释放,避免死锁。
delete:删除key
-
-
Zookeeper是一个为分布式应用提供一致性服务的开源组件,它的内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一的文件名,基于Zookeeper实现分布式锁的步骤如下:
- 创建一个目录mylock
- 线程A想获取锁就在目录mylock下创建临时顺序节点
- 获取mylock目录下的所有子节点,然后获取比自己小的兄弟节点,如果不存在说明当前顺序号最小,获得锁
- 线程B获取多有节点,然后判断自己是不是最小节点,设置监听比自己小的节点
- 线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小节点,如果是获得锁