分佈式鎖即在分佈式環境下鎖定共享資源,讓請求處理串行化,實際表現爲互斥鎖。分佈式鎖能夠解決業務中的冪等性問題。git
在用戶對商品下單的時候,若是商戶正在對商品改價,同時用戶正在支付,就可能發生併發問題,這個時候就須要串行化操做,防止出現業務問題。redis
分佈式鎖要解決的幾個問題:算法
分佈式鎖設計目標:安全
參考我早先寫的Redis實現分佈式鎖bash
set key value [EX seconds] [PX milliseconds] [NX|XX]
複製代碼
官方建議redis使用redlock算法來保證,可是redlock算法至少須要3臺redis主從實例來完成,維護成本高,redlock至關於本身實現簡單的一致性協議,細節繁瑣,且容易出錯。關於redLock算法,參考redis分佈式鎖官方介紹服務器
redis | zookeeker | etcd | |
---|---|---|---|
一致性算法 | 無 | paxos/ZAB | raft |
CAP | AP | CP | CP/AP |
高可用 | 主從 | N+1可用(奇數個) | N+1可用 |
接口類型 | 客戶端 | 客戶端 | http/grpc |
實現 | set命令 | 臨時節點 | restful API |
關於分佈式一致性協議,參考我以前的整理:幾種常見的分佈式一致性協議介紹restful
基於ectd的分佈式鎖流程:網絡
產品要想真正投入使用,要作一些兼容性測試:併發
etcdV3版本提供gRPC接口,自然提供分佈式鎖的功能,只需申請鎖,釋放鎖,不用關心鎖的租期問題。分佈式