Gerenciando conjuntos de conexões de rede (associações)
A partir do Windows 2000, o tempo de execução do RPC pode manter mais de uma conexão entre o cliente e o servidor. Isso facilita a operação em transportes que não dão suporte à alteração da identidade do cliente sem restabelecer a conexão, clientes multithread e clientes assíncronos. O conjunto de conexões entre um processo de cliente e um ponto de extremidade do servidor é chamado de associação na terminologia RPC. Entender as associações pode melhorar a implementação do RPC.
Em um cenário de identidade de cliente único de thread único, o RPC abre uma conexão entre um processo de cliente e um ponto de extremidade do servidor para fazer chamadas RPC. Quando uma chamada RPC síncrona é feita, o cliente envia a solicitação para o servidor nessa conexão e recebe a resposta nela também. Quando o número de threads que fazem chamadas RPC no processo do cliente aumenta, a identidade de segurança do cliente pode ser alterada. Quando as chamadas assíncronas/pipe são misturadas com chamadas síncronas no cliente, o RPC pode precisar de mais de uma conexão de rede. Todas as conexões no conjunto são colocadas em um pool de conexões chamado associação.
Uma chamada de procedimento remoto síncrono usa exclusivamente uma determinada conexão para estar em conformidade com os padrões RPC. Uma conexão usada por uma chamada RPC síncrona será considerada ocupada se uma solicitação tiver sido enviada, mas uma resposta não tiver sido recebida. Nenhum outro tráfego é permitido nessa conexão até que a resposta seja recebida. O tempo de execução RPC tenta multiplexar chamadas RPC assíncronas e de pipe na mesma conexão. Chamadas síncronas e assíncronas/pipe não podem ser misturadas na mesma conexão, o que significa que uma determinada conexão pode ser usada para chamadas RPC síncronas ou para chamadas RPC assíncronas/pipe.
O RPC tenta reutilizar agressivamente as conexões do pool. Quando uma nova chamada RPC é feita, o RPC tenta encontrar uma conexão adequada do pool e cria uma nova conexão somente se uma conexão adequada não puder ser encontrada. Para que uma conexão seja considerada adequada, ela deve:
- Seja do tipo apropriado (síncrono ou assíncrono/pipe).
- Seja livre.
- Tenha a mesma identidade de segurança que o identificador de associação no qual a chamada é feita. Se o acompanhamento dinâmico de identidade for usado, a identidade do identificador de associação será atualizada do token de thread no início da chamada. Se o rastreamento de identidade estático for usado, a identidade do cliente carimbada no identificador de associação será usada.
Quando a chamada for concluída, depois que a resposta for recebida, a conexão será marcada como gratuita e poderá ser usada para outras chamadas RPC.
A identidade de segurança em uma conexão não pode ser alterada. Por exemplo, se um grande número de chamadas para o mesmo servidor for feita em identidades de segurança diferentes, o número de conexões no pool de threads aumentará. A associação em si é contada por referência e, quando todas as referências se foram, ela para e fecha todas as conexões. Cada identificador de associação e cada identificador de contexto mantêm uma referência na associação. Quando todos são fechados, a associação desaparece. No Windows XP, as associações não desaparecem necessariamente imediatamente; eles podem permanecer por um curto período (o período de destino é de 20 segundos, mas o tempo de execução do RPC pode optar por atrasar a destruição da associação se nenhum thread estiver disponível para executar a tarefa). Se você não quiser que a associação permaneça ativa após o último identificador de associação/identificador de contexto ser fechado, use a opção RPC_C_OPT_DONT_LINGER para forçar o RPC Runtime a fechar imediatamente a conexão.