【问题标题】:WCF Service calling an external web service results in timeouts in heavy load environmentWCF 服务调用外部 Web 服务导致重负载环境中的超时
【发布时间】:2011-10-07 15:59:01
【问题描述】:

我有以下场景:

我们的 .NET 客户端调用我们的 WCF 服务,后者又调用外部第三方服务来检索一些数据。检索到数据后,我们的 WCF 服务会设置一些值,然后将控件返回给客户端。调用外部服务的过程必须是同步的。

我的问题是这一切都在低负载环境中工作,但是当负载变高时,我们开始排队多个请求,WCF 服务开始超时。我们已将绑定的“sendTimeout”属性设置为 5 秒,然后超时。

我尝试用模拟的本地版本替换外部服务,并且可以正常处理负载,但同时对外部服务的调用非常快 - 大约 0.5 秒。我只能假设发生超时是因为排队的请求太多,而 WCF 服务无法在分配的 5 秒内响应。

我尝试了以下方法:

  • 将 maxConcurrentCalls、maxConcurrentSessions 和 maxConcurrentInstances 的值设置为非常高的数字
  • 将 system.net - connectionManagement - maxconnection 的值设置为非常高的数字

有没有人知道我们可以在这个场景中做什么?

【问题讨论】:

  • 您的重负载条件是否也可能是外部服务的重负载?您是否尝试在相同的负载级别直接调用外部服务?
  • 我打算试试看。下次我周一回到办公室时会这样做。

标签: wcf


【解决方案1】:

在这些高负载时间您的 CPU 是否达到峰值?如果没有,那么您可能会用完线程。让你接收原始调用的wcf服务异步,然后异步调用外部服务。

您必须在整个调用链中使用 asnyc 模式,以确保没有任何东西阻塞线程。

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

【讨论】:

  • CPU 使用率确实在高负载时间附近达到峰值。我正在使用 Visual Studio 负载测试工具来复制它。我也尝试过使用 ContextMode 和 ConcurrencyMode 属性,但这也无济于事。
  • 如果 cpu 达到峰值,那么您已经达到了硬件阈值,您可以使用 Visual Studio Profiler(或其他一些)查看您的代码的哪一部分花费的时间最多
猜你喜欢
  • 2014-03-31
  • 2011-04-28
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多