From a24b446832f2410b924469fdacf2b6e4efeb268e Mon Sep 17 00:00:00 2001 From: Xargin Date: Mon, 6 Aug 2018 15:49:50 +0800 Subject: [PATCH] update etcd lock desc --- ch6-cloud/ch6-08-lock.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ch6-cloud/ch6-08-lock.md b/ch6-cloud/ch6-08-lock.md index a6123be..b7828b9 100644 --- a/ch6-cloud/ch6-08-lock.md +++ b/ch6-cloud/ch6-08-lock.md @@ -274,7 +274,7 @@ import ( ) func main() { - m, err := etcdsync.New("/mylock", 10, []string{"http://127.0.0.1:2379"}) + m, err := etcdsync.New("/lock", 10, []string{"http://127.0.0.1:2379"}) if m == nil || err != nil { log.Printf("etcdsync.New failed") return @@ -298,6 +298,13 @@ func main() { ``` +etcd 中没有像 zookeeper 那样的 sequence 节点。所以其锁实现和基于 zookeeper 实现的有所不同。在上述示例代码中使用的 etcdsync 的 Lock 流程是: + +1. 先检查 `/lock` 路径下是否有值,如果有值,说明锁已经被别人抢了 +2. 如果没有值,那么写入自己的值。写入成功返回,说明加锁成功。写入时如果节点被其它节点写入过了,那么会导致加锁失败,这时候到 3 +3. watch `/lock` 下的事件,此时陷入阻塞 +4. 当 `/lock` 路径下发生事件时,当前进程被唤醒。检查发生的事件是否是删除事件(说明锁被持有者主动 unlock),或者过期事件(说明锁过期失效)。如果是的话,那么回到 1,走抢锁流程。 + ## redlock ```go @@ -314,7 +321,7 @@ expirity, err := lock_mgr.Lock("resource_name", 200) err := lock_mgr.UnLock() ``` -## how to choose +## 如何选择 业务还在单机就可以搞定的量级时,那么按照需求使用任意的单机锁方案就可以。