Антипаттерн: кеширование ответов с ошибками

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

Кеширование – это процесс временного хранения данных в области хранения, называемой кешем, для дальнейшего использования. Кеширование данных позволяет значительно повысить производительность, поскольку:

  • Позволяет быстрее извлекать данные
  • Сокращает время обработки, поскольку не нужно постоянно заново генерировать данные.
  • Предотвращает отправку запросов API на внутренние серверы и тем самым снижает нагрузку на них.
  • Позволяет более эффективно использовать системные ресурсы и ресурсы приложений.
  • Улучшено время отклика API.

Если вам часто приходится обращаться к данным, которые нечасто меняются, мы настоятельно рекомендуем использовать кеш для их хранения.

Apigee Edge позволяет хранить данные в кеше во время выполнения для обеспечения их сохранности и быстрого извлечения. Функция кеширования доступна через правило PopulateCache, правило LookupCache, правило InvalidateCache и правило ResponseCache.

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

Правила кеширования ответов:

  • Уменьшает количество запросов, поступающих в серверную часть.
  • снижает нагрузку на сеть;
  • Улучшена производительность API и время отклика.

Антипаттерн

Правило ResponseCache позволяет кешировать HTTP-ответы с любым кодом статуса. Это означает, что в кеше могут храниться как ответы об успешном выполнении, так и ответы об ошибках.

Ниже приведен пример правил кеширования ответов с конфигурацией по умолчанию:

<!-- /antipatterns/examples/1-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
  <DisplayName>TargetServer ResponseCache</DisplayName>
  <CacheKey>
    <Key Fragment ref="request.uri" /></CacheKey>
    <Scope>Exclusive</Scope>
    <ExpirySettings>
      <TimeoutInSec ref="flow.variable.here">600</TimeoutInSec>
    </ExpirySettings>
  <CacheResource>targetCache</CacheResource>
</ResponseCache>

Правило Response Cache по умолчанию кэширует ответы с ошибками. Однако кешировать ответы с ошибками не рекомендуется, поскольку это может привести к следующим негативным последствиям:

  • Сценарий 1. Ошибки возникают на неизвестный период времени. Мы можем продолжать отправлять ответы с ошибками из-за кеширования даже после того, как проблема будет устранена.

    ИЛИ

  • Сценарий 2. Сбои будут наблюдаться в течение определенного периода времени, после чего нам придется изменить код, чтобы избежать кеширования ответов после устранения проблемы.

Рассмотрим два сценария подробнее.

Сценарий 1. Временный сбой в работе внутреннего сервиса или ресурса

Сбой на внутреннем сервере может произойти по одной из следующих причин:

  • временный сбой в сети;
  • Сервер бэкэнда перегружен и временно не может отвечать на запросы.
  • Запрошенный ресурс может быть удален или временно недоступен.
  • Внутренний сервер отвечает медленно из-за длительной обработки в течение определенного периода времени и т. д.

Во всех этих случаях сбои могут происходить в течение неизвестного периода времени, а затем мы можем начать получать успешные ответы. Если мы кешируем ответы с ошибками, то можем продолжать отправлять их пользователям, даже если проблема с внутренним сервером уже решена.

Сценарий 2. Длительный или постоянный сбой в работе внутреннего сервиса или ресурса

Предположим, что сбой в работе серверной части будет продолжаться в течение определенного времени. Например, вы знаете, что:

  • Один из внутренних ресурсов будет недоступен в течение часа

    ИЛИ

  • Внутренний сервер удален или недоступен в течение 24 часов из-за внезапного сбоя сайта, проблем с масштабированием, технического обслуживания, обновления и т. д.

На основе этой информации мы можем задать подходящее время истечения срока действия кеша в правиле Response Cache, чтобы не кешировать ответы с ошибками на более длительный срок. Однако, когда внутренний сервер или ресурс снова станет доступен, нам придется изменить правила, чтобы избежать кеширования ответов об ошибках. Это связано с тем, что при временном сбое на сервере мы кешируем ответ и в результате получаем проблему, описанную в сценарии 1 выше.

Результат

  • Кеширование ответов об ошибках может привести к тому, что ответы об ошибках будут отправляться даже после того, как проблема будет устранена на сервере.
  • Пользователи могут потратить много времени на устранение неполадок, не зная, что проблема вызвана кешированием ответов об ошибках от внутреннего сервера.

Совет

  • Не сохраняйте ответы с ошибками в кеше ответов. Убедитесь, что элемент <ExcludeErrorResponse> в правиле ResponseCache имеет значение true, чтобы ответы с ошибками не кешировались, как показано в фрагменте кода ниже. При такой конфигурации в кеше будут храниться только ответы с кодами успешного выполнения по умолчанию (200–205), если коды не были изменены.
    <!-- /antipatterns/examples/1-2.xml -->
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
      <DisplayName>TargetServerResponseCache</DisplayName>
      <CacheKey>
        <KeyFragment ref="request.uri" />
      </CacheKey>
      <Scope>Exclusive</Scope>
      <ExpirySettings>
        <TimeoutinSec ref="flow.variable.here">600</TimeoutinSec>
      </ExpirySettings>
      <CacheResource>targetCache</CacheResource>
      <ExcludeErrorResponse>true</ExcludeErrorResponse>
    </ResponseCache>
  • Если вам нужно кешировать ответы с ошибками по какой-либо причине, вы можете определить максимальную или точную продолжительность времени, в течение которого будет наблюдаться сбой (если это возможно):
    • Установите подходящее время истечения срока действия, чтобы ответы об ошибках не кешировались дольше, чем может наблюдаться сбой.
    • Используйте правила ResponseCache, чтобы кешировать ответы об ошибках без элемента <ExcludeErrorResponse>.

    Выполняйте эти действия, только если вы абсолютно уверены, что сбой внутреннего сервера не временный.

  • Apigee не рекомендует кешировать ответы 5xx от внутренних серверов.