【问题标题】:WCF Stress Testing on large number of calls对大量调用进行 WCF 压力测试
【发布时间】:2015-03-17 17:47:50
【问题描述】:

我目前正在开发一个可以接收大量调用的安全 WCF 服务,例如超过 3000。我最初的方法是使用“异步”调用 web 服务方法,但是很快我意识到我需要使用 Task.WaitAll 来确保在执行退出之前成功进行所有调用。

但是,通过使用 WaitAll,我现在使服务超载,70% 的调用返回“CommunicationException”和“ServerTooBusyException”类型消息的组合。我已经查看了 WCF 限制选项,但仍然发现这些似乎没有任何直接影响,即(注意:在本地 IIS 上的此实例中,Web 服务正在本地运行)

<serviceThrottling 
    maxConcurrentCalls="4096" 
    maxConcurrentSessions="65536" 
    maxConcurrentInstances="2147483647"/>

同步运行 web 服务调用可以正常工作,但运行速度太慢,而且我并不担心等待来自 web 服务的任何回调 - 我实际上只需要“触发并忘记”这些对服务的调用。

这是我在客户端所做的一个粗略示例...

var numberOfIterations = 3000;
var allCalls = new List<Task>();

using (var service = new WebserviceServiceClient())
{
    for (var n = 0; n < numberOfIterations; n++)
    {
        var someObject = new SomeObject(DateTime.UtcNow);
        allCalls.Add(service.WebserviceMethodAsynch(SomeObject));
    }
}
Task.WaitAll(allCalls.ToArray());

谁能建议一种优雅的方法来从客户端轰炸 WCF Web 服务而不会造成大量失败的调用?

注意:一种方法是利用队列(在本例中为 Azure 队列),具有讽刺意味的是,被调用的服务在将对象添加到队列以由单独的、更密集的过程拾取之前执行一些小的预处理。

提前致谢

【问题讨论】:

  • 你们服务的并发模式是什么?另外,您是否使用单向操作?另外,您使用的是什么绑定?
  • 您是否可以选择将服务置于负载均衡器之后,并将多台服务器置于工作中?
  • 您似乎只有一个 Web 服务客户端。相反,您可以为每个线程创建一个。
  • @Tim - InstanceContext 是 PerCall,并发是 Single 虽然我尝试过 Multiple 没有任何惊人的差异。
  • @MikeGoodwin - 目前我正在本地测试这个,试图了解这是否是我对 IIS 的高期望以及它应该能够处理大量请求或我在代码级别做错了吗

标签: c# web-services wcf azure


【解决方案1】:

您的客户端和您的网络服务不在同一台机器上,对吧?无论如何,我相信您最好使用负载测试来实现您正在寻找的结果:

http://www.sandeepsnotes.com/2013/05/load-and-performance-testing-of-wcf.html

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2015-02-22
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多