【发布时间】:2021-11-09 22:12:28
【问题描述】:
我正在开发一个通过 Servicestack 使用 Redis Sentinel 的项目。项目成立时,最初的开发人员使用 Redis 进行缓存和维护一系列为系统逻辑提供动力的队列。由于性能问题,我们计划启动一个新的 Redis Sentinel 盒子,并在一台服务器上完成缓存和在另一台服务器上完成排队的功能。
我能够对本地实例进行一些小的更改,我必须使用 RedisClient 和 PooledClient 在两个服务器之间拆分它
container.Register<IRedisClientsManager>(c => new RedisManagerPool(redCon, poolConfig));
container.Register<PooledRedisClientManager>(c => new PooledRedisClientManager(redCon2Test));
container.Register(c => c.Resolve<IRedisClientsManager>().GetClient());
container.Register(c => c.Resolve<PooledRedisClientManager>().GetClient());
// REDIS CACHE
container.Register(c => c.Resolve<PooledRedisClientManager>().GetCacheClient());
// SESSION
container.Register(c => new SessionFactory(c.Resolve<ICacheClient>()));
// REDIS MQ
container.Register<IMessageService>(c => new RedisMqServer(c.Resolve<IRedisClientsManager>())
{
DisablePriorityQueues = true,
DisablePublishingResponses = true,
RetryCount = 2
});
container.Register(q => q.Resolve<IMessageService>().MessageFactory);
this.RegisterHandlers(container.Resolve<IMessageService>() as RedisMqServer);
但问题是我没有在我使用的机器上设置 Redis Sentinel,当我尝试将 Sentinel 连接作为 PooledRedis 连接放入时,我在第二次启动时收到编译错误。它可以让我将其转换为 PooledRedisClientManager,但我不确定 Pooled vs Sentinel 是否可以很好地配合使用
if (useSentinel)
{
var hosts = redCon.Split(',');
var sentinel = new RedisSentinel(hosts, masterName)
{
RedisManagerFactory = CreateRedisManager,
ScanForOtherSentinels = false,
SentinelWorkerConnectTimeoutMs = 150,
OnWorkerError = OnWorkerError,
OnFailover = OnSentinelFailover,
OnSentinelMessageReceived = (x, y) => Log.Debug($"MSG: {x} DETAIL: {y}")
};
container.Register(c => sentinel.Start());
var hosts2 = redCon.Split(',');
var sentinel2 = new RedisSentinel(hosts2, masterName)
{
RedisManagerFactory = CreatePooledRedisClientManager,
ScanForOtherSentinels = false,
SentinelWorkerConnectTimeoutMs = 150,
OnWorkerError = OnWorkerError,
OnFailover = OnSentinelFailover,
OnSentinelMessageReceived = (x, y) => Log.Debug($"MSG: {x} DETAIL: {y}")
};
container.Register<PooledRedisClientManager>(c => sentinel2.Start());
}
但老实说,我不确定这是否是尝试解决此问题的正确方法。我什至应该使用 Pooled 管理器吗?有没有一种好方法可以在容器中注册两个不同的 Redis Sentinel 服务器并按照我尝试的方式拆分它们?
【问题讨论】:
标签: redis servicestack