redlock的大佬互撕 & 观后感

时间:2024-04-11 21:34:33

背景

相信看这个的人都了解一些通过redis实现的锁,基本原理这里就不在讨论了,随便一百度,应该有很多。基于redis实现分布式锁有个很著名的算法叫做redlock,有名的原因在于引起了分布式系统的大佬和redis作者的“热烈讨论”。

原文

Martin Kleppmann 的质疑贴
Antirez 的反击贴

各自观点

Martin的观点

由于网络的延迟、客户端系统的处理延迟(如gc)、机器时钟滞后的影响,锁依然会出现不准确性,具体看下图。
redlock的大佬互撕 & 观后感
对于这个问题可以通过fencing token来解决,例如:
t1 : client1 申请的锁具有token:10
t2: 在client1超时的情况下client2申请的锁具有token:11
t3:client1在写入storage的时候,storage系统根据token检查发现token10已经失效,会拒绝数据写入
而redlock并没有此机制,强烈依赖时间延迟方面的假设,不能作为严格的分布式锁使用,建议采用zookeeper来使用

Antirez反驳

观点太多大神就是不一样,简单说2个:
1 如果需要fenciing token来保证分布式锁,那直接用fecing token就好了也不需要分布式锁了,而且就token而言,redlock也有一个随机数token,几乎不可能出现重复;
2 承认了当前的系统时钟可能由于错误调整导致错误,后续会修改采用操作系统提供的单调增长的时间api;
后面又说了一堆,有兴趣的自己去看

观后感

  • 在设计系统时,能简化就简化,有更好的方案还是可以直接借鉴的,例如采用zk,这也是实际更常用的分布式锁
  • 神仙打架,谁也说服不了谁,但是因为redlock的复杂性以及redis持久性的难以保证,对于神仙的讨论,我谁都不占,占zookeeper