美文网首页
用Consul实现分布式锁

用Consul实现分布式锁

作者: 老陕西 | 来源:发表于2019-12-22 14:53 被阅读0次

    ETCD vs Consul

    ETCD主要面向Kubernetes,在容器社区相对较流行, 支持REST和gRPC调用, 但是没有UI,也没有官方发布的docker.io的ETCD Docker镜像。

    Consul是比较独立和专业,功能比较全面, 同样专注于K/V存储,服务发现,同样用Go语言实现, 但是多了健康检查, Event,ACL,等功能,关键是提供内建的UI, 而且资料也比较丰富, 提供官方发布的docker镜像,从易用性和可维护性方面来讲,Consul比较适合,没有明显的短板。

    别人画的用Consul实现分布式锁的流程:


    图片.png

    关键点:

    Session

    Consul提供一个Session的概念, 要加锁,必须先有主体,就是谁加锁,怎么知道是谁,session就是干这个用的,session的概念和浏览器的session类似, 访问一个网站的时候,服务器给你的浏览器记录了一个session ID。同样在Consul里面, 你可以申请一个session id,后续的操作就带这个session id,这样服务器在加锁的时候就知道owner。

    创建Session:

    curl --request PUT -d '
    {
      "LockDelay": "15s",
      "Name": "my-service-lock",
      "Node": "appmgr",
      "Behavior": "release",
      "TTL": "30s"
    }' http://127.0.0.1:8500/v1/session/create
    
    
    {
        "ID": "6a9e3dfc-1f34-30c1-bee9-c2f7bbfc429c"
    }
    

    创建带锁的KV

    通过acquire

    curl -X PUT -d 'test' http://localhost:8500/v1/kv/lock/my-service-lock?acquire=6a9e3dfc-1f34-30c1-bee9-c2f7bbfc429c
    
    true
    

    返回true表示加锁成功,前面创建session带了TTL,这个锁即便不释放也会在30s后释放。
    这个时候再通过其它session写这个KV就会返回false。

    释放锁

    curl -X PUT -d 'test' http://localhost:8500/v1/kv/lock/my-service-lock?release=c9276fd1-b028-9409-3daf-910e35307b32
    

    参考

    https://www.cnblogs.com/duanxz/p/7040968.html
    https://www.consul.io/api/session.html#session_create

    相关文章

      网友评论

          本文标题:用Consul实现分布式锁

          本文链接:https://www.haomeiwen.com/subject/qneonctx.html