c# - Azure 上的 MongoDB 连接问题

标签 c# mongodb azure

我们将 ASP.NET MVC 应用程序部署到连接到 MongoDB 并执行读取和写入操作的 Azure 网站。应用程序以迭代方式执行此操作。每分钟几千次。

我们使用 Autofac 初始化 C# 驱动程序,并按照 https://groups.google.com/forum/#!topic/mongodb-user/_Z8YepNHnbI 中的建议将 MaxConnectionIdleTime 设置为 45 秒。和其他一些地方。

我们仍然收到大量以下错误:

Unable to read data from the transport connection: 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. Method Message:":{"ClassName":"System.IO.IOException","Message":"Unable to read data from the transport connection: 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.



我们在连接到 Azure 上同一数据中心/区域中部署在 VM 上的 MongoDB 实例以及连接到外部 PaaS MongoDB 提供程序时都会收到此错误。

我在本地计算机上运行相同的代码并连接到同一个数据库,但我没有收到这些错误。只有当我将代码部署到 Azure 网站时。
有什么建议吗?

最佳答案

每分钟几千个请求是 加载,也是正确执行此操作的唯一方法,是控制和限制可以在任何时间运行的最大线程数。

因为没有太多关于您如何实现这一点的信息。我将介绍几种可能的情况。

实验时间...

常量:

  • 要处理的项目:
  • 每秒 50 个,或者换句话说...
  • 每分钟 3,000,还有另一种看待它的方式...
  • 180,000 每小时

  • 变量:
  • 数据传输率:
  • 无论我们做什么,您每秒可以传输多少数据都将发挥作用,并且这将根据一天中的时间而有所不同。

    我们唯一能做的就是从不同的 cpu 发出更多请求,以分配我们发送回 n 的流量的权重。
  • 处理能力:
  • 我假设您在 WebJob 中有这个与在 MVC 站点内进行编码相反,它是自我编码的。它非常低效,不适合您要实现的目的。通过使用 WebJob,我们可以将工作项排入队列以供其他处理 WebJobs .有问题的队列是 Azure Queue Storage .

    Azure Queue storage is a service for storing large numbers of messages that can be accessed from anywhere in the world via authenticated calls using HTTP or HTTPS. A single queue message can be up to 64 KB in size, and a queue can contain millions of messages, up to the total capacity limit of a storage account. A storage account can contain up to 200 TB of blob, queue, and table data. See Azure Storage Scalability and Performance Targets for details about storage account capacity.

    Common uses of Queue storage include:

    • Creating a backlog of work to process asynchronously
    • Passing messages from an Azure Web role to an Azure Worker role

  • 问题:
  • 我们试图每秒完成 50 个事务,因此如果我们使用 50 个线程,每个事务应该在 1 秒内完成。我们的 45 秒暂停在这一点上没有任何意义。
  • 我们期望 50 个线程并发运行,并且所有线程都在一个 CPU 上每秒内完成。 (我在这里夸大了一点,只是为了说明一点......但是想象一下每秒下载 50 个文本文件。处理它,然后尝试将其发送给同事,希望他们甚至准备好捕获它)
  • 我们需要有一个重试逻辑,如果在 3 次尝试后仍未处理该项目,则需要将它们放回队列中。理想情况下,我们应该为服务器提供更多的时间来响应每次失败,而不仅仅是一秒钟,假设我们在第一次失败时给它休息 2 秒,然后是 4 秒,然后是 10 秒,这将大大增加我们坚持的几率/检索我们需要的数据。
  • 我们是 假设 我们的 MongoDb 每秒可以处理这个数量的请求。如果你还没有,开始寻找扩展它的方法,问题不在于它是一个 MongoDb,数据层可以是任何东西,事实上我们正在从最有可能导致您出现问题的单一来源。

  • 解决办法:
  • 设立WebJob并命名 EnqueueJob .此 WebJob将有一个唯一的目的,即在 Queue Storage 中排队要处理的工作项目。 .
  • 创建一个 Queue Storage Container命名 WorkItemQueue ,这个队列将作为下一步的触发器并开始我们的扩展操作。
  • 创建另一个 WebJob命名 DequeueJob .此 WebJob也将有一个唯一的目的,即从 WorkItemQueue 中取出工作项。并向您的数据存储发出请求。
  • 配置 DequeueJob将物品放入 WorkItemQueue 后旋转, 在每个线程上启动 5 个单独的线程,当队列不为空时,为每个线程出列工作项并尝试执行出列的作业。
  • 尝试 1,如果失败,请等待并重试。
  • 尝试 2,如果失败,请等待并重试。
  • 尝试 3,如果失败,将 item 排回 WorkItemQueue
  • 将您的网站配置为自动扩展到 x 数量的 CPU(请注意,您的网站和 Web 作业共享相同的资源)

  • Here's a short 10 minute video概述了如何利用队列存储和 Web 作业。

    编辑:

    您可能会收到这些错误的另一个原因也可能是因为其他两个因素,同样是由于它在 MVC 应用程序中...

    如果您使用 DEBUG 编译应用程序应用了属性但推送了 RELEASE版本相反,您可能会由于 web.config 中的设置而遇到问题。 ,没有 DEBUG属性,ASP.NET Web 应用程序将运行请求最多 90 秒,如果请求时间超过此时间,它将处理该请求。

    将超时增加到超过 90 秒 您需要更改 [httpRuntime][3]您的属性(property)web.config ...
    <!-- Increase timeout to five minutes -->
    <httpRuntime executionTimeout="300" />
    

    您需要注意的另一件事是浏览器 > Web 应用程序的请求超时设置,我想说的是,如果您坚持将代码保留在 MVC 中,而不是将其提取并放入 WebJob 中,那么您可以使用以下代码向您的 Web 应用发出请求并抵消请求的超时。
    string html = string.Empty;
    string uri = "http://google.com";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.Timeout = TimeSpan.FromMinutes(5);
    
    using (HttpWebResponse response = (HttpWebResonse)request.GetResponse())
    using (Stream stream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(stream))
    {
        html = reader.ReadToEnd();
    }
    

    关于c# - Azure 上的 MongoDB 连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28695879/

    相关文章:

    java - mongoDB:java.lang.InknownClassChangeError:实现类

    javascript - 范围错误 : Invalid array buffer length - Meteor JS

    azure - 如何减少 Application Insights 发送到服务器的跟踪日志量

    azure - 从 Windows 桌面应用程序调用具有 AD 授权的 Azure Function

    c# - 从生产代码中查找修订信息,允许链接到源代码

    c# - 为什么我可以更改私有(private)静态只读字段但不能更改公共(public)字段?

    c# - ASP.Net MVC 4 PUT 请求响应 409 - 冲突

    c# - 在 String.Split 操作中指定空格的最佳方式

    MongoDB - 按子文档匹配排序

    azure - 如何获取从 Azure Devops/VSTS/TFS 中的 "Windows Machine File Copy"任务复制的文件总数?