Антипаттерн: Отключить постоянные HTTP-соединения (повторно используемые keep-alive)

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

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

Постоянные соединения

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

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

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

В приведенном ниже примере параметр 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 управляет поведением поддержания соединения для конкретного бэкэнд-сервиса в API-прокси. Существует также свойство, которое управляет поведением поддержания соединения для всех бэкэнд-сервисов во всех прокси. Параметр HTTPTransport.keepalive.timeout.millis можно настроить в компоненте Message Processor. Значение этого свойства по умолчанию составляет 60 секунд. Любые изменения этого свойства влияют на поведение поддержания соединения между Apigee Edge и всеми бэкэнд-сервисами во всех API-прокси.

Антипаттерн

Отключение постоянных (поддерживающих) соединений путем установки свойства 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-прокси.

Дополнительная информация