zoukankan      html  css  js  c++  java
  • Zookeeper概念学习系列之zookeeper实现分布式共享锁

      首先假设有两个线程, 两个线程要同时到mysql中更新一条数据, 对数据库中的数据进行累加更新。由于在分布式环境下, 这两个线程可能存在于不同的机器上的不同jvm进程中, 所以这两个线程的关系就是垮主机跨进程, 使用java中的synchronized锁是搞不定的。



      主要利用了zookeeper的临时有序节点的特性和watcher监视器
      我们认为最小的节点具备执行权, 也就是获取到了锁。

      临时节点有一个特点: 当创建临时节点的程序停掉之后, 这个临时节点就会消失。
      监视器的特点: 可以给 zk 中的节点注册监视器, 监视这个节点的子节点的变化情况监视器注册一次, 只能使用一次。 多次使用需要多次注册 。


    大致思路如下:
      1: 当这两个线程去mysql更新数据之前, 先到zookeeper/locks(永久节点)下面注册一个临时有序节点, 这样每个线程都注册了一个临时节点, 两个临时节点肯定是有序的。
      线程1: /locks/000000002 线程2: /locks/000000001

      2: 当每个线程注册完节点之后, 需要尝试获取锁, 这个时候, 哪个节点最小, 哪个线程就获取到锁, 这个时候, 线程2注册的节点最小, 所以线程就获取到锁, 执行更新数据库的代码, 更新完
      成之后, 删除自己注册的临时节点。同时线程1会判断自己不是最小的, 所以就会监控比自己小1的那个节点, 当发现那个节点消失的话, 也就意味着它的节点就是最小的节点, 获取锁, 执行更新数据库的代码 

     

      具体,见

    zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)

  • 相关阅读:
    未能加载文件或程序集BUG系列
    寄语
    65. Valid Number
    56. Merge Intervals
    sublime text3 anaconda 插件报错
    42. Trapping Rain Water
    windows 下win+r无效
    93. Restore IP Addresses
    32. Longest Valid Parentheses
    48 Rotate Image
  • 原文地址:https://www.cnblogs.com/zlslch/p/7242233.html
Copyright © 2011-2022 走看看