【发布时间】:2012-10-06 14:26:25
【问题描述】:
我有一个运行我的 C# 应用程序的 Windows Azure 服务器。它分布在 4 个中型实例上,我使用 Redis 进行 L2 缓存。该应用程序正在处理相当数量的流量(每天大约 300,000 次浏览量)。我正在使用 BookSleeve 进行 redis 连接,在应用程序启动并运行后,它将开始从 BookSleeve 抛出 SocketExceptions 大约每分钟四次。确切的例外是:
Exception type: System.Net.Sockets.SocketException
Exception message: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
这似乎只发生在我从服务器读取内容时:
using (var connection = ConnectionGateway.GetReadConnection())
{
var task = connection.Hashes.GetString(App.RedisDatabase, CacheKeys.My_KEY);
var result = connection.Wait(task);
}
我的 GetReadConnection 设置如下:
public static RedisConnection GetReadConnection()
{
RedisConnection conn = getNewConnection();
try
{
var openAsync = conn.Open();
conn.Wait(openAsync);
return conn;
}
catch (SocketException ex)
{
throw new Exception(RedisConnectionFailed, ex);
}
}
现在我所有的写入都像作者描述的那样共享一个连接,所以这只发生在需要使用 connection.Wait() 的读取上。这一切似乎都很好。写入使用类似于Maintaining an open Redis connection using BookSleeve的代码
我已尝试更改 Redis 服务器的超时以说明 Azure 负载均衡器,但没有成功。我已经尝试过设置超时 30 和设置超时 0,如下所述:Redis connection errors when using Booksleeve Redis client in Azure VM
任何帮助将不胜感激。
【问题讨论】:
-
您是否在每次通话时都打开一个连接?这可能非常相关......
-
我认为有人提到,如果您不使用等待,那么您将建立一个大规模共享连接。但是,如果您正在使用等待,则需要在每次通话时建立连接。因此,我对 redis 的所有写入都使用一个共享连接,但是读取,因为它们使用 wait 使用上面的代码在每次调用时实例化一个连接。
-
不,根本不是这样。当您使用 Wait 时,它会继续多路复用所有其他线程。所发生的只是想要一个结果的线程暂停,直到 对该请求的回答返回 - 它仍在同时处理所有其他请求。这几乎是关键的设计方法。对于stackoverflow,我们使用一个连接所有。导致多路复用器出现问题的主要原因是事务。我的建议:尝试通过共享连接进行读取 - 看看问题是否消失。
-
非常有趣。我将尝试将其部署到生产中,看看它是否能解决问题。感谢您的快速回复。
-
我的主要想法是 .net 和 redis 的持续连接饱和可能会导致严重问题
标签: c# azure redis booksleeve