ASP.NET 大量并发下载

Posted

技术标签:

【中文标题】ASP.NET 大量并发下载【英文标题】:ASP.NET Large Number Of Concurrent Downloads 【发布时间】:2011-06-25 23:44:14 【问题描述】:

我目前有一个在线的网络应用程序,它有大约 500 个用户。我没想到的是,Web 应用程序在这样的负载下表现得很糟糕。访问任何页面都会导致几分钟的等待。基本上,每个用户在使用 Web 应用程序主要功能后都会调用一个进程,在该进程中我从另一个 Web 服务器读取几个字节,然后将该数据转发到用户浏览器。该页面运行正常,直到达到前面所述的大约 200-300 个并发下载进程的特定负载。

我正在使用 IIS 7.5 和 ASP.NET (4)。对于数据库访问,我使用 LINQ TO SQL。我已经调整了 IIS 并删除了任何限制,例如每个 cpu 的最大并发数等。在这种情况下,我失去了 IIS 配置有问题的希望。我担心的是我的代码会为 IIS 产生这样的结果,或者即使这样的方法也是导致这个问题的主要原因。

目前它的工作方式如下:

用户访问 EG.aspx

EG.aspx 使用 .NET HTTP Post 和 GET 请求向另一个 Web 服务器授权。

EG.aspx 打开一个流以从第二个 Web 服务器读取(文件下载)

EG.aspx 从第二个 Web 服务器读取 1024 字节并将这 1024 字节写入浏览器

所有标题等均已正确设置。在此过程中,我没有调用任何新线程。这只是执行所有这些步骤的一个很长的方法。文件下载非常大(大约 100MB)。在将此类文件传输给用户所需的所有时间内,页面正在运行上述过程。每个用户可以多次调用此过程(下载多个文件)。

流的数量有问题吗?有什么方法可以用另一种方法实现相同的结果(您的 Web 服务器下载文件并将其发送到客户端而不将它们缓存在磁盘上)?那会是什么方法?

【问题讨论】:

【参考方案1】:

Web 服务器——尤其是像 IIS 或 Apache 这样的厚 Web 服务器——实际上很快就会在并发用户数量上达到最大值。由于特性,ASP.NET 加剧了这一点。您需要做的是将这个过程卸载到客户端的 Web 请求之外以某种方式发生在您的服务器上。到达那里的最简单方法是使用某种消息总线,例如 MassTransit 或 NServiceBus。然后你可以让它像这样工作:

    用户请求 EG.ASPX EG.ASPX 在服务总线中创建一条消息并返回某种“处理请求”页面。 消息总线处理消息并下载文件或出现错误或其他任何情况。 以某种方式通知用户结果 - 有很多方法可以做到 - 他们的文件已准备好 用户访问相应页面以获取他们的文件。

对于通知,您可以通过以下几种方式进行处理:

如果这是一个非常短的事务,您可能会有一个“请稍候”页面执行 ajax pingback。 如果它运行时间较长,您可能希望在它准备好后向用户发送电子邮件。 如果您有用户门户页面,您可能可以在其中工作。

但是,归根结底,直接在您的 ASP.NET 页面中处理这个是非常愚蠢的。

【讨论】:

【参考方案2】:

您为什么不直接重定向到您正在下载的文件。目前,该文件正在从服务器移动到您的服务器,然后再到客户端。所以你有延迟进入那里玩。

您是否使用负载平衡?同时传输数百个 100MB 的文件对于单个服务器来说是很大的带宽。

【讨论】:

我无法直接访问这些文件,或者更准确地说,用户无法直接访问这些文件,因为我正在授权自己并为他们下载这些文件。服务器目前没有负载平衡,但我的预测是这样的负载可以由一个相当强大的服务器来处理。 cpu 最多使用 50%,带宽最多使用 20%,所有其他资源仍然几乎可用。【参考方案3】:

你不能把字节缓存一段时间吗?

将它们存储在静态字典中,使用锁定,您将看到巨大的性能提升。

【讨论】:

以上是关于ASP.NET 大量并发下载的主要内容,如果未能解决你的问题,请参考以下文章

在asp.net中向客户端导出大量数据

使用 ASP.NET 会话时是不是可以强制请求并发?

asp.net解决高并发的方案.

asp.net解决高并发的方案

asp.net 按钮单击未通过 jquery 在隐藏字段中触发大量数据

在 asp.net 核心中更新身份用户时并发失败