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

锁的概述

分布式锁

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

为什么要用锁

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

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

分布式锁方案比较

image

模板方法模式

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

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

基于Zookpper分布式锁

Zookeeper 数据结构

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

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

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

zookeeper 节点类型

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

watcher机制图示

image

watcher(观察者模式)

image

观察者模式要素:

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

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

image

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

你可能感兴趣的:(蚂蚁金服十年架构师教你怎么从零开始学习分布式锁)