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

Você está vendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
informações

Um proxy de API é uma interface para aplicativos clientes usados para se conectar a serviços de back-end. O Apigee Edge 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 sinal de atividade HTTP ou reutilização de conexão HTTP, é um conceito que permite que uma única conexão TCP envie e receba várias solicitações HTTP/respostas, em vez de abrir uma nova conexão para cada par de solicitação/resposta.

O Apigee Edge usa uma conexão permanente para se comunicar com 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 é 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 do sinal de atividade entre o Apigee Edge 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 (manter ativa) definindo a propriedade keepalive.timeout.millis como 0 na configuração do TargetEndpoint de um proxy de API específico ou definindo HTTPTransport.keepalive.timeout.millis como 0 nos processadores de mensagens porque isso afeta o desempenho.

No exemplo abaixo, a configuração TargetEndpoint desativa conexões persistentes (mantidas) para um serviço de back-end específico configurando 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 sinal de atividade forem desativadas para um ou mais serviços de back-end, o Edge 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, o Edge também executará um handshake SSL para cada nova solicitação, acrescentando a latência geral das solicitações de API.

Impacto

  • aumenta o tempo total de resposta das solicitações de API, porque o Apigee Edge 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 garante que o Apigee Edge possa processar automaticamente conexões persistentes ou não persistentes com serviços de back-end, sem exigir alterações no proxy de API.

Leia mais