我们使用Autofac初始化C#驱动程序,我们将MaxConnectionIdleTime设置为45秒,如https://groups.google.com/forum/#!topic/mongodb-user/_Z8YepNHnbI和其他几个地方所述.
我们仍然收到以下大量错误:
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秒/或换句话说…
>每分钟3000次,还有一种方式来看看它…
>每小时18万
变量:
>数据传输率:
>每秒可以传输多少数据将会发挥作用,无论我们做什么,这将根据一天中的时间而变化.
我们唯一可以做的是消除来自不同cpu的更多请求,以分发我们发送的流量的重量.
>处理能力:
>我假设你有一个WebJob,而不是在MVC网站内部编码是自己的.它的效率非常低,不适合您想要实现的目的.通过使用WebJob,我们可以排列要由其他WebJob处理的工作项.问题的排队是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个线程同时运行,并且在一秒钟内,每秒钟完成一次. (我在这里夸张一点,只是想点一下,但是想象一下下载50个文本文件,处理它,然后尝试拍摄到一个同事,希望他们甚至准备好抓住它)
>我们需要有一个重试逻辑,如果3次尝试后没有处理该项,则需要将其重新放入队列.理想情况下,我们应该为服务器提供更多的时间来响应,而不是每次失败只有一秒钟,让我们说,在第一次失败的情况下给予2秒的休息,然后是4秒,然后是10秒,这将大大增加我们坚持的几率/检索我们需要的数据.
>我们假设我们的MongoDb可以每秒处理这个数量的请求.如果你还没有,开始寻找扩大规模的方法,问题并不在于它是一个MongoDb,数据层可能是什么,事实上,我们正在提出这个数量的请求一个单一的来源将是你最有可能的问题.
解决方案:
>设置一个WebJob并将其命名为EnqueueJob.这个WebJob将有一个唯一的目的,排队要在队列存储中处理的工作.
>创建名为WorkItemQueue的队列存储容器,该队列将作为下一步的触发器,并启动扩展操作.
>创建另一个名为DequeueJob的WebJob.这个WebJob也将有一个唯一的目的,将工作项从WorkItemQueue中出来,并将请求发布到您的数据存储.
>配置DequeueJob,一旦一个项目被放置在WorkItemQueue内,启动5个单独的线程,而队列不为空时,为每个线程出现工作项,并尝试执行出队作业.
>尝试1,如果失败,等待&重试.
>尝试2,等待&重试.
>尝试3,将项目排入WorkItemQueue
>将您的网站配置为自动调整x数量的cpu(请注意,您的网站和网络作业共享相同的资源)
Here’s a short 10 minute video概述了如何利用队列存储和Web作业.
编辑:
另一个原因可能是因为另外两个因素,这些错误可能是因为它在一个MVC应用程序…
如果您正在使用DEBUG属性编译应用程序,而是推送RELEASE版本,则由于web.config中的设置,您可能会遇到问题,而不使用DEBUG属性,ASP.NET Web应用程序将运行请求最长为90秒,如果请求比此更长,它将处理请求.
要将超时时间延长到90秒以上,您需要更改web.config中的[httpRuntime] [3]属性…
<!-- Increase timeout to five minutes --> <httpRuntime executionTimeout="300" />
您需要注意的另一件事是您的浏览器的请求超时设置>网络应用程序,我会说,如果你坚持在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(); }