Antipadrão: desativar conexões HTTP permanentes (sinal de atividade reutilizável)

Um proxy de API é uma interface para aplicativos clientes usados para se conectar a serviços de back-end. A Apigee oferece várias maneiras de se conectar a serviços de back-end por meio de um proxy de API:

Conexões persistentes

Conexão permanente HTTP, também chamada de keep-alive HTTP ou reutilização de conexão HTTP, é um conceito que permite apenas uma conexão TCP enviar e receber várias respostas/solicitações HTTP, em vez de abrir uma nova conexão para cada par de solicitação/resposta.

A Apigee usa conexão persistente para se comunicar com os serviços de back-end. Por padrão, uma conexão permanece ativa por 60 segundos. Ou seja, se uma conexão estiver inativa no pool por mais de 60 segundos, ela será encerrada.

O tempo limite de sinal de atividade é configurável por meio de uma propriedade chamada keepalive.timeout.millis, especificada na configuração do TargetEndpoint de um proxy de API. Por exemplo, o período de sinal de atividade 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 do sinal de atividade de um serviço de back-end específico em um proxy de API. Há também uma propriedade que controla o comportamento do sinal de atividade de todos os serviços de back-end em todos os proxies. O HTTPTransport.keepalive.timeout.millis é configurável no componente "Processador de mensagens". Essa propriedade também tem um valor padrão de 60 segundos. Fazer modificações nessa propriedade afeta o comportamento de conexão ativa entre a Apigee e todos os serviços de back-end em todos os proxies da API.

Antipadrão

Não é recomendável desativar as conexões persistentes (sinal de atividade) 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, porque isso afetará o desempenho.

No exemplo abaixo, a configuração TargetEndpoint desativa conexões permanentes (sinal de atividade) 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 conexões de atividade em tempo real estiverem desativadas para um ou mais serviços de back-end, a Apigee precisará abrir uma nova conexão para cada nova solicitação para os serviços de back-end de destino. Se o back-end for HTTPs, a Apigee também executará o handshake SSL para cada nova solicitação, adicionando à latência geral das solicitações de API.

Impacto

  • aumenta o tempo total de resposta das solicitações de API, porque a Apigee precisa abrir uma nova conexão e executar um handshake SSL para cada nova solicitação;
  • As conexões podem se esgotar em condições de alto tráfego, já que leva algum tempo para liberar conexões com o sistema.

Prática recomendada

  • Os serviços de back-end devem respeitar e processar a conexão permanente HTTP de acordo com os padrões HTTP 1.1.
  • Os serviços de back-end precisam responder com um cabeçalho Connection:keep-alive se puderem processar conexões permanentes (sinal de atividade).
  • Os serviços de back-end precisam responder com um cabeçalho Connection:close se não conseguirem lidar com conexões persistentes.

A implementação desse padrão garantirá que o Apigee Edge possa lidar automaticamente com uma conexão persistente ou não persistentes com serviços de back-end, sem exigir alterações no proxy de API.

Leitura adicional