mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-28 23:42:21 +00:00
update etcd lock desc
This commit is contained in:
parent
3c60833756
commit
a24b446832
@ -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
|
||||
## 如何选择
|
||||
|
||||
业务还在单机就可以搞定的量级时,那么按照需求使用任意的单机锁方案就可以。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user