1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-29 08:12:21 +00:00

update etcd lock desc

This commit is contained in:
Xargin 2018-08-06 15:49:50 +08:00
parent 3c60833756
commit a24b446832

View File

@ -274,7 +274,7 @@ import (
) )
func main() { 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 { if m == nil || err != nil {
log.Printf("etcdsync.New failed") log.Printf("etcdsync.New failed")
return 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 ## redlock
```go ```go
@ -314,7 +321,7 @@ expirity, err := lock_mgr.Lock("resource_name", 200)
err := lock_mgr.UnLock() err := lock_mgr.UnLock()
``` ```
## how to choose ## 如何选择
业务还在单机就可以搞定的量级时,那么按照需求使用任意的单机锁方案就可以。 业务还在单机就可以搞定的量级时,那么按照需求使用任意的单机锁方案就可以。