精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一篇帶給你etcd與分布式鎖

開發 前端 分布式
可以提供分布式鎖功能的組件有多種,但是每一種都有自己的脾氣與性格。至于選擇哪一種組件,則要看數據對業務的重要性,數據要求強一致性推薦支持CP的etcd、zookeeper,數據允許少量丟失、不要求強一致性的推薦支持AP的Redis。

[[400328]]

1. 實現分布式鎖的組件們

在分布式系統中,常用于實現分布式鎖的組件有:Redis、zookeeper、etcd,下面針對各自的特性進行對比:

由上圖可以看出三種組件各自的特點,其中對于分布式鎖來說至關重要的一點是要求CP。但是,Redis集群卻不支持CP,而是支持AP。雖然,官方也給出了redlock的方案,但由于需要部署多個實例(超過一半實例成功才視為成功),部署、維護比較復雜。所以在對一致性要求很高的業務場景下(電商、銀行支付),一般選擇使用zookeeper或者etcd。對比zookeeper與etcd,如果考慮性能、并發量、維護成本來看。由于etcd是用Go語言開發,直接編譯為二進制可執行文件,并不依賴其他任何東西,則更具有優勢。本文,則選擇etcd來討論某些觀點。

2. 對于分布式鎖來說AP為什么不好

在CAP理論中,由于分布式系統中多節點通信不可避免出現網絡延遲、丟包等問題一定會造成網絡分區,在造成網絡分區的情況下,一般有兩個選擇:CP or AP。

① 選擇AP模型實現分布式鎖時,client在通過集群主節點加鎖成功之后,則立刻會獲取鎖成功的反饋。此時,在主節點還沒來得及把數據同步給從節點時發生down機的話,系統會在從節點中選出一個節點作為新的主節點,新的主節點沒有老的主節點對應的鎖數據,導致其他client可以在新的主節點上拿到相同的鎖。這個時候,就會導致多個進程/線程/協程來操作相同的臨界資源數據,從而引發數據不一致性等問題。

② 選擇CP模型實現分布式鎖,只有在主節點把數據同步給大于1/2的從節點之后才被視為加鎖成功。此時,主節點由于某些原因down機,系統會在從節點中選取出來數據比較新的一個從節點作為新的主節點,從而避免數據丟失等問題。

所以,對于分布式鎖來說,在對數據有強一致性要求的場景下,AP模型不是一個好的選擇。如果可以容忍少量數據丟失,出于維護成本等因素考慮,AP模型的Redis可優先選擇。

3. 分布式鎖的特點以及操作

對于分布式鎖來說,操作的動作包含:

  1. 獲取鎖
  2. 釋放鎖
  3. 業務處理過程中過程中,另起線程/協程進行鎖的續約

4. 關于etcd

官方文檔永遠是最好的學習資料,官方介紹etcd如是說:

  • 分布式系統使用etcd作為配置管理、服務發現和協調分布式工作的一致鍵值存儲。許多組織使用etcd來實現生產系統,如容器調度器、服務發現服務和分布式數據存儲。使用etcd的常見分布式模式包括leader選舉、分布式鎖和監視機器活動。
  • Distributed systems use etcd as a consistent key-value store for configuration management, service discovery, and coordinating distributed work. Many organizations use etcd to implement production systems such as container schedulers, service discovery services, and distributed data storage. Common distributed patterns using etcd include leader election, distributed locks, and monitoring machine liveness.
  • https://etcd.io/docs/v3.4/learning/why/

分布式鎖僅是etcd可以實現眾多功能中的一項,服務注冊與發現在etcd中用的則會更多。

官方也對眾多組件進行了對比,并整理如下:

通過對比可以看出各自的特點,至于具體選擇哪一款,你心中可能也有了自己的答案。

5. etcd實現分布式鎖的相關接口

對于分布式鎖,主要用到etcd對應的添加、刪除、續約接口。

  1. // KV:鍵值相關操作 
  2. type KV interface { 
  3.     // 存放. 
  4.     Put(ctx context.Context, key, val string, opts ...OpOption) (*PutResponse, error) 
  5.     // 獲取. 
  6.     Get(ctx context.Context, key string, opts ...OpOption) (*GetResponse, error) 
  7.     // 刪除. 
  8.     Delete(ctx context.Context, key string, opts ...OpOption) (*DeleteResponse, error) 
  9.     // 壓縮rev指定版本之前的歷史數據. 
  10.     Compact(ctx context.Context, rev int64, opts ...CompactOption) (*CompactResponse, error) 
  11.     // 通用的操作執行命令,可用于操作集合的遍歷。Put/Get/Delete也是基于Do. 
  12.     Do(ctx context.Context, op Op) (OpResponse, error) 
  13.     // 創建一個事務,只支持If/Then/Else/Commit操作. 
  14.     Txn(ctx context.Context) Txn 
  15.  
  16.  
  17. // Lease:租約相關操作 
  18. type Lease interface { 
  19.     // 分配一個租約. 
  20.     Grant(ctx context.Context, ttl int64) (*LeaseGrantResponse, error) 
  21.     // 釋放一個租約. 
  22.     Revoke(ctx context.Context, id LeaseID) (*LeaseRevokeResponse, error) 
  23.     // 獲取剩余TTL時間. 
  24.     TimeToLive(ctx context.Context, id LeaseID, opts ...LeaseOption) (*LeaseTimeToLiveResponse, error) 
  25.     // 獲取所有租約. 
  26.     Leases(ctx context.Context) (*LeaseLeasesResponse, error) 
  27.     // 續約保持激活狀態. 
  28.     KeepAlive(ctx context.Context, id LeaseID) (<-chan *LeaseKeepAliveResponse, error) 
  29.     // 僅續約激活一次. 
  30.     KeepAliveOnce(ctx context.Context, id LeaseID) (*LeaseKeepAliveResponse, error) 
  31.     // 關閉續約激活的功能. 
  32.     Close() error 

 6. etcd實現分布式鎖代碼示例

  1. package main 
  2.  
  3. import ( 
  4.     "context" 
  5.     "fmt" 
  6.     "go.etcd.io/etcd/clientv3" 
  7.     "time" 
  8.  
  9. var conf clientv3.Config 
  10.  
  11. // 鎖結構體 
  12. type EtcdMutex struct { 
  13.     Ttl int64//租約時間 
  14.  
  15.     Conf   clientv3.Config    //etcd集群配置 
  16.     Key    string//etcd的key 
  17.     cancel context.CancelFunc //關閉續租的func 
  18.  
  19.     txn     clientv3.Txn 
  20.     lease   clientv3.Lease 
  21.     leaseID clientv3.LeaseID 
  22.  
  23. // 初始化鎖 
  24. func (em *EtcdMutex) init() error { 
  25.     var err error 
  26.     var ctx context.Context 
  27.  
  28.     client, err := clientv3.New(em.Conf) 
  29.     if err != nil { 
  30.         return err 
  31.     } 
  32.  
  33.     em.txn = clientv3.NewKV(client).Txn(context.TODO()) 
  34.     em.lease = clientv3.NewLease(client) 
  35.     leaseResp, err := em.lease.Grant(context.TODO(), em.Ttl) 
  36.  
  37.     if err != nil { 
  38.         return err 
  39.     } 
  40.  
  41.     ctx, em.cancel = context.WithCancel(context.TODO()) 
  42.     em.leaseID = leaseResp.ID 
  43.     _, err = em.lease.KeepAlive(ctx, em.leaseID) 
  44.  
  45.     return err 
  46.  
  47. // 獲取鎖 
  48. func (em *EtcdMutex) Lock() error { 
  49.     err := em.init() 
  50.     if err != nil { 
  51.         return err 
  52.     } 
  53.  
  54.     // LOCK 
  55.     em.txn.If(clientv3.Compare(clientv3.CreateRevision(em.Key), "=", 0)). 
  56.         Then(clientv3.OpPut(em.Key"", clientv3.WithLease(em.leaseID))).Else() 
  57.  
  58.     txnResp, err := em.txn.Commit() 
  59.     if err != nil { 
  60.         return err 
  61.     } 
  62.  
  63.     // 判斷txn.if條件是否成立 
  64.     if !txnResp.Succeeded { 
  65.         return fmt.Errorf("搶鎖失敗"
  66.     } 
  67.  
  68.     returnnil 
  69.  
  70. //釋放鎖 
  71. func (em *EtcdMutex) UnLock() { 
  72.     // 租約自動過期,立刻過期 
  73.     // cancel取消續租,而revoke則是立即過期 
  74.     em.cancel() 
  75.     em.lease.Revoke(context.TODO(), em.leaseID) 
  76.  
  77.     fmt.Println("釋放了鎖"
  78.  
  79. // groutine1 
  80. func try2lock1() { 
  81.     eMutex1 := &EtcdMutex{ 
  82.         Conf: conf, 
  83.         Ttl:  10, 
  84.         Key:  "lock"
  85.     } 
  86.  
  87.     err := eMutex1.Lock() 
  88.     if err != nil { 
  89.         fmt.Println("groutine1搶鎖失敗"
  90.         return 
  91.     } 
  92.     defer eMutex1.UnLock() 
  93.  
  94.     fmt.Println("groutine1搶鎖成功"
  95.     time.Sleep(10 * time.Second
  96.  
  97. // groutine2 
  98. func try2lock2() { 
  99.     eMutex2 := &EtcdMutex{ 
  100.         Conf: conf, 
  101.         Ttl:  10, 
  102.         Key:  "lock"
  103.     } 
  104.  
  105.     err := eMutex2.Lock() 
  106.     if err != nil { 
  107.         fmt.Println("groutine2搶鎖失敗"
  108.         return 
  109.     } 
  110.  
  111.     defer eMutex2.UnLock() 
  112.     fmt.Println("groutine2搶鎖成功"
  113.  
  114. // 測試代碼 
  115. func EtcdRunTester() { 
  116.     conf = clientv3.Config{ 
  117.         Endpoints:   []string{"127.0.0.1:2379"}, 
  118.         DialTimeout: 5 * time.Second
  119.     } 
  120.  
  121.     // 啟動兩個協程競爭鎖 
  122.     go try2lock1() 
  123.     go try2lock2() 
  124.  
  125.     time.Sleep(300 * time.Second

 總結

可以提供分布式鎖功能的組件有多種,但是每一種都有自己的脾氣與性格。至于選擇哪一種組件,則要看數據對業務的重要性,數據要求強一致性推薦支持CP的etcd、zookeeper,數據允許少量丟失、不要求強一致性的推薦支持AP的Redis。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-07-21 09:48:20

etcd-wal模塊解析數據庫

2021-04-01 10:51:55

MySQL鎖機制數據庫

2021-06-16 14:44:32

etcd-raftRaftLeader

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2022-04-29 14:38:49

class文件結構分析

2021-03-12 09:21:31

MySQL數據庫邏輯架構

2021-04-14 14:16:58

HttpHttp協議網絡協議

2024-06-13 08:34:48

2023-03-29 07:45:58

VS編輯區編程工具

2022-02-17 08:53:38

ElasticSea集群部署

2021-06-21 14:36:46

Vite 前端工程化工具

2022-03-22 09:09:17

HookReact前端

2021-04-08 11:00:56

CountDownLaJava進階開發

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2021-07-08 07:30:13

Webpack 前端Tree shakin

2023-03-13 09:31:04

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-04-14 07:55:45

Swift 協議Protocol

2021-05-08 08:36:40

ObjectString前端

2021-10-28 08:51:53

GPIO軟件框架 Linux
點贊
收藏

51CTO技術棧公眾號

日韩美女视频免费在线观看| 欧美一卡二卡在线| 神马影院午夜我不卡| 中文字幕免费高清在线观看| 国产精品99在线观看| 日韩精品一区二区三区蜜臀| 国产主播在线看| 在线视频91p| 福利电影一区二区三区| 国产精品白嫩初高中害羞小美女| 国产精品国产精品88| 九色丨蝌蚪丨成人| 欧美久久久久久久久中文字幕| 国精产品一区一区三区视频| 91啦中文在线| 91色综合久久久久婷婷| 91观看网站| 97人妻精品视频一区| 亚洲激情精品| 久久天天躁狠狠躁夜夜av| 欧美做受喷浆在线观看| 国产精品一区二区精品| 在线观看日韩电影| 少妇高潮喷水在线观看| 成人日韩欧美| 国产精品麻豆一区二区| 美国av一区二区三区| 亚洲乱熟女一区二区| 精品一区二区免费视频| 日本欧美在线视频| 伊人365影院| 99成人在线视频| 一区二区三区亚洲| 亚洲熟妇无码av| 99香蕉久久| 欧美不卡一二三| 天堂av.com| 亚洲精品tv| 欧美色爱综合网| www日韩在线观看| 国产色播av在线| 亚洲成人黄色影院| 国产视频在线观看网站| 黄色在线播放网站| 中文久久乱码一区二区| 日韩视频精品| 国产免费a∨片在线观看不卡| 99久久亚洲一区二区三区青草 | 日本一区二区三区免费看| 人妻少妇一区二区三区| 成人自拍视频在线观看| 大波视频国产精品久久| 亚洲精品国产一区二| 国产精品一区二区免费不卡| 亚洲va久久久噜噜噜| 国产又粗又猛视频免费| 久久福利视频一区二区| 国产日本欧美一区| 91精品中文字幕| 国精产品一区一区三区mba桃花| 91精品国产综合久久香蕉| 在线观看中文字幕码| 久久国产尿小便嘘嘘| 成人久久精品视频| 性色av蜜臀av| 北条麻妃一区二区三区| 精品国产乱码久久久久| 日本成人一区| 国产精品私人影院| 男女h黄动漫啪啪无遮挡软件| а√天堂8资源在线官网| 一区二区免费看| 国产精品久久久久7777| 久久青草伊人| 欧美亚洲国产bt| 久久6免费视频| 日韩精品一区二区三区中文在线| 精品精品国产高清a毛片牛牛| 日韩av无码一区二区三区不卡| 日韩精品a在线观看91| 国产午夜精品一区理论片飘花| 91视频免费在观看| 欧美在线三区| 668精品在线视频| 中文字幕日产av| 国产一区二区日韩精品| 国内精品二区| 在线激情免费视频| 亚洲综合免费观看高清完整版在线 | 极品少妇一区二区三区| 欧美亚洲视频在线观看| 欧美激情一区二区三区免费观看| 国产综合一区二区| 国产欧美丝袜| 在线视频婷婷| 精品女厕一区二区三区| 色乱码一区二区三区在线| 欧美久久亚洲| 国产亚洲精品美女| 麻豆疯狂做受xxxx高潮视频| 午夜亚洲伦理| 亚洲xxxx做受欧美| 国产h视频在线观看| 一区二区三区国产豹纹内裤在线| 久久久久久久久久久免费视频| 91麻豆精品国产综合久久久| 亚洲精品电影在线观看| 黄色香蕉视频在线观看| 亚洲永久免费| 99蜜桃在线观看免费视频网站| 免费一级在线观看播放网址| 亚洲视频一区二区免费在线观看| 国产性xxxx18免费观看视频| 日本免费精品| 这里只有精品视频| 日韩精品成人在线| 国产一区二区精品久久| 日韩精品另类天天更新| av影片在线| 69久久99精品久久久久婷婷 | 欧美专区日韩视频| www.五月婷婷| 国产精品超碰97尤物18| 黄www在线观看| jizz国产精品| 欧美风情在线观看| 国产精品呻吟久久| 中文欧美字幕免费| 久久精品网站视频| 四虎5151久久欧美毛片| 欧美激情视频一区二区三区不卡| 一本到在线视频| 久久精品水蜜桃av综合天堂| 国产伦精品一区二区三区四区视频_| 精品99re| 美日韩精品免费观看视频| 国产又爽又黄免费软件| 国产欧美1区2区3区| 国产极品美女高潮无套久久久| 精品三级av| 久久久久久com| 亚洲第一页视频| 一区二区国产盗摄色噜噜| 交换做爰国语对白| 亚洲天天影视网| 亚洲一区二区三区在线视频| 欧美一区二区三区在线观看免费| 欧美色综合影院| 中字幕一区二区三区乱码| 日精品一区二区三区| 秋霞久久久久久一区二区| 欧美专区福利免费| 在线观看精品自拍私拍| 中文字幕在线2019| 国产精品看片你懂得| www.cao超碰| 亚洲自拍偷拍网| www.成人三级视频| 多野结衣av一区| 国产偷国产偷亚洲清高网站| 久久久久久不卡| 久久精品视频一区二区| 男人舔女人下面高潮视频| 精品免费视频| 成人久久精品视频| 免费在线播放电影| 亚洲国产精久久久久久| 天天操夜夜操视频| 国产人成亚洲第一网站在线播放| 在线免费观看视频黄| 91一区二区三区四区| 亚洲专区在线视频| free性欧美| 亚洲视频在线观看免费| 一卡二卡在线视频| 亚洲自拍偷拍欧美| 国产精品815.cc红桃| 日韩不卡一二三区| 超碰人人爱人人| 欧美亚洲国产日韩| 国产精品丝袜久久久久久高清| 毛片在线不卡| 亚洲福利精品在线| 国产美女www| 一区二区三区在线观看动漫| 黄色录像a级片| 麻豆精品久久精品色综合| 国产乱子伦精品视频| 婷婷精品视频| 亚洲free嫩bbb| 乡村艳史在线观看| 日韩视频免费大全中文字幕| 日本精品999| 欧美日韩一本到| 日韩av黄色片| 欧美国产亚洲另类动漫| 折磨小男生性器羞耻的故事| 欧美aaaaa成人免费观看视频| 大伊香蕉精品视频在线| 凹凸成人精品亚洲精品密奴| 国产精品sss| 日本久久二区| 国产成人精品网站| 51漫画成人app入口| 精品国产一区av| 欧洲毛片在线| 亚洲成人1234| 国产麻豆免费视频| 在线观看免费一区| 日本少妇xxxx动漫| 亚洲人成精品久久久久久| 亚洲永久精品ww.7491进入| 福利一区二区在线| 日韩av自拍偷拍| 热久久久久久久| 91九色在线观看视频| 欧美成人中文| 99精品视频网站| 欧美码中文字幕在线| 久久riav二区三区| 大型av综合网站| 亚洲字幕在线观看| 4438五月综合| 国产精品亚洲网站| 激情开心成人网| 欧美一级淫片aaaaaaa视频| 香蕉成人app免费看片| 日韩中文字幕网站| 成年女人的天堂在线| 亚洲欧美另类中文字幕| 色香蕉在线视频| 欧美va亚洲va在线观看蝴蝶网| 91成年人视频| 欧美日韩一区二区三区四区 | 黄页在线观看免费| 欧美成人中文字幕| av观看在线| 裸体女人亚洲精品一区| 黄色视屏免费在线观看| 久久精品国产99国产精品澳门| 高清中文字幕一区二区三区| 亚洲色图美腿丝袜| 国产在线日本| 一区二区亚洲精品国产| 国产二区在线播放| 在线精品高清中文字幕| av电影在线观看| 日韩专区在线播放| 黄色网页在线免费看| 久久精品中文字幕| caopo在线| 久久久久久国产精品久久| 美洲精品一卡2卡三卡4卡四卡| 欧美国产日韩精品| 草草影院在线| 欧美一级电影免费在线观看| 欧美电影网站| 国产主播精品在线| 欧美高清一级片| 国产日韩一区欧美| 婷婷综合福利| 日韩一区二区三区资源| 国产精品精品| 免费网站永久免费观看| 国产一区二区你懂的| 国内外免费激情视频| 免费人成黄页网站在线一区二区| 免费看涩涩视频| 国产精品99久久久久久宅男| 国产人妻精品午夜福利免费| 91免费视频观看| 日韩一区二区三区四区视频| 亚洲视频一二三| 圆产精品久久久久久久久久久| 一本久久综合亚洲鲁鲁五月天| 久久久久久av无码免费看大片| 7777精品伊人久久久大香线蕉的 | 天天综合在线视频| 亚洲天堂男人的天堂| 黄色精品在线观看| 97久久久免费福利网址| 日韩欧美少妇| wwwxx欧美| 精品免费视频| 日韩黄色片在线| 日韩国产在线一| 欧美体内she精高潮| 久久日韩精品一区二区五区| 天天鲁一鲁摸一摸爽一爽| 午夜精品视频在线观看| 91精品国产乱码久久久| 亚洲黄页网在线观看| 最新电影电视剧在线观看免费观看| 欧美激情a在线| 另类中文字幕国产精品| av一本久道久久波多野结衣| 欧美手机视频| 男人的天堂狠狠干| 老司机一区二区| 欧美熟妇一区二区| 一区二区三区四区不卡视频| 国产免费a视频| 亚洲国产精品yw在线观看 | 后进极品白嫩翘臀在线视频| 中文字幕日韩在线播放| 国产调教在线| 91九色在线免费视频| 国产欧美久久一区二区三区| 欧美乱大交xxxxx潮喷l头像| 激情综合色播五月| 色一情一交一乱一区二区三区| 一区二区三区在线播放| 91在线你懂的| 亚洲无线码在线一区观看| 高端美女服务在线视频播放| 亚洲国产美女搞黄色| 亚洲精品www.| aaa国产一区| 激情综合网五月天| 欧美日韩不卡视频| 国产露出视频在线观看| 91精品国产网站| 波多野结衣在线一区二区 | 欧美精品黑人性xxxx| 黄色av网址在线免费观看| 久久久久久91| 成人偷拍自拍| 免费在线看黄色片| 国产精品中文有码| 欧美成人精品欧美一级| 6080yy午夜一二三区久久| lutube成人福利在线观看| 国产成人精品综合久久久| 性欧美lx╳lx╳| 国模吧无码一区二区三区| av男人天堂一区| 亚洲免费激情视频| 亚洲国产成人精品女人久久久| 日本片在线观看| 国产精品久久九九| 伊人成人在线视频| 日本天堂在线播放| 亚洲午夜电影在线| 免费的黄色av| 欧美一级黑人aaaaaaa做受| 任你弄精品视频免费观看| 日韩一区二区三| 少妇高潮一区二区三区69| 久久久亚洲成人| 欧美交a欧美精品喷水| 免费看日本毛片| 久久伊人中文字幕| 日本黄色一级视频| 在线播放国产精品| 巨胸喷奶水www久久久| 亚洲欧美一区二区原创| 开心九九激情九九欧美日韩精美视频电影| 国产伦理片在线观看| 欧美视频中文字幕| 日韩欧美小视频| 91免费精品视频| 黄色成人在线网址| 国产一级二级视频| 色综合婷婷久久| av影片在线看| 99国产在线观看| 亚洲毛片av| 天天躁夜夜躁狠狠是什么心态| 欧美三级在线播放| av在线免费网站| 精品网站在线看| 免费高清成人在线| 青青草原在线免费观看| 亚洲精品黄网在线观看| 欧美专区福利免费| 国产激情在线看| 99国产精品国产精品毛片| 波多野结衣在线观看一区| 久久成年人免费电影| 蜜桃一区av| 久热精品在线播放| 亚洲午夜在线视频| 国产天堂在线| 91网免费观看| 日韩精品久久理论片| 久久r这里只有精品| 日韩电影中文字幕一区| 日韩黄色三级在线观看| 国产精品久久国产| 国产亚洲福利社区一区| 精品人妻一区二区三区浪潮在线| 欧洲一区二区视频| 一个色综合网| 少妇大叫太粗太大爽一区二区| 欧美精品一级二级| 漫画在线观看av| 国产一二三四区在线观看| 91蝌蚪porny九色| jizz国产视频| 国产精品黄色av|