我们的应用程序服务器体系结构已设置为每个服务调用都通过自定义构建的WCF服务路由器 - 一种服务,使用请求消息头中嵌入的信息将传入请求分发到适当的服务。
我们遇到使用此WCF服务路由器的性能问题(使用并发用户进行负载测试时出现超时)。我们想知道这是不是因为路由器中存在错误,我们将服务/ IIS配置错误或者是否预期 - 每次通过单个服务的呼叫听起来像是一个潜在的瓶颈。
如果没有路由,我们可以在获得超时错误之前处理大约120个并发用户,虽然我们得到超时但IIS仍然处理请求。使用路由器,IIS停止处理大约20个并发用户的请求,并且从不在其余的负载测试中恢复处理任何请求。
我们的主要问题是,在使用服务路由器时是否应该这样做,或者IIS是否能够按照我们设置的方式处理此负载?
路由服务如下所示:
/// <summary>
/// Generic service contract which can accept any WCF message.
/// </summary>
[ServiceContract]
public interface IServiceRouter
{
[OperationContract(Action = "*", ReplyAction = "*", AsyncPattern=false)]
Message ProcessMessage(Message requestMessage);
}
实施:
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.PerCall,
ConcurrencyMode = ConcurrencyMode.Multiple,
AddressFilterMode = AddressFilterMode.Any,
ValidateMustUnderstand = false)]
public sealed class ServiceRouter : IServiceRouter
ProcessMessage操作:
public Message ProcessMessage(Message requestMessage)
{
//Figure out the url of the downstream service
string serviceName = requestMessage.Headers.GetHeader<String>(ServiceNameMessageHeader, String.Empty);
string url = String.Format(_destinationUrlFormat, _destinationAppName, _destinationAppVersion, serviceName);
EndpointAddress endpointAddress = new EndpointAddress(url);
using (ChannelFactory<IServiceRouter> factory = new ChannelFactory<IServiceRouter>(_binding, endpointAddress))
{
factory.Endpoint.Behaviors.Add(new MustUnderstandBehavior(false));
IServiceRouter proxy = factory.CreateChannel();
using (proxy as IDisposable)
{
try
{
IClientChannel clientChannel = proxy as IClientChannel;
// invoke service
Message responseMessage = proxy.ProcessMessage(requestMessage);
return responseMessage;
}
catch (Exception ex)
{
// ...
}
}
}
}
答案 0 :(得分:2)
不应该期望WCF服务会给你带来如此大的瓶颈,但是当我们不确切地知道你的WCF服务做什么,也不确定它是如何配置时,很难给出确切的答案,但是你说:
如果没有路由,我们可以处理大约120个并发用户 获得超时错误,虽然我们得到超时,IIS保持 处理请求。使用路由器,IIS停止处理请求 有大约20个并发用户,从不恢复处理任何请求 在其余的负载测试中。
我认为您已经回答了有关WCF服务导致问题的问题。您显然需要检查它的配置,运行方式以及它对“路由”的作用。
修改的
查看一些可能影响WCF性能的问题here。
答案 1 :(得分:0)
看起来我们的问题在于IIS上的应用程序池,因为路由服务及其路由到的服务使用相同的应用程序池发生了以下情况:IIS为进入路由器服务的请求创建了线程。路由服务向路由到IIS创建新线程的服务发出请求 - 工作正常,直到没有更多可用线程和路由服务请求等待IIS处理其请求的所有线程,即IIS得到僵持。