我正在寻找在Azure上的Redis中为我们的多实例工作者角色创建分布式锁。我需要一种创建“关键部分”的方法,只有一个线程可以跨工作者角色的多个实例一次访问。
我正在使用StackExchange.Redis客户端执行此操作,并且有用的是,它具有事务TakeLock\ReleaseLock
already的实现,并且SO上的this answer让我对要使用的模式以及有关如何创建锁的详细信息。
进一步阅读这个主题,我还阅读了这个Redis article regarding distlock,它描述了在尝试实现分布式锁机制时基于故障转移的 Redis节点的弱点。
Azure Redis缓存实现主/从故障转移(除了基本层),因此这意味着我需要实现 redlock 模式以保证只有一件事将永远拥有锁?
另外,我想知道:
答案 0 :(得分:3)
我是您在问题中链接的RedLock.net库的作者。文档指定连接到独立redis实例的原因基于Redis Distlock documentation中的推理。通过强制只写入主节点,我们希望避免用户可能错误配置Redlock以连接到多个复制主机的情况。
根据Azure Redis Cache 103 - Failover and Monitoring,Azure Redis缓存(标准层及更高层)前面有一个负载均衡器,可确保您始终连接到主服务器。
连接到多个redis实例(复制或不复制)应该可以很好地保证两个进程不会同时运行(比单个复制实例更多)。
为了让其他流程能够“窃取”在第一个完成之前的锁定,超过一半的独立redis实例将需要丢失其锁定密钥(例如,通过重新启动而没有持久性),然后让进程2获得锁定,然后进程中的计时器在其扩展计时器期间重新获取它