我有一个负载平衡服务,它需要向3d方应用程序使用令牌进行身份验证,并在分布式缓存中记住令牌(可以同时打开的会话数量有限,我不希望每个负载平衡节点都有一个会话,而只是一个会话)。
为了实现这个目标,我需要确保一次只有一个节点执行身份验证(可以接受的是,一次只能有多个调用)。为此,我打算将redis锁与这里描述的单个示例一起使用。
对于无法获取锁的节点,一种常见的方法是执行自旋锁(例如,每隔100ms检查锁是否可用)。现在在我的情况下,我并不需要锁,而是应该由首先获取锁的进程在缓存中设置的令牌。使用自旋锁的方法有一些缺点:-redis/网络上的额外负载-额外的不可忽略的延迟,因为我们等待的时间超过了需要的时间
我计划通过在redis中使用subscribe特性来解决这个问题,如下所示:
检查令牌是否可用
如果没有:检查是否可以获取锁以打开会话
如果锁不可用:订阅硬编码通道
检查令牌是否可用(如果在我们订阅之前就设置了,则捕获罕见的情况)
如果没有:等待订阅频道上的消息
设置密钥的进程还将向相同的硬编码通道发送一个发布,以便等待令牌的每个人都能立即获得它。
据我所知,这应该工作得很好,开销比自旋锁要少,但也许有一些事情我没有考虑到,这使得这种方法是一个坏主意?
暂无答案!
目前还没有任何答案,快来回答吧!