API 호출의 성능 문제 해결
Azure API Management 문제 해결 시리즈의 블로그를 참조하면 랩의 네 번째 시나리오입니다. 이에 따라 랩 설정 지침을 따라 문제를 다시 만들어야 합니다.
원래 제품 버전: API Management 서비스
원래 KB 번호: 4464929
증상
APIM의 API ProductStore 는 백 엔드 엔드포인트(https://productstoreapp.azurewebsites.net
)와 통신하여 필요할 때 레코드를 쉽게 만들고, 읽고, 업데이트하고, 삭제합니다. 그러나 아래에 나열된 API 작업을 호출하는 동안 몇 가지 성능 문제 및 예외가 발생할 수 있습니다. 테스트를 쉽게 수행하려면 ID가 1에서 3까지인 제품 3개만 유지합니다.
Products_GetAllProducts API 함수 중 하나는 결과를 반환하는 데 5초가 걸리는 반면 예상 응답 시간은 1초 미만입니다.
위에서 언급한 ID(1~3)가 있는 제품을 삭제하는 동안 Products_DeleteProduct 작업을 호출하여 아래 메시지와 함께 HTTP 500 - 내부 서버 오류가 발생합니다.
{
"Message": "오류가 발생했습니다."
}제품을 업데이트하는 Products_PutProduct 작업이 예기치 않게 제한되어 HTTP 429 - 요청에서 보내는 제품 ID 및 요청 본문에 관계없이 아래 오류 메시지가 포함된 요청이 너무 많습니다. 예를 들어 고객이 아래 Json 본문으로 제품 ID = 1을 갖는 "토마토 수프"의 제품 가격을 업데이트하면 HTTP 429 상태 코드를 받습니다.
템플릿 매개 변수 ID: 1
요청 본문: {"Name": "토마토 수프","카테고리": "식료품","가격": 2.45}
응답 본문:
{
속도 제한을 초과했습니다. 잠시 후 다시 시도하십시오.
}
문제 해결 단계
성능 문제를 해결하는 동안 가장 좋은 방법은 [각 섹션(인바운드/백 엔드/아웃바운드)에서 소요된 시간을 보여 주는 APIM 검사기 추적]을 캡처하는 것입니다.
첫 번째 문제에 대한 API 검사기 추적을 분석하는 경우 백 엔드 섹션이 대부분의 시간(약 5초)을 소요한다는 것을 알 수 있습니다. 즉, 백 엔드에서 약간의 속도 저하 또는 장기 실행 작업이 수행되고 있음을 의미합니다.
"source": "forward-request",
"timestamp": "2018-07-29T16:16:46.6615081Z",
"경과됨": "00:00:05.5844430","data": {
"response": {
"status": {
"code": 200,
"reason": "OK"
}속도가 백 엔드에 있음을 격리한 후에는 Web API 애플리케이션의 백 엔드 애플리케이션 코드를 조사해야 합니다. 백 엔드에 액세스할 수 없는 시나리오의 경우 아래와 같이 APIM 수준에서 캐싱을 구현할 수 있습니다. Azure API Management에서 성능을 향상시키기 위해 캐싱 정책을 구현하는 방법에 대해 알아봅니다.
<?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 검사기 추적을 분석하는 동일한 절차에 따라 'forward-request' 응답 특성 아래에 HTTP 500 상태 코드가 표시됩니다.
즉, 백 엔드 코드에서 처리되지 않은 예외가 발생하여 백 엔드 API가 HTTP 500을 반환했습니다. APIM 수준에서는 문제가 없습니다.
forward-request(841.060ms)
{
"response": {
"status": {
"code": 500,
"reason": "Internal Server Error"
}세 번째 문제(HTTP 429 - 요청이 너무 많음)의 경우 API 호출 속도 제한에 도달한 것 같습니다. 작업 수준에서 구현된 '속도 제한' 또는 'rate-limit-by-key' 정책이 있는지 확인할 수 있습니다.
작업 수준에서 이러한 정책을 찾을 수 없는 경우 이 문제를 일으킬 수 있는 제품 수준에서 일부 정책이 있을 수 있는 것처럼 다양한 수준의 상속된 모든 정책을 표시하는 유효 정책 계산 단추를 클릭합니다.
여기서 일부 정책은 API 호출 속도를 실제로 제한하지 않지만 아웃바운드 섹션에서 'return-response' 및 'set-status' 정책을 사용하여 클라이언트에 사용자 지정된 응답을 다시 반환하여 해당 작업을 모방하는 API 수준에서 구현됩니다.
<?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 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.