RedisSentinelWorker 和 RedisPubSubServer 之间的 ServiceStack.Redis 关系

问题描述

说明:

很好奇RedisSentinelWorker和RedisPubSubServer是什么关系。

据我观察,即使有更多可用的哨兵主机,该库也最多保留 1 个活动哨兵连接。哨兵连接被封装在 RedisSentinelWorker 中,它在底层封装了 RedisPubSubServer。

困扰我的是 RedisSentinelWorker 和 RedisPubSubServer 实际上可能代表与两个不同哨兵的连接。

这就是发生这种情况的原因:

var sentinel = new RedisSentinel(new[] {"localhost:26380","localhost:26381","localhost:26382"});
var manager = sentinel.Start();

当我们到达 ServiceStack.Redis.RedisSentinelWorker.BeginListeningForConfigurationChanges 监听应该从哨兵 localhost:26380 开始。但是当您到达 ServiceStack.Redis.RedisPubSubServer.RunLoop 时 - 我们用来建立发布/订阅连接的实际哨兵实际上是 localhost:26381

发生这种情况是因为我们传递给 ClientsManagerRedisPubSubServer 对象下面的循环机制。在建立发布/订阅连接之前,我们实际上调用ClientsManager 两次。

  1. ServiceStack.Redis.RedisPubSubServer.Init获取服务器时间。它返回了 localhost:26380
  2. ServiceStack.Redis.RedisPubSubServer.RunLoop 内部实际建立订阅。它现在返回 localhost:26381

所以我的问题是:这是有意为之还是这是一个错误

解决方法

RedisPubSubServer 提供用于处理 Redis Pub/Sub 消息的托管 Pub/Sub Server

RedisSentinelWorker 使用 RedisPubSubServer 侦听哨兵消息,它正在考虑连接到任何可用的活动哨兵主机以获取哨兵消息事件,但我可以看到仅查看如何更直观在哨兵主机上,工作人员当前已配置,因此我更改了 this commit 中的行为,该行为将在下一个 v5.11 版本中可用。