<ph type="x-smartling-placeholder"></ph>
현재 Apigee Edge 문서를 보고 있습니다.
Apigee X 문서. 정보
Apigee Edge는 GCP 프로젝트의 API 프록시에 허용되는 요청 수를 할당량 정책을 사용하여 특정 기간 동안).
안티패턴
할당량 정책이 재사용되면 할당량 정책이 사용되는 위치와 상관없이 실행될 때마다 할당량 카운터가 줄어듭니다. 즉, 할당량 정책이 다음과 같이 재사용되는 경우입니다.
- API 프록시의 동일한 흐름 또는 다른 흐름 내
- API 프록시의 다른 대상 엔드포인트에서
그러면 할당량 카운터가 실행될 때마다 감소하여 결국 지정된 시간 간격에 대해 예상한 것보다 훨씬 빨리 할당량 초과 오류가 발생합니다.
다음 예를 통해 작동 방식을 설명하겠습니다.
API 프록시
트래픽을 다른 대상 서버를 관리할 수 있습니다 그리고 API 트래픽을 각 대상 서버에 분당 10개의 요청으로 제한하려고 합니다. 다음은 이를 설명하는 표입니다. 시나리오:
리소스 경로 | 대상 서버 | 할당량 |
---|---|---|
/target-us |
target-US.somedomain.com |
요청 10개/분 |
/target-eu |
target-EU.somedomain.com |
요청 10개/분 |
할당량 정책
두 대상 서버의 트래픽 할당량이 동일하므로 단일 할당량 정책을 정의합니다. 다음과 같이 이름을 지정합니다.
<!-- /antipatterns/examples/1-8.xml --> <Quota name="Quota-Minute-Target-Server"> <Interval>1</Interval> <TimeUnit>minute</TimeUnit> <Distributed>true</Distributed> <Allow count="10"/> </Quota>
대상 엔드포인트
대상 엔드포인트의 사전 흐름에서 할당량 정책 'Quotas-Minute-Target-Server'를 사용하겠습니다 'Target-US':
<!-- /antipatterns/examples/1-9.xml --> <TargetEndpoint name="Target-US"> <PreFlow name="PreFlow"> <Request> <Step> <Name>Quota-Minute-Target-Server</Name> </Step> </Request> </PreFlow> <HTTPTargetConnection> <URL>http://target-us.somedomain.com</URL> </HTTPTargetConnection> </TargetEndpoint>
그리고 다른 대상의 프리플로우에서 동일한 할당량 정책 'Quota-Minute-Target-Server'를 재사용합니다. 'Target-EU' 엔드포인트도 지원합니다.
<!-- /antipatterns/examples/1-10.xml --> <TargetEndpoint name="Target-EU"> <PreFlow name="PreFlow"> <Request> <Step> <Name>Quota-Minute-Target-Server</Name> </Step> </Request> <Response/> </PreFlow> <HTTPTargetConnection> <URL>http://target-us.somedomain.com</URL> </HTTPTargetConnection> </TargetEndpoint>
수신 트래픽 패턴
첫 30초 이내에 이 API 프록시에 대한 총 10개의 API 요청이 다음 패턴을 따릅니다.
리소스 경로 | /target-us |
/target-eu |
전체 |
---|---|---|---|
요청 수 | 4 | 6 | 10 |
잠시 후 리소스 경로가 /target-us
인 11번째 API 요청을 받습니다.
32초 후를 가정해 보겠습니다
대상 엔드포인트 target-us
에 여전히 6개의 API 요청이 허용되는 할당량으로 남아있다고 가정하면 요청이 성공적으로 처리될 것으로 예상됩니다.
하지만 실제로는 Quota violation error
가 발생합니다.
이유: 두 개의 대상 엔드포인트에서 동일한 할당량 정책을 사용하므로 두 개의 대상 엔드포인트에 모두 적용되는 API 요청을 추적하는 데 단일 할당량 카운터가 사용됩니다. 따라서 개별 대상 엔드포인트가 아니라 분당 요청 10개의 할당량이 소진됩니다.
영향
이러한 안티패턴은 근본적인 기대 수준의 불일치를 초래하여 할당량 한도가 조기에 소진되었다고 인식하게 만듭니다.
권장사항
<Class>
또는<Identifier>
요소를 사용해서 단일 할당량 정책을 정의하여 여러 개의 고유한 카운터가 유지되도록 합니다. 할당량 정책 재정의 앞서 설명한 바와 같이target_id
를<Identifier>
로 사용합니다.<!-- /antipatterns/examples/1-11.xml --> <Quota name="Quota-Minute-Target-Server"> <Interval>1</Interval> <TimeUnit>minute</TimeUnit> <Allow count="10"/> <Identifier ref="request.header.target_id"/> <Distributed>true</Distributed> </Quota>
- 대상 엔드포인트 'Target-US'와 'Target-EU'로 설정합니다.
- 이제
target_id
헤더의 값이 'US'이면 요청이 대상 엔드포인트 'Target-US'를 선택합니다. - 마찬가지로
target_id
헤더에 'EU' 값이 있으면 요청이 대상으로 라우팅됩니다. 'Target-EU'로 설정합니다. - 두 개의 대상 엔드포인트에서 모두 동일한 할당량 정책을 사용해도
<Identifier>
값에 따라 별도의 할당량 카운터가 유지됩니다. - 따라서
<Identifier>
요소를 사용하면 각 대상 엔드포인트에 요청 10개가 허용되는 할당량이 적용됩니다.
- 각 흐름/대상 엔드포인트/API 프록시에서 별도의 할당량 정책을 사용하여 항상 허용되는 API 요청 수를 얻을 수 있습니다. 이번에는
각 대상마다 허용되는 요청 할당량 10개를 달성하는 방법을 확인하세요.
엔드포인트가 있습니다
- 대상 엔드포인트 'Target-US'에 각각 하나씩 별도의 할당량 정책을 정의합니다.
'Target-EU'
대상 엔드포인트 'Target-US'의 할당량 정책:
<!-- /antipatterns/examples/1-12.xml --> <Quota name="Quota-Minute-Target-Server-US"> <Interval>1</Interval> <TimeUnit>minute</TimeUnit> <Distributed>true</Distributed> <Allow count="10"/> </Quota>
대상 엔드포인트 'Target-EU'의 할당량 정책:
<!-- /antipatterns/examples/1-13.xml --> <Quota name="Quota-Minute-Target-Server-EU"> <Interval>1</Interval> <TimeUnit>minute</TimeUnit> <Distributed>true</Distributed> <Allow count="10"/> </Quota>
- 아래와 같이 대상 엔드포인트 정의에 해당 할당량 정책을 사용합니다.
대상 엔드포인트 “Target-US”:
<!-- /antipatterns/examples/1-14.xml --> <TargetEndpoint name="Target-US"> <PreFlow name="PreFlow"> <Request> <Step> <Name>Quota-Minute-Target-Server-US</Name> </Step> </Request> <Response/> </PreFlow> <HTTPTargetConnection> <URL>http://target-us.somedomain.com</URL> </HTTPTargetConnection> </TargetEndpoint>
대상 엔드포인트 “Target-EU”:
<!-- /antipatterns/examples/1-15.xml --> <TargetEndpoint name="Target-EU"> <PreFlow name="PreFlow"> <Request> <Step> <Name>Quota-Minute-Target-Server-EU</Name> </Step> </Request> <Response/> </PreFlow> <HTTPTargetConnection> <URL>http://target-eu.somedomain.com</URL> </HTTPTargetConnection> </TargetEndpoint>
- 대상 엔드포인트 'Target-US'에서 별도의 할당량 정책을 사용하고 있으므로 'Target-EU'를 선택하면 별도의 카운터가 유지됩니다. 이렇게 하면 대상 엔드포인트마다 분당 10개의 API 요청 할당량이 허용됩니다.
- 대상 엔드포인트 'Target-US'에 각각 하나씩 별도의 할당량 정책을 정의합니다.
'Target-EU'
<Class>
또는<Identifier>
요소를 사용하여 여러 개의 고유한 카운터를 유지합니다.