Práticas recomendadas para sessões confiáveis

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

Definindo MaxTransferWindowSize

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

No remetente, isso indica quantas mensagens a janela de transferência pode conter enquanto aguarda confirmações; no recetor, ele indica quantas mensagens devem ser 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 a seguir detalham o que considerar ao escolher um valor para essa propriedade e o impacto do valor.

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

Utilização eficiente da rede

Neste contexto, o termo rede corresponde a tudo o que é utilizado como base de comunicação entre um cliente (emissor) e um serviço (recetor). Isso inclui as conexões de transporte e qualquer intermediário ou pontes intermediárias, incluindo roteadores SOAP ou proxies/firewalls HTTP.

A utilização eficiente da rede garante que a capacidade da rede é plenamente utilizada. Tanto a quantidade de dados que podem ser transferidos por segundo através da rede (taxa de dados) e o tempo que leva para transferir dados do emissor para o recetor (latência) afetam a eficácia com que a rede é utilizada.

No remetente, a propriedade MaxTransferWindowSize indica quantas mensagens sua janela de transferência pode conter enquanto aguarda confirmações. Se a latência da rede for alta e para garantir um remetente responsivo e uma utilização eficaz da rede, você deve aumentar o tamanho da janela de transferência.

Por exemplo, mesmo que o remetente acompanhe a taxa de dados, a latência pode ser elevada se existirem vários intermediários entre o emissor e o destinatário ou se os dados tiverem de passar por um intermediário ou rede com perdas. Assim, o remetente tem que esperar por confirmações para as mensagens em sua janela de transferência antes de aceitar novas mensagens para enviar no fio. Quanto menor o buffer com alta latência, menos eficaz será a utilização da rede. Por outro lado, um tamanho de 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 até a capacidade

Por mais que a rede seja usada de forma eficiente, o ideal é que você também queira que o serviço funcione na capacidade ideal. A propriedade de tamanho da janela de transferência no recetor indica quantas mensagens o recetor 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 até a capacidade total. Por exemplo, se o buffer for uma mensagem e as mensagens chegarem mais rápido do que o serviço pode processá-las, a rede poderá descartar mensagens e a capacidade poderá ser desperdiçada ou subutilizada.

O uso de um buffer aumenta a disponibilidade do serviço, pois ele 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 destinatário.

Habilitando o controle de fluxo

O controle de fluxo é um mecanismo que garante que o emissor e o recetor acompanhem um ao outro, ou seja, as mensagens são consumidas e acionadas tão rápido quanto são produzidas. O tamanho da janela de transferência no cliente e serviço garante que o emissor e o recetor estejam dentro de uma janela razoável de sincronização.

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

Configuração MaxPendingChannels

Ao escrever um serviço que permite uma comunicação de sessão confiável de 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 nestas situações depende do MaxPendingChannels imóvel.

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

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

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

Ao escrever um serviço que atenda vários clientes simultaneamente, você deve definir um valor adequado às suas necessidades. Definir um valor muito alto para a MaxPendingChannels propriedade afeta seu conjunto de trabalho.

O valor padrão para MaxPendingChannels é quatro canais.

Sessões e hospedagem confiáveis

Ao hospedar um serviço que usa sessões confiáveis, você deve ter em mente as seguintes considerações importantes:

  • As sessões confiáveis têm monitoração de 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 jardim é maior 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 duplex confiável pode exigir até duas conexões em cada sentido, porque mensagens simultâneas de aplicativo e protocolo podem ser transferidas de cada maneira a qualquer momento. Sob certas condições, dependendo do padrão de troca de mensagens do serviço, isso significa que é possível bloquear um serviço hospedado na Web usando HTTP duplo e sessões confiáveis. Para aumentar o número de conexões HTTP permitidas por cliente, adicione o seguinte 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 maxconnection atributo é o número de conexões necessárias. O mínimo, neste caso, deve ser de quatro conexões.