【问题标题】:Connecting to Redis from Azure throwing Intermittent Exceptions从 Azure 连接到 Redis 引发间歇性异常
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2017-12-06
    • 2018-09-17
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多