【问题标题】:Why request latency increases when adding more async requests, resulting in ridiculous load time?为什么添加更多异步请求时请求延迟会增加,导致加载时间荒谬?
【发布时间】:2015-03-01 06:13:38
【问题描述】:

我的 MVC 应用程序基本上是 1 个主视图和多个部分视图。 我在一个异步加载局部视图的最小页面上有这个小脚本:

<script>
    $(function () {
        $('#bookmarks').load('Home/Bookmarks');
        $('#calendar').load('Home/Calendar');
        $('#gmail').load('Home/Gmail');
        $('#weather').load('Home/Weather');
        $("#news").load("Home/News");
    }
</script>

当我全部评论时,我得到了这个(加载速度非常快):

现在我只取消注释“书签”请求(只是从本地驱动器读取小的 JSON 文件),我得到了这个(书签需要 9 毫秒):

现在我取消注释“日历”请求(Google 日历 API),我明白了(如果请求是异步的,为什么书签延迟会从 9 毫秒跳到 1.04 秒?):

现在我取消注释“Gmail”请求(Google Gmail API),我得到了这个(书签延迟再次从 1.04 秒跳到 1.53 秒?):

现在我取消注释其余部分(“Gmail”、“天气”和“新闻”请求),我得到了这些疯狂增加的延迟,书签请求现在需要 5 秒来执行,而不是 9 毫秒 - 为什么?):

您可以看到每个操作的延迟增加 - 看起来这些 ajax 请求根本不是异步的 :( 当 AJAX 默认应该是异步的时,这怎么可能?

我确定我在这里遗漏了一些东西,可能 jQuery 加载函数不是异步的,但它是 javascript 大小的,并且延迟在服务器端。我现在很困惑。

更新:显然 jQuery 调用是异步的,所有加载函数都是同时执行的。这很容易。问题出在服务器端。在进行了一些测试之后,很明显IIS 会按照从浏览器接收到这些请求的顺序一个接一个地同步执行这些请求。我在 IIS 上做了一些额外的阅读,默认情况下 IIS apppool 只有 1 个正在使用的工作进程,它可以触发多个线程来处理所有这些请求。 但由于某种原因,请求是按顺序而不是并行处理的。我还没有找到为什么(如果 AppPool 工作进程可以启动多个线程以同时处理)请求仍然按顺序执行,以及如何使这些请求并行处理,甚至是否可能。如果有人知道如何使事情正常工作,我真的很想听听。谢谢。

更新 多看几遍,发现如果启用了Session,请求是按顺序处理的。会话对象是单线程对象。会话对象不能同时被两个线程共享。因此,当对同一个会话有两个请求时,一个会排队,而另一个会话对象正在使用中。这很糟糕 :( 有什么建议吗,IIS 专家?:)

已解决 是的,会话状态是问题所在!我在 web.config 中禁用了会话状态并删除了使用 Session 对象的一行以避免运行时错误。现在一切都很完美。真正的问题确实是 - 会话状态绑定到单个线程,因此在服务器端我的应用程序表现得像一个旧的 STA 放屁:)

http://msdn.microsoft.com/en-us/library/ms178581.aspx

并发请求和会话状态

对 ASP.NET 会话状态的访问是每个会话独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果对同一个会话(通过使用相同的 SessionID 值)发出两个并发请求,则第一个请求将获得对会话信息的独占访问权。第二个请求只有在第一个请求完成后才会执行。(如果第一个请求超过了锁定超时,释放了对信息的排他锁,第二个会话也可以获得访问权限。)如果 EnableSessionState 中的值@Page 指令设置为 ReadOnly,对只读会话信息的请求不会导致对会话数据的排他锁。但是,会话数据的只读请求可能仍需要等待会话数据的读写请求设置的锁定清除。

【问题讨论】:

    标签: ajax model-view-controller google-oauth


    【解决方案1】:

    又看了一些,发现请求处理完毕 如果启用了会话,则按顺序进行。会话对象是单个 线程对象。会话对象不能被两个线程共享 同时地。因此,当同一会话有两个请求时 一个在另一个正在使用会话对象时排队。这 糟透了:(有什么建议吗,IIS专家?:)

    不要使用Session。我很少找到可以证明使用Session 的案例,而且通常很容易找到没有您遇到的可扩展性限制的存储替代品。

    【讨论】:

    • 是的,这就是问题所在!我在 web.config 中禁用了会话状态,并删除了使用 Session 对象以避免运行时错误的那一行。现在一切都很完美。真正的问题确实是 - 会话状态绑定到单个线程,因此在服务器端我的应用程序表现得像一个旧的 STA 放屁 :) 谢谢伙计!
    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多