分布式锁即在分布式环境下锁定共享资源,让请求处理串行化,实际表现为互斥锁。分布式锁能够解决业务中的幂等性问题。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接口,自然提供分布式锁的功能,只需申请锁,释放锁,不用关心锁的租期问题。分布式