精品欧美一区二区三区在线观看 _久久久久国色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久久婷婷国产一区二区三区| 一区二区三区在线电影| 欧美精品一区二区久久久| 国产99久久九九精品无码| jizzjizz在线观看| 成人免费毛片高清视频| 国产精品扒开腿做| 欧美成人一二三区| 国产精品免费大片| 欧美一区二区三区四区高清| 1024av视频| а√中文在线8| 久久久久久久久一| 成人高清在线观看| 性高潮视频在线观看| 激情久久久久| www国产精品com| 少妇特黄一区二区三区| 欧美高清一级片| 欧美中文字幕一区二区三区亚洲 | 欧美在线 | 亚洲| 日韩国产在线观看| 久久人人爽人人爽人人片av高请| 国产又粗又长免费视频| 国产精品2023| 日韩欧美综合在线| 黄色手机在线视频| 小视频免费在线观看| 亚洲日本在线a| 午夜一区二区三区| 深夜福利免费在线观看| 成人午夜在线播放| 亚洲精品免费av| 日韩xxx视频| 午夜综合激情| 91精品国产精品| 久久9999久久免费精品国产| 久久久人成影片免费观看| 中文字幕亚洲一区二区三区五十路| 黄色av网址在线观看| 亚洲日本va| 日韩午夜精品电影| 中文字幕一区二区三区四| 成人a在线观看高清电影| 欧美性生交大片免网| 欧美亚洲精品一区二区| 91精品国产黑色瑜伽裤| 亚洲综合在线第一页| 激情图片qvod| 97超碰资源站在线观看| 亚洲欧美日本韩国| 黄色网zhan| www久久日com| 亚洲精品欧美二区三区中文字幕| 色视频一区二区三区| 国产毛片在线| 国产精品你懂的在线欣赏| 日本高清不卡三区| 成人精品一区二区三区免费| 国产无一区二区| 五月天亚洲综合情| 男女啪啪在线观看| 亚洲免费av高清| 日本免费a视频| 麻豆视频在线观看免费网站黄| 亚欧色一区w666天堂| 欧美在线观看成人| 久久99久久99精品免观看软件| 一本色道亚洲精品aⅴ| 久草在在线视频| 欧美一区二区三区婷婷| 欧美一区二区久久| 国产十八熟妇av成人一区| 婷婷精品在线| 一本色道久久综合狠狠躁篇怎么玩| 欧美性受xxxx黑人| 91精品一区二区三区综合在线爱| 欧美美最猛性xxxxxx| 日本中文字幕免费观看| 日日夜夜免费精品| 91视频88av| 亚洲 欧美 自拍偷拍| 久久久精品中文字幕麻豆发布| 亚洲v欧美v另类v综合v日韩v| 激情影院在线观看| 亚洲第一久久影院| 黄色手机在线视频| 国产成人在线中文字幕| 国产一区二区三区直播精品电影| 国产精品夜夜夜爽阿娇| 亚洲精选一区| 国产日韩欧美夫妻视频在线观看 | 波多野结衣激情| 麻豆蜜桃在线| 在线观看亚洲精品| 国产999免费视频| 欧美日韩看看2015永久免费 | 日韩精品中午字幕| 熟女俱乐部一区二区视频在线| 91视频综合| 97久久精品人搡人人玩 | 精品国产乱码久久久久久久| 欧美成人国产精品一区二区| 在线国产一区| 国产精品女视频| 日本国产在线观看| 国产精品久久久一本精品| 欧美黑人经典片免费观看| 欧美亚洲黄色| 亚洲人成电影在线播放| 国产无码精品在线观看| 国内精品写真在线观看| 亚欧洲精品在线视频免费观看| 黄色在线观看www| 91精品国产aⅴ一区二区| 国产肥白大熟妇bbbb视频| 亚洲午夜视频| 亚洲一区二区免费| 婷婷视频在线| 欧洲亚洲精品在线| 少妇精品一区二区三区| 伊人成人在线| 99伊人久久| 超碰在线网址| 欧美军同video69gay| 久久久视频6r| 久久精品道一区二区三区| 国产一级二级三级精品| 欧洲中文在线| 日韩欧美高清一区| 内射一区二区三区| 久久精品国产在热久久| 日韩欧美第二区在线观看| 在线女人免费视频| 三上悠亚国产精品一区二区三区| 亚洲人精品一区| 亚洲视频在线a| 秋霞影视一区二区三区| 欧美激情视频一区二区三区不卡| 88av在线视频| 亚洲不卡系列| 精品国产一二三| 波多野结衣不卡视频| 久久精品国产第一区二区三区| 欧美日韩亚洲一区二区三区四区| 天堂在线中文网官网| 亚洲国产精彩中文乱码av| 国产精品99无码一区二区| 国产91精品免费| 欧美男女爱爱视频| 国偷自产av一区二区三区| 高清一区二区三区日本久| 亚洲黄色一级大片| 亚洲国产精品久久人人爱蜜臀 | 欧美人与动牲性行为| 欧美狂野另类xxxxoooo| 亚洲AV成人无码精电影在线| 久久精品一区二区三区四区五区 | 中文字幕免费精品一区| 日韩欧美一区二区视频在线播放| 男女羞羞视频在线观看| 精品国产123| 亚洲伊人成人网| 久久奇米777| 最近中文字幕一区二区| 婷婷综合激情| 成人精品一二区| av午夜在线观看| 亚洲精品一二区| 久久人人爽人人爽人人片av免费| 久久香蕉国产线看观看99| 日本久久精品一区二区| 91精品精品| 国产精品一区二区a| 日韩伦理在线| 自拍亚洲一区欧美另类| 国产夫绿帽单男3p精品视频| 亚洲午夜国产一区99re久久| 丰腴饱满的极品熟妇| 九色综合狠狠综合久久| 丰满的少妇愉情hd高清果冻传媒 | 日韩经典一区二区三区| 亚洲欧美日韩激情| 亚洲品质自拍视频| 亚洲av片不卡无码久久| 免费成人你懂的| www.avtt| 久久久综合色| 黑人另类av| 3d动漫一区二区三区在线观看| 久久久久久久久久国产精品| 国产69精品久久app免费版| 天天操天天干天天综合网| 免费看日本黄色片| 久久机这里只有精品| 精品视频在线观看一区| 蜜臀av一区| 成人免费视频网| 久九九久频精品短视频| 不用播放器成人网| 国产高清在线观看| 亚洲激情视频网站| 国产精品一区二区av白丝下载| 精品免费在线观看| 欧美国产日韩在线观看成人| 久久久噜噜噜久噜久久综合| 国产sm在线观看| 裸体在线国模精品偷拍| 中国丰满人妻videoshd| 国产精品分类| av动漫免费观看| 不卡视频在线| 久久天堂国产精品| 成人av激情人伦小说| 91精品美女在线| 成人软件在线观看| 69久久夜色精品国产69| 色yeye免费人成网站在线观看| 视频一区视频二区国产精品 | 中文在线最新版天堂| 亚洲午夜成aⅴ人片| 麻豆精品一区二区三区视频| 国产精品护士白丝一区av| 素人fc2av清纯18岁| 成人av电影免费观看| 手机av在线网站| 另类中文字幕网| 国产免费999| 日韩av高清在线观看| 日本久久久精品视频| 亚洲人成高清| 妞干网视频在线观看| 欧美日韩中文| 日韩精品福利片午夜免费观看| 欧美电影一区| 中文字幕一区二区三区有限公司| 国产精品亚洲片在线播放| 蜜桃成人在线| 亚洲日产av中文字幕| 麻豆av一区二区三区| 香蕉久久夜色精品国产使用方法| 久久久一本精品99久久精品| 亚洲区小说区图片区qvod按摩| 麻豆精品视频| 久久av中文| 日韩动漫在线观看| 手机在线一区二区三区| 一区二区欧美日韩| 99成人超碰| 国产一区一区三区| 一区二区中文| 国产高清不卡无码视频| 欧美激情第8页| av一区二区三区免费观看| 国产精品第十页| 国产资源在线视频| 久久精品人人做人人爽电影蜜月| 日本三级免费网站| 日本在线播放一区二区三区| 日韩一区二区三区久久| 国模少妇一区二区三区| 能看毛片的网站| 成人美女在线视频| 欧美高清性xxxx| 国产亚洲短视频| 国产第一页精品| 一区二区三区欧美激情| 日韩欧美三级在线观看| 在线观看成人小视频| 国产男女无套免费网站| 欧美成人三级在线| 男人的天堂在线| 精品国产一区二区在线| 国产区美女在线| 日韩av免费一区| 懂色av色香蕉一区二区蜜桃| 国外成人在线视频网站| 精品久久久久久久| 一级性生活视频| 日精品一区二区| 伦伦影院午夜理论片| 久久综合成人精品亚洲另类欧美 | 亚洲国产中文字幕在线视频综合| 日本中文字幕第一页| 欧美电影在线免费观看| 国精品人妻无码一区二区三区喝尿| 亚洲色图av在线| 91亚洲天堂| 国产激情视频一区| 蜜桃在线一区| 色就是色欧美| 亚洲成人中文| 国产免费中文字幕| 91久色porny| 欧美激情图片小说| 色综合色狠狠天天综合色| 99精品视频免费看| 亚洲欧美三级伦理| 久草成色在线| 国产欧美日韩精品丝袜高跟鞋| 日韩高清电影免费| 日韩国产精品毛片| 琪琪一区二区三区| 国产肉体xxxx裸体784大胆| 亚洲欧美色综合| 中文av免费观看| 亚洲欧美另类国产| 成人bbav| 国产成人成网站在线播放青青| 久久精品国产68国产精品亚洲| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 欧美在线free| 午夜视频www| 欧美大片欧美激情性色a∨久久| 国产精品美女午夜爽爽| 欧美国产视频在线观看| 亚洲手机视频| 日本女人黄色片| 国产精品久久久久久久久久久免费看| √资源天堂中文在线| 欧美精品一区二区三区一线天视频| 麻豆tv免费在线观看| 国产精品视频久| 国产精品羞羞答答在线观看| 欧美a v在线播放| av网站一区二区三区| 久艹视频在线观看| 欧美一区二区三区四区在线观看 | 国产成人影院| 黑森林福利视频导航| 99久久99久久精品免费看蜜桃| 欧美精品色哟哟| 日韩片之四级片| 性欧美videos高清hd4k| 3d动漫啪啪精品一区二区免费| 国产精品成人av| 999久久久精品视频| 日韩一区中文字幕| ,一级淫片a看免费| www.久久久久| 2020国产精品小视频| 懂色av粉嫩av蜜臀av| 国产精品一区二区无线| 亚洲精品久久久久久国| 91.com在线观看| 成人欧美在线| 99re视频在线| 99精品国产一区二区青青牛奶| 亚洲色图欧美日韩| 欧美日韩国产色视频| 你懂的在线播放| 国产精品一区久久久| 午夜激情久久| 久久久久久无码精品人妻一区二区| 亚洲自拍偷拍麻豆| 秋霞网一区二区| 992tv成人免费视频| 免费av一区| 色国产在线视频| 亚洲精品国产一区二区三区四区在线| 国产视频在线一区| 久久久久国产精品免费网站| 欧美电影完整版在线观看| 欧美一级黄色片视频| 国产精品久久久久久久久免费丝袜| 99国产在线播放| 久久久久久com| 亚洲亚洲免费| 一区二区免费av| 亚洲一级二级在线| 日本韩国精品一区二区| 国产精品一区久久| 激情久久综合| 亚洲性猛交xxxx乱大交| 91麻豆精品国产91久久久久久| 爱看av在线| 亚洲午夜精品久久久中文影院av| 国产精品一区二区久激情瑜伽 | 精品久久久久久综合日本| 老牛影视一区二区三区| 97精品在线播放| 日韩精品中文字幕在线播放| 色成人综合网| 日韩av高清在线看片| 国产精品情趣视频| 欧美自拍偷拍第一页| 国产精品中文字幕在线| 亚洲午夜一级| 日本女人性生活视频| 亚洲精品98久久久久久中文字幕| 不卡亚洲精品| 精品国产一二三四区| 一区在线中文字幕| 日韩二区三区| 国产chinese精品一区二区| 日日噜噜夜夜狠狠视频欧美人| 久久久一区二区三区四区| 在线亚洲男人天堂|