锁和选举
概述
// Sync is an interface for distributed synchronization
type Sync interface {
// Init Initialise options
Init(...Option) error
// Options Return the options
Options() Options
// Leader Elect a leader
Leader(ctx context.Context, name string, opts ...LeaderOption) (Leader, error)
// ListMembers get all election member
ListMembers(ctx context.Context, opts ...ListMembersOption) ([]*Member, error)
// WatchElect watch leader event
WatchElect(ctx context.Context, opts ...WatchElectOption) (ElectWatcher, error)
// Lock acquires a lock
Lock(ctx context.Context, id string, opts ...LockOption) error
// Unlock releases a lock
Unlock(ctx context.Context, id string) error
// String Sync implementation
String() string
}
使用
分布式锁
func main() {
s := etcd.NewSync()
if err := s.Init(); err != nil {
log.Fatalln(err)
}
// 创建锁
err := s.Lock(context.TODO(), "lock1", sync.LockTTL(time.Second * 3))
if err != nil {
log.Fatalln(err)
}
ch := make(chan struct{}, 1)
go func() {
err := s.Lock(context.TODO(), "lock1", sync.LockTTL(time.Second * 3))
if err != nil {
log.Fatalln(err)
}
fmt.Println("Locked")
ch <- struct{}{}
}()
// 释放锁
if err = s.Unlock(context.TODO(), "lock1"); err != nil {
log.Fatalln(err)
}
fmt.Println("lock1 released")
<-ch
}
分布式选举
func main() {
s := etcd.NewSync()
if err := s.Init(); err != nil {
log.Fatalln(err)
}
id := uuid.NewString()
// 新 leader
role1, err := s.Leader(context.TODO(), "leader", sync.LeaderNS("default"), sync.LeaderId(id), sync.LeaderTTL(3))
if err != nil {
log.Fatalln(err)
}
// 查询所有选举成员
ms, _ := s.ListMembers(context.TODO(), sync.MemberNS("default"))
for _, m := range ms {
fmt.Println(m)
}
// 成员辞职
if err := role1.Resign(); err != nil {
log.Fatalln(err)
}
}
options
初始化
func main() {
memory.NewSync(
sync.Prefix("/vine/sync"), // key 前缀
sync.Nodes("127.0.0.1:2379"), // 服务端地址
)
}
上锁和释放锁
func main() {
s.Lock(context.TODO(), "lock1",
sync.LockTTL(), // 锁的 ttl
sync.LockWait(), // 超时时间
)
}
选举
func main() {
s.Leader(context.TODO(), "leader",
sync.LeaderNS(), // namespace
sync.LeaderTTL(), //
sync.LeaderId(), // 成员 id
)
}
实例
更多的实例代码可参考 examples
最后修改 February 21, 2023: vine@v1.5 (cd019cf)