Антипаттерн: отключение постоянных подключений HTTP (keep-alive)

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Прокси-сервер API – это интерфейс для клиентских приложений, используемый для подключения к бэкенд-службам. Apigee Edge предлагает несколько способов подключения к серверным сервисам через прокси-сервер API:

Постоянные подключения

Постоянное HTTP-подключение, также называемое HTTP keep-alive или повторным использованием HTTP-подключения, – это концепция, которая позволяет одному TCP-подключению отправлять и получать несколько HTTP-запросов/ответов вместо того, чтобы открывать новое подключение для каждой пары запрос/ответ.

Apigee Edge использует постоянное подключение для связи с внутренними сервисами. По умолчанию подключение остается активным в течение 60 секунд. То есть если подключение в пуле подключений не используется более 60 секунд, оно закрывается.

Период ожидания активности можно настроить с помощью свойства keepalive.timeout.millis, указанного в конфигурации TargetEndpoint прокси API. Например, для определенного сервиса в TargetEndpoint можно задать период активности в 30 секунд.

В приведенном ниже примере для параметра keepalive.timeout.millis в конфигурации TargetEndpoint задано значение 30 секунд:

<!-- /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>

В приведенном выше примере параметр keepalive.timeout.millis управляет поведением keep-alive для определенной бэкенд-службы в прокси-сервере API. Также есть свойство, которое управляет поведением keep-alive для всех внутренних сервисов во всех прокси. Идентификатор HTTPTransport.keepalive.timeout.millis можно настроить в компоненте Message Processor. Значение по умолчанию для этого свойства – 60 секунд. Изменение этого свойства влияет на поведение постоянного подключения между Apigee Edge и всеми серверными сервисами во всех прокси API.

Антипаттерн

Отключать постоянные подключения (keep-alive), задавая для свойства keepalive.timeout.millis значение 0 в конфигурации TargetEndpoint определенного прокси API или задавая для свойства HTTPTransport.keepalive.timeout.millis значение 0 в процессорах сообщений, не рекомендуется, так как это повлияет на производительность.

В примере ниже конфигурация TargetEndpoint отключает постоянные подключения (keep alive) для определенной бэкенд-службы, задавая для параметра keepalive.timeout.millis значение 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>

Если для одной или нескольких бэкенд-служб отключены постоянные подключения, Edge должен открывать новое подключение для каждого нового запроса к целевой бэкенд-службе(-ам). Если серверная часть использует протокол HTTPS, Edge также будет выполнять подтверждение SSL для каждого нового запроса, что увеличит общую задержку запросов API.

Результат

  • Увеличивает общее время ответа на запросы API, поскольку Apigee Edge должен открывать новое подключение и выполнять рукопожатие SSL для каждого нового запроса.
  • При высокой нагрузке подключения могут быть исчерпаны, так как для возврата подключений в систему требуется некоторое время.

Рекомендации

  • Серверные службы должны поддерживать постоянное подключение HTTP в соответствии со стандартами HTTP 1.1.
  • Если серверные службы могут обрабатывать постоянные подключения, они должны отвечать с заголовком Connection:keep-alive.
  • Если внутренние сервисы не могут обрабатывать постоянные подключения, они должны отвечать с заголовком Connection:close.

Применение этого шаблона позволит Apigee Edge автоматически обрабатывать постоянные и непостоянные подключения к внутренним сервисам без необходимости вносить изменения в прокси-сервер API.

Дополнительные материалы