蚂蚁金服十年架构师教你怎么从零开始学习分布式锁

锁的概述

分布式锁

分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。 举个不太恰当的例子:假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人,分布式锁就是保证这个房子只有一个门并且一次只有一个人可以进,而且门只有一把钥匙。然后许多人要去看书,可以,排队,第一个人拿着钥匙把门打开进屋看书并且把门锁上,然后第二个人没有钥匙,那就等着,等第一个出来,然后你在拿着钥匙进去,然后就是以此类推

为什么要用锁

  1. 多任务环境中才需要
  2. 任务都需要对同一共享资源进行写操作;
  3. 对资源的访问是互斥的

为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。

分布式锁方案比较

模板方法模式

在父类中编排主流程,将步骤实现延迟到子类去实现。

  1. 定义锁的接口Lock
  2. 在AbstractLock模板锁里面实现getLock方法,实现通用的逻辑。
  3. 不能确实的步骤,作为虚拟方法,甩锅给子类实现。
  4. 子类只需要聚焦自己的小步骤逻辑,实现tryLock,waitLock,unLock方法

基于Zookpper分布式锁

Zookeeper 数据结构

  • ZooKeeper数据结构类似Linux
  • 每一个节点都有值

zookeeper在底层其实只提供了两个功能

  1. 管理(存储,读取)用户程序提交的数据;
  2. 并为用户程序提供数据节点监听服务

zookeeper 节点类型

  • **PERSISTENT-持久化目录节点 **客户端与zookeeper断开连接后,该节点依旧存在
  • PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点 客户端与zookeeper断开连接后,该节点依旧存在,只是 Zookeeper给该节点名称 进行顺序编号
  • EPHEMERAL-临时目录节点 客户端与zookeeper断开连接后,该节点被删除
  • **EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点 **客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

watcher机制图示

watcher(观察者模式)

观察者模式要素:

  • 目标 — 店铺老板(事件源 )
  • 观察者 — 客户(事件消费者 )
  • 事件 — 电话响了

zookeeper 基于同名节点的分布式锁

本文到此结束!喜欢的朋友帮忙点点赞和关注!感谢!

转载于:https://juejin.im/post/5ce6a676e51d4555fc1acc0c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值