ServiceStack.Redis RedisSentinelWorker 和 RedisPubSubServer 之间的关系

ServiceStack.Redis relationship between RedisSentinelWorker and RedisPubSubServer

描述:

我很好奇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 监听应该从 sentinel localhost:26380 开始。但是当你到达 ServiceStack.Redis.RedisPubSubServer.RunLoop - 我们用来建立 pub/sub 连接的实际哨兵实际上是 localhost:26381.

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

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

所以我的问题是:这是故意的还是这是一个错误?

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

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