Antipattern: desative as ligações HTTP persistentes (keep-alive reutilizáveis)

Está a ver a documentação do Apigee e do Apigee Hybrid.
Veja a documentação do Apigee Edge.

Um proxy de API é uma interface para aplicações cliente usada para estabelecer ligação a serviços de back-end. O Apigee oferece várias formas de se ligar a serviços de back-end através de um proxy de API:

Ligações persistentes

A ligação persistente HTTP, também denominada HTTP keep-alive ou reutilização de ligações HTTP, é um conceito que permite que uma única ligação TCP envie e receba várias pedidos/respostas HTTP, em vez de abrir uma nova ligação para cada par de pedido/resposta.

O Apigee usa uma ligação persistente para comunicar com os serviços de back-end. Uma ligação permanece ativa durante 60 segundos por predefinição. Ou seja, se uma ligação estiver inativa no conjunto de ligações durante mais de 60 segundos, a ligação é fechada.

O período de limite de tempo de manutenção ativo é configurável através de uma propriedade denominada keepalive.timeout.millis, especificada na configuração do TargetEndpoint de um proxy de API. Por exemplo, o período de tempo de manutenção ativo pode ser definido como 30 segundos para um serviço de back-end específico no TargetEndpoint.

No exemplo abaixo, o keepalive.timeout.millis está definido como 30 segundos na configuração do TargetEndpoint:

<!-- /antipatterns/examples/disable-persistent-connections-1.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">30000</Property>
    </Properties>
  </HTTPTargetConnection>Disable HTTP persistent (Reusable keep-alive) connections
</TargetEndpoint>

No exemplo acima, keepalive.timeout.millis controla o comportamento de manutenção ativo para um serviço de back-end específico num proxy de API. Também existe uma propriedade que controla o comportamento de manutenção ativa para todos os serviços de back-end em todos os proxies. O HTTPTransport.keepalive.timeout.millis é configurável no componente Message Processor. Esta propriedade também tem um valor predefinido de 60 segundos. Fazer modificações a esta propriedade afeta o comportamento da ligação de manutenção entre o Apigee e todos os serviços de back-end em todos os proxies de API.

Antipattern

Não recomendamos que desative as ligações persistentes (manter ativas) definindo a propriedade keepalive.timeout.millis como 0 na configuração TargetEndpoint de um proxy de API específico ou definindo HTTPTransport.keepalive.timeout.millis como 0 nos processadores de mensagens, uma vez que afeta o desempenho.

No exemplo abaixo, a configuração TargetEndpoint desativa as ligações persistentes (manter ativas) para um serviço de back-end específico definindo keepalive.timeout.millis como 0:

<!-- /antipatterns/examples/disable-persistent-connections-2.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">0</Property>
     </Properties>
  </HTTPTargetConnection>
</TargetEndpoint>

Se as ligações keep-alive estiverem desativadas para um ou mais serviços de back-end, o Apigee tem de abrir uma nova ligação para cada novo pedido aos serviços de back-end de destino. Se o back-end for HTTPS, o Apigee também realiza o handshake SSL para cada novo pedido, o que aumenta a latência geral dos pedidos de API.

Impacto

  • Aumenta o tempo de resposta geral dos pedidos de API, uma vez que o Apigee tem de abrir uma nova ligação e realizar a confirmação de SSL para cada novo pedido.
  • As ligações podem esgotar-se em condições de tráfego elevado, uma vez que demoram algum tempo a ser libertadas para o sistema.

Prática recomendada

  • Os serviços de back-end devem respeitar e processar a ligação persistente HTTP de acordo com as normas HTTP 1.1.
  • Os serviços de back-end devem responder com um cabeçalho Connection:keep-alive se forem capazes de processar ligações persistentes (manter ativas).
  • Os serviços de back-end devem responder com um cabeçalho Connection:close se não conseguirem processar ligações persistentes.

A implementação deste padrão garante que o Apigee pode processar automaticamente a ligação persistente ou não persistente com os serviços de back-end, sem exigir alterações ao proxy de API.

Leitura complementar