从Azure连接到Redis抛出间歇性异常

时间:2012-10-05 06:10:50

标签: c# azure redis booksleeve

我有一个运行我的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

真的很感激任何帮助。

1 个答案:

答案 0 :(得分:2)

看一下代码,首先发生的事情是你似乎每次读操作都要创建一个连接。这不是必需的,并且可能对.net和redis产生负面影响:BookSleeve是多路复用器 - 设计以通过单个连接同时处理大量请求。当你调用Wait时,它只是阻塞的等待线程 - BookSleeve的内部将继续处理其他线程等。

此外,创建连接会产生很多开销:除了建立新TCP连接的成本之外,BookSleeve还需要与redis服务器通信,以找到正确操作所需的一些关键配置信息,因此始终建议重新使用单个共享连接或少量共享连接。