用Consul实现分布式锁

2019-12-22  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读