分布式锁得作用:保证一个方法在同一时间内只能被同一个线程执行
方案:基于Redis实现分布式锁、 基于Zookeeper实现分布式锁、基于Etcd实现的分布式锁以及基于Consul实现的分布式锁
2.几种实现方式不同指标对比
2.1 硬件资源信息
操作系统 | 内存 | CPU |
---|---|---|
Linux | 11GB | 4C |
2.2 各项指标对比
为了测试分布式锁的四种实现方式(redis、zookeeper、consul、etcd)在同等机器资源情况下性能以及消耗情况
测试场景:使用两台centos机器(A/B)模拟两个锁争用客户端,设定时间为五分钟,两个客户端在这五分钟时间内争抢同一把锁。记录下每次抢锁耗时并且计算出平均耗时(T1/T2)。记录下两个客户端五分钟内各自获得锁次数(C1/C2)。
TPS = (C1+C2)/(5 * 60).
2.2.1 TPS指标对比
锁实现方式 | 执行次数 | 应用实例 | 最大TPS | 最小TPS | 平均TPS |
---|---|---|---|---|---|
Redis锁 | 10 | 2 | 3856 | 2777 | 2906 |
Zookeeper锁 | 10 | 2 | 1520 | 1492 | 1502 |
Etcd锁/自旋 | 10 | 2 | 210/284 | 208/321 | 208/305 |
Consul锁 | 10 | 2 | 262 | 255 | 258 |
2.2.2 获取锁时间
锁实现方式 | 执行次数 | 应用实例 | 平均均获取锁时间(s) |
---|---|---|---|
Redis锁 | 10 | 2 | 0.129 |
Zookeeper锁 | 10 | 2 | 0.457 |
Etcd锁/自旋 | 10 | 2 | 1.938 |
Consul锁 | 10 | 2 | 2.165 |
2.2.2 CPU使用率指标对比
锁实现方式 | 执行次数 | 应用实例 | CPU最高使用率% | CPU最低使用率% | 平均使用率% |
---|---|---|---|---|---|
Redis锁 | 10 | 2 | 40.3% | 1.2% | 15.6% |
Zookeeper锁 | 10 | 2 | 29.8% | 2.1% | 6.9% |
Etcd锁/自旋 | 10 | 2 | 46.7% | 0.6% | 5.3% |
Consul锁 | 10 | 2 | 36.4% | 0.8% | 9.66% |
2.2.3 Mem内存消耗对比
锁实现方式 | 执行次数 | 应用实例 | 最高内存消耗(MB) | 最低内存消耗% | 平均内存消耗% |
---|---|---|---|---|---|
Redis锁 | 10 | 2 | 863 | 24 | 421 |
Zookeeper锁 | 10 | 2 | 825 | 14 | 414 |
Etcd锁 | 10 | 2 | 819 | 18 | 417 |
Consul锁 | 10 | 2 | 830 | 12 | 418 |
3.分布式锁JMC检测情况
使用JMC监测每种分布式锁的执行情况。主要观察内存、CPU消耗情况,具体数据第二章节已经给出。本章主要关注热点方法,通过热点方法查看执行时间主要消耗在哪些地方。
ETCD:
Consul:
zookeeper
redis
其实性能要求高就选择redis分布式锁,为了高可用,稳定选择zk分布式锁更好些。
这个成本有限(比如测试机只有两台),效果可能不是特别明显。