1 Star 1 Fork 0

go-arch/golang-zk-distribution-lock

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
README.md 1.43 KB
一键复制 编辑 原始数据 按行查看 历史
王群强 提交于 4年前 . change package name

zk-distribution-lock

介绍

golang 基于 zk 的分布式锁实现方案

软件架构

  • 创建一个zk目录 lock
  • 线程A想获取锁就在 lock 目录下创建临时顺序节点;
  • 获取 lock 目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;
  • 线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点;
  • 线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。

安装教程

go get gitee.com/go-arch/golang-zk-distribution-lock

使用说明

package demo

import (
	lock "gitee.com/go-arch/zk-distribution-lock"
	"github.com/samuel/go-zookeeper/zk"
	"time"
	"log"
)

//demo shows a demo function use specific lock name
func demo() {
	conn,_,err := zk.Connect([]string{"127.0.0.1"}, time.Minute,zk.WithLogInfo(false))
	if err != nil {
		panic(err)
    }
	locker, err := lock.NewLocker(conn, lock.WithBasePath("/test/"))
	if err != nil {
		panic(err)
	}
	log.Println("try to get lock")
	err = locker.Lock("lock")
	if err != nil {
		log.Println(err)
		panic(err)
	}
	// do your codes
	log.Println("thread get lock successful", locker.Name())
	defer func() {
		err = locker.Release()
	}()
}

参与贡献

  1. Fork 本仓库
  2. 新建 Feat_xxx 分支
  3. 提交代码
  4. 新建 Pull Request
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/go-arch/golang-zk-distribution-lock.git
git@gitee.com:go-arch/golang-zk-distribution-lock.git
go-arch
golang-zk-distribution-lock
golang-zk-distribution-lock
master

搜索帮助