我们将一个ASP.NET MVC应用程序部署到Azure网站,该网站连接到MongoDB并执行读写操作。应用程序迭代地执行此操作。每分钟几千次。
我们使用Autofac初始化C#驱动程序,并按照https://groups.google.com/forum/#!topic/mongodb-user/_Z8YepNHnbI和其他一些地方的建议将MaxConnectionIdleTime设置为45秒。
我们仍然收到大量以下错误:
无法从传输连接读取数据:连接 尝试失败,因为关联方没有正确回应 一段时间后,或建立连接失败,因为 连接主机未能响应。方法 消息:“:{”ClassName“:”System.IO.IOException“,”Message“:”无法 从传输连接读取数据:连接尝试失败 因为关联方在一段时间后没有正确回应 时间或已建立的连接因连接的主机而失败 没有回复。
我们在连接到Azure上同一数据中心/区域中的VM上部署的MongoDB实例时以及连接到外部PaaS MongoDB提供程序时都会收到此错误。
我在本地计算机上运行相同的代码并连接到同一个数据库,但我没有收到这些错误。只有当我将代码部署到Azure网站时才会这样。 有什么建议吗?
答案 0 :(得分:3)
每分钟几千个请求是一个大负载,唯一正确的方法是控制和限制任何时候可以运行的最大线程数。
由于没有发布关于您如何实施此信息的信息。我将介绍几种可能的情况。
常数:
变量:
数据传输率:
无论我们做什么,您每秒可以传输多少数据都会发挥作用,而且根据一天中的不同时间而变化。
我们唯一可以做的就是从不同的cpu发出更多请求,以分配我们重新发送的流量。
处理能力
我假设您在WebJob
中拥有此内容,而不是将其编码在MVC网站内。它非常低效,不适合您尝试实现的目的。通过使用WebJob,我们可以排队工作项以供其他WebJobs
处理。有问题的队列是Azure Queue Storage。
Azure队列存储是一种用于存储大量邮件的服务 可以通过身份验证从世界上任何地方访问 使用HTTP或HTTPS调用。单个队列消息最长可达64 KB 大小,队列可以包含数百万条消息,最多可达到总数 存储帐户的容量限制。存储帐户可以包含 到200 TB的blob,队列和表数据。请参阅Azure存储 可伸缩性和性能目标有关存储帐户的详细信息 容量。
队列存储的常见用途包括:
- 创建积压工作以异步处理
- 将消息从Azure Web角色传递到Azure Worker角色
问题:
解决方案:
WebJob
并将其命名为EnqueueJob
。此WebJob
只有一个目的,即在Queue Storage
中对要处理的工作项进行排队。 Queue Storage Container
的{{1}},此队列将作为下一步的触发器,启动我们的扩展操作。WorkItemQueue
的{{1}}。此WebJob
也只有一个目的,即将DequeueJob
的工作项出列,并将请求发送到您的数据存储。WebJob
内后,将WorkItemQueue
配置为启动,在每个项目上启动5个单独的线程,并且当队列不为空时,为每个线程取消工作项并尝试执行出队的工作。
DequeueJob
Here's a short 10 minute video概述了如何利用队列存储和Web作业。
修改强>
你可能会遇到这些错误的另一个原因可能是因为其他两个因素,这也是因为它出现在MVC应用程序中...
如果您在应用了WorkItemQueue
属性的情况下编译应用程序,而是推送了WorkItemQueue
版本,那么由于DEBUG
中的设置,您可能会遇到问题,如果没有RELEASE
属性,ASP.NET Web应用程序将运行最多90秒的请求,如果请求的时间超过此时间,它将处理请求。
要将超时时间延长至 90秒,您需要更改web.config
中的DEBUG
属性...
[httpRuntime][3]
您需要注意的另一件事是浏览器的请求超时设置>网络应用程序,我说如果你坚持将代码保存在MVC而不是提取它并将其放入WebJob,那么你可以使用以下代码将请求发送到你的网络应用程序并抵消请求超时。
web.config
答案 1 :(得分:0)
您是否在VM中使用mongoDB?这似乎是一个网络问题。应该发生这种瞬态故障,因此您可以做的最好是实现重试模式或使用像Polly这样的库来执行此操作:
Policy
.Handle<IOException>()
.Retry(3, (exception, retryCount) =>
{
// do something
});