Поделиться через


Устранение проблем с производительностью вызовов API

Ссылаясь на блог в Azure Управление API серии устранения неполадок, это четвертый сценарий лаборатории. Убедитесь, что вы выполнили инструкции по настройке лаборатории, чтобы повторно создать проблему.

Исходная версия продукта: служба Управление API
Исходный номер базы знаний: 4464929

Симптомы

Api ProductStore в APIM взаимодействует с серверной конечной точкой (https://productstoreapp.azurewebsites.net) для упрощения создания, чтения, обновления и удаления записей по мере необходимости. Однако при вызове операций API, перечисленных ниже, могут возникнуть некоторые проблемы с производительностью и исключениями. Для простоты тестирования сохраните только три продукта с идентификаторами в диапазоне от 1 до 3.

  • Одна из функций API, Products_GetAllProducts занимает 5 секунд, чтобы вернуть результаты, в то время как ожидаемое время отклика меньше секунды.

  • При удалении продукта с указанными выше идентификаторами (от 1 до 3) возникает ошибка HTTP 500 — внутренняя ошибка сервера с приведенным ниже сообщением путем вызова операции Products_DeleteProduct .

    {
    "Сообщение": "Произошла ошибка".
    }

  • Products_PutProduct операция, которая обновляет продукт, неожиданно регулируется, вызывая http 429 — слишком много запросов со следующим сообщением об ошибке независимо от идентификатора продукта и текста запроса, который отправляется в запросе. Например, если клиент обновляет цену продукта "Томатный суп" с идентификатором продукта = 1 с приведенным ниже текстом Json, он получает код состояния HTTP 429.

    Идентификатор параметра шаблона: 1
       Текст запроса: {"Name": "Томатный суп", "Категория": "Продуктовые продукты", "Цена": 2.45}
       Текст ответа:
    {
    превышено ограничение скорости. Повторите попытку через некоторое время.
    }

Действия по устранению неполадок

  • При устранении неполадок с производительностью лучший способ изоляции сбоя позволяет записывать [трассировку инспектора APIM, которая показывает время, затраченные в каждом разделе (входящий/ внутренний сервер или исходящий трафик).

  • Если вы анализируете трассировку инспектора API для первой проблемы, обратите внимание, что раздел серверной части занимает большую часть времени (около 5 секунд), что означает, что в серверной части происходит некоторое замедление или долгое выполнение операции.

    Source: "forward-request",
    "метка времени": "2018-07-29T16:16:46.6615081Z",
    "прошло": "00:00:05.584430","data": {
    "response": {
    "status": {
    "code": 200,
    "причина": "ОК"
    }

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

    <?xml version="1.0" encoding="UTF-8"?>
    <policies>
       <inbound>
          <base />
          <cache-lookup vary-by-developer="true" vary-by-developer-groups="true" must-revalidate="true" downstream-caching-type="public" />
       </inbound>
       <backend>
          <base />
       </backend>
       <outbound>
          <base />
          <cache-store duration="60" />
       </outbound>
       <on-error>
          <base />
       </on-error>
    </policies>
    
  • Во второй проблеме (ошибка внутреннего сервера HTTP 500 — внутренняя ошибка сервера) выполните ту же процедуру анализа трассировки инспектора APIM, и мы должны увидеть код состояния HTTP 500 в атрибуте ответа forward-request.

  • Это означает, что внутренний API вернул HTTP 500 из-за некоторых необработанных исключений в коде серверной части, проблемы на уровне APIM не возникают.

    forward-request (841.060 мс)
    {
    "response": {
    "status": {
    "code": 500,
    "причина": "Внутренняя ошибка сервера"
    }

  • Для третьей проблемы (HTTP 429 — слишком много запросов) похоже, что вы бьете ограничение частоты вызовов API. Вероятно, можно проверить, существует ли какая-либо политика "rate-limit-by-key" или "rate-limit-by-key", реализованная на уровне операции.

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

  • Здесь следует заметить, что некоторые политики реализованы на уровне API, которые не на самом деле ограничивают частоту вызовов API, но имитируют его действие, возвращая настраиваемый ответ клиенту с помощью политик возвращаемого ответа и "set-status" в разделе исходящего трафика.

    <?xml version="1.0" encoding="UTF-8"?>
    <outbound>
       <!--base: Begin Api scope-->
       <return-response>
          <set-status code="429" reason="Too many requests" />
          <set-body><![CDATA[{
    
    Rate limit is exceeded. Try again after some time.
    
    }]]></set-body>
       </return-response>
       <!--base: End Api scope-->
    </outbound>
    

Свяжитесь с нами для получения помощи

Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.