Práticas recomendadas para sessões confiáveis

Este tópico discute as melhores práticas para sessões confiáveis.

Configurando MaxTransferWindowSize

Sessões confiáveis no WCF (Windows Communication Foundation) usam uma janela de transferência para manter mensagens no cliente e no serviço. A propriedade configurável MaxTransferWindowSize indica a quantidade de mensagens contidas em uma janela de transferência.

No remetente, indica a quantidade de mensagens que pode conter uma janela de transferência enquanto aguarda confirmações. No receptor, indica quantas mensagens serão armazenadas em buffer para o serviço.

A escolha do tamanho certo afeta a eficiência da rede e a capacidade ideal do serviço. As seções abaixo especificam o que considerar ao escolher um valor para essa propriedade e o impacto do valor.

O tamanho da janela de transferência padrão é de oito mensagens.

Uso eficiente da rede

Nesse contexto, o termo rede corresponde a tudo usado como base de comunicação entre um cliente (remetente) e um serviço (receptor). Isso inclui as conexões de transporte e quaisquer intermediários ou pontes entre eles, incluindo roteadores SOAP ou proxies/firewalls HTTP.

O uso eficiente da rede garante que a capacidade de rede seja totalmente usada. Tanto a quantidade de dados que podem ser transferidos por em relação à rede (taxa de dados) quanto o tempo necessário para transferir dados do remetente para o receptor (latência) afetam a eficiência como a rede é utilizada.

No remetente, a propriedade MaxTransferWindowSize indica a quantidade de mensagens que podem ser contidas em sua janela de transferência enquanto aguarda confirmações. Se a latência de rede for alta e para garantir um remetente responsivo e uma utilização eficiente da rede, aumente o tamanho da janela de transferência.

Por exemplo, mesmo que o remetente mantenha a taxa de dados, a latência pode ser alta se existirem vários intermediários entre o remetente e o receptor ou os dados precisarem passar por um intermediário ou rede com perda. Portanto, o remetente precisa aguardar confirmações das mensagens em sua janela de transferência antes de aceitar novas mensagens para enviar eletronicamente. Quanto menor o buffer com alta latência, menor a eficiência na utilização da rede. Por outro lado, um tamanho de uma janela de transferência muito alto pode afetar o serviço porque o serviço pode precisar alcançar a alta taxa de dados enviados pelo cliente.

Executando o serviço para capacidade

Por mais que a rede seja usada com eficiência, é melhor que você também queira que o serviço seja executado com a capacidade ideal. A propriedade de tamanho da janela de transferência no receptor indica a quantidade de mensagens que o receptor pode armazenar em buffer. Esse buffer de mensagens ajuda não apenas o controle de fluxo de rede, mas também permite que o serviço seja executado com capacidade total. Por exemplo, se o buffer for uma mensagem e as mensagens chegarem mais rápido do que o serviço conseguir processar, a rede pode descartar mensagens e a capacidade pode ser desperdiçada ou subutilizada.

O uso de um buffer aumenta a disponibilidade do serviço à medida que recebe e armazena em buffer simultaneamente uma mensagem durante o processamento das mensagens recebidas anteriormente.

Recomendamos que você use o mesmo MaxTransferWindowSize no remetente e no receptor.

Habilitando o controle de fluxo

O controle de fluxo é um mecanismo que garante que o remetente e o receptor acompanhem um ao outro, ou seja, as mensagens são consumidas e executadas na mesma velocidade que são produzidas. O tamanho da janela de transferência no cliente e no serviço garante que o remetente e o receptor estejam dentro de uma janela de sincronização.

Recomendamos que você defina a propriedade FlowControlEnabled como true quando estiver usando uma sessão confiável entre um cliente WCF e um serviço WCF.

Definindo MaxPendingChannels

Ao escrever um serviço que permite comunicação de sessão confiável com diferentes clientes, é possível que muitos clientes estabeleçam uma sessão confiável para o serviço ao mesmo tempo. A resposta do serviço nessas situações depende da propriedade MaxPendingChannels.

Quando o remetente cria um canal de sessão confiável para um receptor, um handshake entre eles estabelece uma sessão confiável. Depois que a sessão confiável for estabelecida, o canal será colocado em uma fila de canais pendente para aceitação do serviço. A propriedade MaxPendingChannels indica quantos canais podem estar nesse estado.

É possível que o serviço esteja em um estado em que não possa aceitar mais canais. Se a fila estiver cheia, uma tentativa de estabelecer uma sessão confiável é rejeitada e o cliente deve tentar novamente.

Também é possível que os canais pendentes permaneçam na fila por mais tempo. Enquanto isso, pode ocorrer um tempo limite de inatividade na sessão confiável e o canal faz a transição para um estado com falha.

Ao escrever um serviço que atende vários clientes simultaneamente, você deve definir um valor adequado para suas necessidades. A definição de um valor muito alto para a propriedade MaxPendingChannels tem impacto no seu conjunto de trabalho.

O valor padrão para MaxPendingChannels é quatro canais.

Sessões confiáveis e hospedagem

Ao hospedar um serviço que usa sessões confiáveis, você deve considerar as seguintes questões importantes:

  • As sessões confiáveis têm estado e o estado é mantido no AppDomain. Isso significa que todas as mensagens que fazem parte de uma sessão confiável devem ser processadas no mesmo AppDomain. Web farms e web gardens onde o tamanho do farm ou garden é maior do que um nó, não podem garantir essa restrição.

  • Sessões confiáveis usando canais HTTP duplos (por exemplo, usando WsDualHttpBinding) podem exigir mais do que o padrão de duas conexões HTTP por cliente. Isso significa que uma sessão confiável duplex pode exigir até duas conexões em cada sentido, porque as mensagens simultâneas de aplicativo e protocolo podem ser transferidas em cada sentido a qualquer momento. Em algumas condições, dependendo do padrão de troca de mensagens do serviço, isso significa que é possível colocar em deadlock um serviço hospedado na Web usando sessões HTTP duplas e confiáveis. Para aumentar o número de conexões HTTP permitidas por cliente, adicione os itens a seguir ao arquivo de configuração relevante (por exemplo, web.config do serviço em questão):

    <configuration>
      <system.net>
        <connectionManagement>
          <add name="*" maxconnection="4" />
        </connectionManagement>
      </system.net>
    </configuration>
    

    O valor do atributo maxconnection é o número de conexões necessárias. Nesse caso, o mínimo deve ser quatro conexões.