【问题标题】:Calling external services which randomly timeout kills the ASP.NET MVC application调用随机超时的外部服务会杀死 ASP.NET MVC 应用程序
【发布时间】:2015-03-17 08:55:42
【问题描述】:

所以我有这个 Web 应用程序(ASP.NET MVC 4 网站),它在任何时候都有至少 2,000 个在线用户。我的应用程序中最受欢迎的页面之一包含有关用户的数据,这些数据不在我的存储库中,它包含在一些集成到我的系统中的外部供应商中。因此,每当绘制此页面时,我都必须调用这些服务(目前有 17 个),然后根据它们提供的数据绘制页面。数据在任何给定时刻都会发生变化,因此我无法缓存它。大部分时间一切正常,CPU 利用率为 5% - 30%(当然取决于在线用户的数量)。对于每个服务调用,我有 5000 毫秒的超时(对于服务引用,我设置了 SendTimeout,对于原始的 HttpWebRequests',我将 TimeOut 属性设置为等于 5000 毫秒)现在假设一个服务已关闭,则我的服务器的 CPU 利用率出乎意料地低,如 3% - 8% 并且应用程序滞后,我的意思是加载页面(任何页面)需要一些时间,例如,如果在正常情况下我的应用程序的响应会花费(150-250ms) 现在需要 1-3 秒。我不知道该怎么做。我无法减少超时,因为某些服务有时需要 3-4 秒,所以 5 秒超时是我可以提供的租约。我能做些什么来防止延迟响应?我知道这有点笼统的问题。任何建议将不胜感激。提前致谢。

【问题讨论】:

    标签: c# asp.net timeout


    【解决方案1】:

    您的线程似乎有问题。太多线程正在等待外部服务的响应,它们无法处理其他请求。

    我建议你使用异步控制器:http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4

    【讨论】:

    • 这看起来很有希望。让我试试看。
    • 在我的测试用例中,应用程序的表现非常好,我完全没有看到响应缓慢。几天后,我将在生产服务器上进行尝试。非常感谢。感谢您的帮助。
    【解决方案2】:

    建议 1

    如果您将此数据复制到您的服务器会怎样? 这意味着您可以拥有另一项服务,该服务单独工作并将外部服务的数据与您的服务器同步......并且您的网站始终指向您的本地数据......对,这是某种缓存,网页可以显示旧数据...但您可以设置复制服务以根据需要经常检查数据...

    建议 2

    想到的另一个建议,你能用推送通知代替吗?所有网页都打开并等待,服务器检查数据,并通知所有客户端新鲜数据......这种情况下只有一个线程会忙于处理外部数据,所有打开的用户都会有新鲜数据因为它是可用的。作为起点,检查SignalR

    【讨论】:

    • 我也有这个想法,但数据确实会在任何毫秒内发生变化,因此 3 或 5 秒前的数据对用户来说至关重要。不过,我仍然牢记这个想法。
    • 这确实会减少占用的 I/O 线程数。我会记住这个建议。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多