Início > WCF > Melhorando a performance dos Serviços WCF

Melhorando a performance dos Serviços WCF

19 de agosto de 2011 Deixe um comentário Go to comments

O WCF é a plataforma unificada de serviço da Microsoft .Net, e é a tecnologia adotada na criação e disponibilização de serviços. Eu já escrevi algumas coisas a respeito do mesmo, veja abaixo:

 E hoje nosso foco será entender um pouco de como melhorar a performance do WCF usando as configurações da própria tecnologia:

Concorrência e Instanciação:
O WCF disponibiliza algumas configurações que visam aumentar o rendimento dos serviços e o gerenciamento de memória, iremos ver aqui algumas delas:

InstanceMode: Após a requisição do cliente chegar no serviço, o mesmo poderá ter comportamentos diferentes na instanciação dos objetos dependentes na conversa (Request/Response) com o cliente. O WCF permite configurar a instanciação do serviço de 3 formas, sendo:

  • Modo de instanciação por chamada (Per-Call)
  • Modo de instanciação por Sessão (Per-Session)
  • Modo de instanciação Singleton (Per-Single).

Veja abaixo mais detalhes sobre cada um dos modos de instanciação:

Per-Session: Comportamento default dos serviços, ou seja, quando não há explicitamente um modo de instanciação definido. Uma instancia (criação de objetos) é criado na primeira requisição do cliente, e esses objetos são mantidos enquanto o cliente se comunica com as “N” operações do serviço.

Na imagem acima o Cliente B esta configurado com o  instanceMode Per-Session, enquanto os demais não, veja que ele possui uma instancia exclusiva para ele (instance 2) enquanto os demais compartilham a mesma instancia. A instance 2 irá durar enquanto a sessão do cliente estiver ativa, este comportamento é muito parecido com o objeto Session do Asp.Net.

Exemplo de implementação:

 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class Service1 : IService

 Per-Call: Indica que cada cliente que solicita o serviço terá seu próprio contexto (operationContext), independente se for a primeira ou a segunda vez que o cliente executa a operação do serviço.

Na imagem acima para cada requisição efetuada ao serviço um novo contexto de objetos é criado e posteriormente liberado no final da requisição, deduz que teremos um aumento no processamento e uma variação nos objetos alocados em memória.

Exemplo de implementação:

 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class Service1 : IService1

 Per-Single: Neste cenário, uma única instancia (criação dos objetos) será criado, e esta instancia atenderá todas as requisições lembrando muito o pattern Singleton.

Repare na imagem acima que uma única instancia foi criada e a mesma atende tanto a primeira requisição do cliente A, quanto as demais requisições (cliente B).

 Exemplo de implementação:

 [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class Service1 : IService1

ConcurrencyMode: Indica quais tipos de concorrência o serviço irá suportar,  ou seja, ao receber a requisição, o serviço deverá suportar o uso de paralelismo ou não para processar a requisição e devolver a resposta. O WCF suporta 3 configurações no comportamento do serviço (ServiceBehavior), são elas:

  • Modo de concorrência Single: Comportamento padrão do WCF quando um ConcurrencyMode não foi configurado, esta configuração indica que apenas uma thread por instancia do serviço, com esta configuração não é necessário efetuar nenhuma thread safety.
  • Modo de concorrência Reentrant: Indica que uma única thread pode chamar o serviço, no entanto, se esta thread estiver invocando outro serviço ou callback, o serviço poderá suportar outras threads.
  • Modo de concorrência Multiple: Indica que mais de uma thread pode chamar o serviço (paralelo).

 Configuração de Throttling no web.config: Por default o Service Host do WCF controla automaticamente as instancias possíveis para processar as solicitações do serviço. Em termos de perfomance é interessante deixar os valores default, uma vez que ele escala automaticamente a necessidade do servidor não forçando um estouro de memória ou de CPU no mesmo. Porém caso os valore default não te atendam você poderá altera-los de acordo com sua necessidade, apenas como uma recomendação é interessante considerar a capacidade do servidor em que a aplicação ficará hospedada antes de alterar o throttling do WCF.

 O WCF permite a alteração através de uma configuração chamada ServiceThrottling que contêm:

MaxConcurrentInstances – Controla as instancias que podem ser criadas pelo serviço, o valor default é o valor máximo do System.Int32 (int.MaxValue).

MaxConcurrentCall – Define o numero máximo de mensagens que podem ser encaminhadas ao serviço. A recomendação é o valor de 16 vezes o numero de processador da máquina.

MaxConcurrentSession: Usado para controlar o numero de sessões ativas no serviceHost, especialmente no uso de InstaceMode Per-Session.  A recomendação é 16 vezes o numero de processador da máquina que esta hospedando o serviço. Se qualquer uma destas definições de limite for atingido, não há nenhuma nova instancia/ thread/criação de sessão até que o anterior seja destruído.

 Exemplo de configuração no web.config:

            <serviceBehaviors>
                <behavior name=”MyService”>
                    <serviceMetadata
                      httpGetEnabled=”true”
                      httpGetUrl=”http://localhost:8000/MyService&#8221; />
                    <serviceDebug includeExceptionDetailInFaults=”true” />
                    <serviceThrottling
                      maxConcurrentCalls=”16″
                      maxConcurrentInstances=”26″
                      maxConcurrentSessions=”10″/>
                </behavior>
            </serviceBehaviors>

Mais referencias:

http://msdn.microsoft.com/en-us/library/ee377061(v=bts.10).aspx
http://blogs.msdn.com/b/wenlong/archive/2008/08/13/orcas-sp1-improvement-asynchronous-wcf-http-module-handler-for-iis7-for-better-server-scalability

 

Categorias:WCF
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: