调用随机超时的外部服务会终止 ASP.NET MVC 应用程序

Calling external services which randomly timeout kills the ASP.NET MVC application

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

建议 1

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

建议2

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

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

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