• 微服务学习----分布式锁


    分布式锁

    需要加锁条件

    1. 共享资源
    2. 共享互斥锁
    3. 多任务环境

    基于MySQL 的分布式锁

    流程

    MySQL中的字段

    1. 每个程序去抢MySQL中的一个字段
      1. 查询这个字段是否已经存在
      2. 插入一个数据到这个字段
      3. 还原这个字段让其他的程序获取锁
    2. 操作资源
    3. 释放资源

    问题

    • 资源浪费
      • 当有程序使用到这把锁的时候,其他程序在等待,且其他程序需要每隔一段时间去查看这把锁是否释放
    • 死锁问题
      • 在一个程序获取到这把锁且在操作中的时候这个程序奔溃了,那么MySQL中的这个字段将永远无法被还原
    解决死锁方案

    用一个外部进程监视这个锁,当超时的时候则将这把锁给释放(将字段还原)。这个超时时间很难去把握,实际生产中一般不适用MySQL做分布式锁。

    基于redis 的分布式锁

    流程

    1. 每个程序去抢redis中的一个字段并设置有效期
      1. 查询这个字段是否已经存在
      2. 插入一个数据到这个字段
      3. 还原这个字段让其他的程序获取锁
    2. 操作资源
    3. 释放资源

    问题

    redis 是通过设置有效期来解决MySQL中的死锁问题,可问题就在于这个有效期很难把握。

    基于zookeeper的分布式锁

    zookeeper 是一个分布式一致性服务框架

    • 客户端在操作一个zookeeper节点,其他的zookeeper都会被同步

    • zookeeper 可以存储数据,文件系统,zookeeper的目录是可以存储数据的

    • zookeeper的目录类型分为四种

    1. 持久化目录 (客户端操作zookeeper会将目录持久化)
    2. 临时目录 (客户端与zookeeper断开连接目录自动删除)
    3. 持久有顺序目录
    4. 临时有顺序目录
    • zookeeper支持事件回调机制

    流程

    1. 程序去zookeeper获取一个临时序号(去/locks/ 下面获取一个需要)
    2. 序号最小的去访问资源
    3. 之后其他的序号需要找到比他序号小1的目录注册一个删除回调事件
    4. 回调事件通知访问资源

    好处

    1. 节省了资源

    2. 通过有序临时节点和事件通知机制巧妙的解决了死锁问题

  • 相关阅读:
    自动对一个文件夹下的N个word文件批量执行一个宏
    PHP正则匹配联系方式手机号、QQ、微信、邮箱、固定电话
    私信基本功能数据库设计
    ArcGIS三分式标注、四分式标注和同时上下标实现
    Word2019文档中将页面边框更改为文本边框的方法
    Arcgis彻底删除和卸载
    ArcMap中各种基本概念的介绍
    ArcGIS Python工具箱.pyt裁剪工具
    C# Object对象的ToString方法在转换日期时丢失毫秒
    2020年糖尿病领域中国学者学术影响力排名
  • 原文地址:https://www.cnblogs.com/bananafish/p/13413443.html
Copyright © 2020-2023  润新知