最新要闻
- 天天资讯:【工作动态】以培训促提升——医疗机构药品器械管理规范培训会
- 环球观速讯丨终于!清华团队的ChatGPT发布:国人用起来相当友好
- 网红阿秋将离开香港继续骑行:被盗走的8000元自行车仍未找回
- 即时焦点:男孩雷克萨斯4S店内开动展车连撞两车 律师:家长、店方都有责任
- 语音+App远程操控!天猫精灵智能插座探底好价:两件34元
- 当前播报:韩国40出头新娘人数比20岁还多:初婚男女平均年龄均创新高
- 每日热点:混凝土强度两倍!科学家发明火星建屋材料:太空尘埃、土豆淀粉制成
- 你觉得是谁?博主称某日系合资品牌即将退出国内市场
- 要闻:不废话 真低价!途虎养车2023轮胎节启动:几百元能买静音胎
- 对标ChatGPT!文心一言云服务来了:百度官宣3月27日上线
- 主场比赛姆巴佩两失单刀:梅西多次妙传被浪费
- 全球报道:光大证券:LPR还将继续保持平稳
- 环球精选!迪士尼回应游客排挤玲娜贝儿演员:将核实处理 网友吐槽饭圈行为
- 女子骑电动车导航跑上高架一路逆行:不知道不能上高架
- 高能少年团许魏洲抱杨紫是哪一期?高能少年团第二季为什么少了两期?
- 周杰为哪部奥特曼作品中配过音?周杰个人资料和简历
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
etcd 租约、Watch功能、分布式锁的golang实践
- 背景
- etcd 租约
- 不自动续约
- 自动续约
- 取消续约
- Watch 机制
- 使用txn实现分布式锁
- null
背景
本文使用 Golang语言的SDK包 go.etcd.io/etcd/clientv3 实践etcd的租约、Watch等功能,并且实现分布式锁的业务场景。
etcd 租约
etcd过期时间可以通过设置ttl的方式, 通过租约可以控制一组key的过期时间,可以通过续租的方式保持key不过期
//etcd 租约与续约实践func LeaseTest(env string, ttl int64) (err error) {cli, err := getEtcdCli(env) //封装的clientv3客户端,不用太关心if err != nil {return}lease := clientv3.NewLease(cli) leaseGrant, err := lease.Grant(context.Background(), ttl) //声明一个租约,并且设置ttlif err != nil { return}if _, err = cli.Put(context.Background(), "ping", "pong", clientv3.WithLease(leaseGrant.ID)); err != nil { //设置key value 并且绑定租约return}/*保持长链接,每s续租一次 */keepRespChan, err := lease.KeepAlive(context.TODO(), leaseGrant.ID)if err != nil {fmt.Println(err)return}go func() { //查看续期情况 非必需,帮助观察续租的过程for {select {case resp := <-keepRespChan:if resp == nil {fmt.Println("租约失效")return} else {fmt.Println("租约成功", resp)}}}}()for { //持续检测key是否过期values, err := cli.Get(context.Background(), "ping")if err != nil {break}if values.Count == 0 {fmt.Println("已经过期")} else { fmt.Println("没过期", values.Kvs) }time.Sleep(time.Second * 1)}return}
不自动续约
把 lease.KeepAlive 去掉ttl时间之后,租约过期后key删除
(资料图片仅供参考)
自动续约
使lease.KeepAlive生效,以及打印测试可以看出自动续约就是没秒续约一次。
取消续约
两种形式第一种:
lease.Revoke(context.Background(), leaseGrant.ID)
测试:租约失效之后,租约的key会立马被删掉第二种:
ctx, cancelFunc := context.WithCancel(context.TODO())keepRespChan, err := lease.KeepAlive(ctx, leaseGrant.ID)···cancelFunc()
测试:租约失效之后,key的ttl到之后删除key
Watch 机制
watch机制可以使客户端监听etcd的某个key的变化,可以实现配置推送,主动下发等业务场景
//etcd 的watch功能func WatchTest(env string) (err error) {ctx := context.Background()cli, err := getEtcdCli(env)if err != nil {return err}go func() {for { //模拟key的变化cli.Put(ctx, "ping", "pong")cli.Delete(ctx, "ping")time.Sleep(time.Second)}}()pingVal, err := cli.Get(ctx, "ping")if err != nil || len(pingVal.Kvs) == 0 {return err}watchStartRevision := pingVal.Header.Revision + 1 //获取revision,观察这个revision之后的变化fmt.Println(watchStartRevision)watcher := clientv3.NewWatcher(cli)ctx, cancelFunc := context.WithCancel(context.TODO())time.AfterFunc(5*time.Second, func() {cancelFunc()})watchRespChan := watcher.Watch(ctx, "ping", clientv3.WithRev(watchStartRevision))for watchResp := range watchRespChan {for _, event := range watchResp.Events {switch event.Type {case mvccpb.PUT:fmt.Println("修改为:", string(event.Kv.Value), "Revision:", event.Kv.CreateRevision, event.Kv.ModRevision)case mvccpb.DELETE:fmt.Println("删除了", "Revision:", event.Kv.ModRevision)}}}return}
可以看出Watch返回是一个chan,可以持续的监听测试:
使用txn实现分布式锁
//锁的简单封装type Lock struct {lease clientv3.LeaseleaseId clientv3.LeaseIDctx context.ContextcancelFunc context.CancelFunc}func (l *Lock) Lock() (lock bool, err error) {cli, err := getEtcdCli("open")if err != nil {return false, err}l.lease = clientv3.NewLease(cli)l.ctx, l.cancelFunc = context.WithCancel(context.TODO())leaseGrant, err := l.lease.Grant(context.TODO(), 5)if err != nil {return false, err}l.leaseId = leaseGrant.IDkv := clientv3.NewKV(cli)txn := kv.Txn(l.ctx) txn.If(clientv3.Compare(clientv3.CreateRevision("lock"), "=", 0)).Then(clientv3.OpPut("lock", "g", clientv3.WithLease(l.leaseId)))txnResp, err := txn.Commit()if err != nil {return false, err}if !txnResp.Succeeded {return false, nil}//自动续约keepRespChan, err := l.lease.KeepAlive(l.ctx, l.leaseId)_ = keepRespChanreturn true, nil}func (l *Lock) Unlock() {//l.cancelFunc()l.lease.Revoke(l.ctx, l.leaseId)}
txn通过简单的"If-Then-Else"实现了原子操作,这里我们租期过期之后需要立刻将key删除,所以使用Revoke。测试:
func LockTest() {go Node("node1", 5)go Node("node2", 3)select {}}func Node(node string, t time.Duration) {l := Lock{}for {getLock, err := l.Lock()if err != nil || !getLock {continue}fmt.Println("i get the lock: ", node)time.Sleep(time.Second * t)l.Unlock()fmt.Println("i release the lock: ", node)time.Sleep(time.Second)}}
本次代码:https://github.com/zhaoshoucheng/hodgepodge/tree/main/etcd
关键词:
-
etcd 租约、Watch功能、分布式锁的golang实践
背景本文使用Golang语言的SDK包go etcd io etcd clientv3实践etcd的租约、Watch等功能,并且实现分...
来源: 【MySQL】InnoDB vs MyISAM
etcd 租约、Watch功能、分布式锁的golang实践
天天资讯:【工作动态】以培训促提升——医疗机构药品器械管理规范培训会
全球今头条!农垦系统继续开展带头扩种大豆油料行动
环球观速讯丨终于!清华团队的ChatGPT发布:国人用起来相当友好
网红阿秋将离开香港继续骑行:被盗走的8000元自行车仍未找回
即时焦点:男孩雷克萨斯4S店内开动展车连撞两车 律师:家长、店方都有责任
语音+App远程操控!天猫精灵智能插座探底好价:两件34元
当前播报:韩国40出头新娘人数比20岁还多:初婚男女平均年龄均创新高
【世界新要闻】华为交换机查看配置命令的方法
全球快讯:关于国产项目Apache Kylin 发展历程及背后的那些事
今热点:概率与期望入门
环球最新:通过python3启动WEB的方法传输文件
世界聚焦:chrony客户端发送时间戳随机问题
每日热点:混凝土强度两倍!科学家发明火星建屋材料:太空尘埃、土豆淀粉制成
你觉得是谁?博主称某日系合资品牌即将退出国内市场
要闻:不废话 真低价!途虎养车2023轮胎节启动:几百元能买静音胎
对标ChatGPT!文心一言云服务来了:百度官宣3月27日上线
主场比赛姆巴佩两失单刀:梅西多次妙传被浪费
世界快消息!jvm相关知识
全球观焦点:易基因:DNA甲基化研究的3大前期探索性实验思路|干货系列
全球报道:光大证券:LPR还将继续保持平稳
环球精选!迪士尼回应游客排挤玲娜贝儿演员:将核实处理 网友吐槽饭圈行为
女子骑电动车导航跑上高架一路逆行:不知道不能上高架
sd卡根目录是什么意思?sd卡根目录在哪里打开?
惠普的驱动程序在哪个文件夹?惠普sd驱动怎么下载?
高能少年团许魏洲抱杨紫是哪一期?高能少年团第二季为什么少了两期?
周杰为哪部奥特曼作品中配过音?周杰个人资料和简历
厨师罗拉是哪里人?厨师罗拉个人资料简介
每日精选:汽车脚垫天花板!男子直接在车内铺瓷砖:耐磨还方便打理
【世界速看料】小伙求加薪被拒将老板工程车弃河:松离合跳车、致损失27万
全球微资讯!女子点螺蛳粉外卖吃出整根蚯蚓 商家称其想吃霸王餐
多车企疯狂大降价 德国媒体:中国车市从没这么卷过
天天观天下!特斯拉高速行驶中AP突然关闭 方向盘助力诡异消失
最新资讯:ChatGPT4高分通过数据库系统工程师(DBA)认证
天天速读:瓦斯琪尔的任务_瓦斯琪尔前置任务
全球速读:女子超市遇电动购物车:30分钟5块钱!网友:比公园划船划算
最资讯丨文章抹黑造谣?特斯拉索赔500万元被判胜诉!媒体不服上诉
焦点!一部车骑十年 回顾绿源液冷电机发展史:三年创下吉尼斯世界纪录
交易履约之产品中心实践
天天实时:Spring Boot 如果防护 XSS + SQL 注入攻击 ?一文带你搞定!
【世界热闻】Python工具箱系列(二十七)
python高级用法之命名元组namedtuple
【世界速看料】大学生23万网购凯迪拉克二手车:开了俩月就冒烟 三大件全动过
499元 小米真无线降噪耳机3星战定制款发布:风暴兵标志太酷炫
每日快讯!ChatGPT推荐中国最宜居城市 成都第三长沙第一 认可吗
焦点!斗鱼回应36岁女子请假保胎被辞:并非针对孕妇 不服可仲裁
2.8K 120Hz华硕好屏、升级13代酷睿!灵耀14 2023旗舰版图赏
支持向量机SVM
天天微资讯!【C 数据结构】循环队列
【世界快播报】孙子膑脚全文_孙子膑脚
全球今热点:GPT-4刚发布就有手机APP接入 上传照片视频一键解读
迪士尼被曝大幅裁员!公司称至少有4000名员工将在4月份失业
当前滚动:239元 荣耀手环7 NFC版开售:新增公交/门禁功能
世界要闻:2022年超越德国成全球第二 中国新能源汽车出口继续高增长
熊孩子4S店不小心启动车辆 展车冲出撞击多辆新车
天天日报丨读C#代码整洁之道笔记01_C#的编码标准和原则
热资讯!【新华解读】降准落地对债市是否意味着利好出尽?
电动车价格还得降 “白色石油”碳酸锂价格三个月大跌40% 专家称重大利好
全球热推荐:中长视频版抖音!抖音官方全新APP青桃上线:对标B站
机构:中国人幸福感全球最高 韩国人排名全球垫底 日美紧随其后
当前看点!TVB演员30秒被扇21个耳光让人惊叹 网友点赞:吐槽内娱明星不敬业
【环球新视野】债市观察:海外风险事件扰动有限 期现券难脱震荡格局
美联储联手全球主要央行加强美元流动性供给
天天热资讯!业内人士:超预期“降准”呵护流动性 提振金属市场需求复苏
世界热点!市场避险情绪高涨 金油比价上破26桶/盎司
我眼中的秋天600字的作文_我眼中的秋天600字
美国银行接连倒闭:国际黄金价格逼近2000美元大关 全球疯抢
当前热议!又一个国产ChatGPT 李开复再创业:打造世界级AI公司
资讯推荐:读Java性能权威指南(第2版)笔记22_ 操作系统工具和Java监控工具
天天快资讯:护眼电视都是骗人的?真相揭秘
考研周记-week4
环球关注:[MRCTF2020]Ezpop
【OpenGL ES】绘制魔方
hystrix的熔断降级
过去几亿年 月亮变“瘦了”约50米:地球呢?
男子网恋1年多 女友竟是好友老婆:转账8万多要不回来
为什么迅雷下载不了文件_为什么迅雷下载不了
环球热讯:Masa Framework源码解读-03 MasaMinimalApi设计
世界微资讯!Vue——initEvents【六】
世界看热讯:人类身体为什么不长毛?竟然是因为这
手机的天线去哪了?原来就在眼皮底下
Web API接口返回实现类集合的姿势了解
【单元测试】Junit 4(七)--junit4 TestRunnner
微头条丨皮鞋果冻制作方法_皮鞋果冻
日月潭蓄水率创新低:九蛙叠像全露出 还有“神秘黑洞”
【模型部署】在C++和Python中配置OpenVINO2022环境
谈谈 Vue shallowRef 和 shallowReactive
快报:刷题疑惑2
前端加载超大图片(100M以上)实现秒开解决方案
快讯:数据结构-图
连上半个月夜班 27岁小伙一觉醒来懵了:脸肿得像包子
环球今亮点!微信新增“视频号”入口?腾讯张军否认网传截图:假的
数据挖掘第四周作业
conda环境下使用nvcc -V报错nvcc: command not found的一种解决方法
环球快资讯:【论文笔记】SegNet
OpenAI CEO承认害怕ChatGPT:AI会取代许多工作
前端设计模式——原型模式
全球短讯!69.处理类型
环球快看:车主花32万买到全损事故车:获退1赔3、到手97.2万