我们的应用服务器体系结构设置了一种方式,即所有服务调用都通过定制的 WCF 服务路由器进行 - 一个单一的服务将请求分配到适当的服务中,使用嵌入在请求消息头中的信息。
我们在使用此 WCF 服务路由器时遇到性能问题(在并发用户负载测试时超时)。我们想知道这是否是路由器中的错误,我们是否错误地配置了服务/IIS或者这是可以预料的 - 每个调用都经过单一的服务听起来像是潜在的瓶颈。
没有路由时,我们可以处理大约120个并发用户,然后出现超时错误,虽然我们会出现超时错误,但 IIS 仍然可以处理请求。而与路由器一起使用时,IIS 在大约20个并发用户处停止处理请求,并且在其余的负载测试期间始终不会恢复处理任何请求。
我们的主要问题是,在使用服务路由器时,这是否是可以预期的,或者根据我们的设置,IIS 是否能够处理此负载?
路由服务看起来是这样的:
实现方式如下:
我们在使用此 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)
{
// ...
}
}
}
}