【发布时间】: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