GetClient调用上的Redis超时过期消息
我讨厌那些“信息不足”的问题。所以我会尽量提供详细的信息。在这种情况下,它是代码 服务器: 64位的 有三类: DbOperationContext.cs: PerRequestLifeTimeManager.cs: RedisRepository.cs 我们正在统一使用Redis 在这种情况下,我们得到了一个奇怪的信息: “Redis超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用中。” 我们检查了这些:GetClient调用上的Redis超时过期消息,redis,servicestack.redis,redisclient,Redis,servicestack.redis,Redisclient,我讨厌那些“信息不足”的问题。所以我会尽量提供详细的信息。在这种情况下,它是代码 服务器: 64位的 有三类: DbOperationContext.cs: PerRequestLifeTimeManager.cs: RedisRepository.cs 我们正在统一使用Redis 在这种情况下,我们得到了一个奇怪的信息: “Redis超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用中。” 我们检查了这些: 问题是配置问题 我们是否使用了错误的RedisServer.
- 问题是配置问题
- 我们是否使用了错误的RedisServer.exe
- 是否存在任何架构问题
服务器统计数据上没有被拒绝的连接问题(我已通过redis-cli.exe info命令进行了检查)我继续调试此问题,并在我的平台上修复了许多问题以避免此异常。以下是我为解决这个问题所做的工作: 执行摘要: 遇到此异常的人员应检查:
ObjectFactory.Configure(x=>
{
//在此AppDomain中将消息队列内容注册为Singleton
x、 For()
.Singleton()
.使用(BuildRedisClientsManager);
x、 For()
.Singleton()
.Use()
.Ctor().Is(i=>i.GetInstance())
.Ctor(“retryCount”).Is(2)
.Ctor().Is(TimeSpan.FromSeconds(5));
//从singleton IMessageService检索新的消息工厂
x、 For()
.Use(i=>i.GetInstance().MessageFactory);
});
我的“BuildRedisClientManager”函数如下所示:
private静态IRedisClientsManager BuildRedisClientsManager()
{
var appSettings=新的appSettings();
var redisClients=appSettings.Get(“redis服务器”,“redis.local:6379”).Split(',');
var redisFactory=新的PooledRedisClientManager(RedisClient);
redisFactory.ConnectTimeout=5;
redisFactory.IdleTimeOutSecs=30;
redisFactory.PoolTimeout=3;
返回工厂;
}
然后,在生成消息时,正确处理客户端是非常重要的,否则我们会遇到可怕的“超时过期”(感谢)。我有以下帮助程序代码向队列发送消息:
publicstaticvoidpublishmessage(T msg)
{
尝试
{
使用(var producer=GetMessageProducer())
{
制作人发布(msg);
}
}
捕获(例外情况除外)
{
//TODO:日志或其他什么…我不是为了避免向用户显示我们的MQ已损坏
}
}
私有静态IMessageQueueClient GetMessageProducer()
{
var producer=ObjectFactory.GetInstance()作为RedisMqServer;
var client=producer.CreateMessageQueueClient();
返回客户;
}
我希望这也能帮助解决您的问题。我以前见过类似的错误。为了修复它,我将redis.conf超时值设置为30,并将
PooledRedisClientManager.IdleTimeOutSecs
配置为30。这和你的情况不完全一样,但也许这是一个新的起点。我也犯了同样的错误。你找到解决办法了吗?System.TimeoutException:Redis超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中。在ServiceStack.Redis.PooledRedisClientManager.GetClient()中仍然没有解决方案,但有一个线索。。同时使用ReadonlyClient和Client似乎有问题。我也面临类似的问题。我有多个不同的ASP.net应用程序,连接到同一个redis服务器-一些应用程序可以工作,一些可以工作5分钟,然后开始抛出超时异常。redis实例上的信息报告了40个活动客户端,没有拒绝的连接。要尝试超时吗?除非你能在同一时间内解决它?嗨@nover,你用你在IoC注册的IMessageFactory做什么?干杯。事实上,我想我已经弄明白了——它是由ServiceStack基本服务类调用的。Hi@richardwhatever——IMessageFactory在SS中内部使用,并且(据我所知)如果您希望使用MQ模式,则需要注册:)