Esta é a documentação do Apigee Edge.
Acesse
Documentação da Apigee X. informações
O Apigee Edge oferece a capacidade de configurar o número de solicitações permitidas para um proxy de API para um período específico usando a política de cotas.
Antipadrão
Se uma política de cotas for reutilizada, o contador de cotas será reduzido sempre que essa política for executada, independentemente do local de uso. Ou seja, se uma política de cota for reutilizada:
- Dentro do mesmo fluxo ou de fluxos diferentes de um proxy de API
- Em endpoints de destino diferentes de um proxy de API
Em seguida, o contador será reduzido toda vez que for executado e acabará recebendo erros de violação de cota muito antes do esperado pelo intervalo de tempo especificado.
Vamos usar o exemplo a seguir para explicar como isso funciona.
Proxy da API
Vamos supor que temos um proxy de API chamado "TestTargetServerQuota", que encaminha o tráfego para dois diferentes servidores de destino com base no caminho do recurso. Além disso, queremos restringir o tráfego da API a 10 solicitações por minuto para cada um desses servidores de destino. A tabela abaixo mostra isso cenário:
Caminho do recurso | Servidor de destino | Cota |
---|---|---|
/target-us |
target-US.somedomain.com |
10 solicitações por minuto |
/target-eu |
target-EU.somedomain.com |
10 solicitações por minuto |
Política de cotas
Como a cota de tráfego é a mesma para os dois servidores de destino, definimos uma única política de cotas chamada “Cota-Minute-Target-Server”, conforme mostrado abaixo:
<!-- /antipatterns/examples/1-8.xml --> <Quota name="Quota-Minute-Target-Server"> <Interval>1</Interval> <TimeUnit>minute</TimeUnit> <Distributed>true</Distributed> <Allow count="10"/> </Quota>
Endpoints de destino
Vamos usar a política de cotas "Quota-Minute-Target-Server" no pré-fluxo do endpoint de destino. "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>
E reutilize a mesma política de cotas "Quota-Minute-Target-Server" no pré-fluxo da outra política endpoint "Target-EU" também:
<!-- /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>
Padrão do tráfego de entrada
Digamos que temos um total de 10 solicitações de API para esse proxy de API nos primeiros 30 segundos o seguinte padrão:
Caminho do recurso | /target-us |
/target-eu |
Tudo |
---|---|---|---|
# solicitações | 4 | 6 | 10 |
Pouco depois, recebemos a 11a solicitação de API com o caminho do recurso como /target-us
,
por exemplo, depois de 32 segundos.
Esperamos que a solicitação seja bem-sucedida, supondo que ainda temos seis solicitações de API para
o endpoint de destino target-us
de acordo com a cota permitida.
Mas, na realidade, temos um Quota violation error
.
Motivo: como estamos usando a mesma política de cota nos endpoints de destino, um contador de cotas único é usado para rastrear as solicitações de API que encontram esses endpoints. Assim, esgotamos a cota de 10 solicitações por minuto em vez de para o endpoint de destino individual.
Impacto
Esse antipadrão pode resultar em uma incompatibilidade fundamental nas expectativas, fazendo parecer que os limites da cota se esgotaram antes do tempo.
Prática recomendada
- Use os elementos
<Class>
ou<Identifier>
para garantir que vários contadores exclusivos sejam mantidos ao definir uma única política de cotas. Vamos redefinir a política de cotas "Cota-Minute-Target-Server", que acabamos de explicar na seção anterior, usando o cabeçalhotarget_id
como<Identifier>
, conforme mostrado abaixo:<!-- /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>
- Continuaremos a usar essa política de cotas nos endpoints de destino "Target-US" e "Target-EU", como antes.
- Agora digamos que se o cabeçalho
target_id
tiver o valor "US", as solicitações serão roteadas para o o endpoint de destino "Target-US". - Da mesma forma, se o cabeçalho
target_id
tiver um valor "EU", as solicitações serão roteadas para o destino. endpoint "Target-EU". - Portanto, mesmo se usarmos a mesma política de cotas nos endpoints de destino, os contadores de cotas separados
serão mantidos com base no valor de
<Identifier>
. - Assim, ao usar o elemento
<Identifier>
, podemos garantir que cada endpoint de destino receba a cota permitida de 10 solicitações.
- Use a política de cotas separada em cada um dos fluxos/endpoints de destino/proxies de API para garantir que você
sempre consiga a contagem de solicitações de API permitida. Vamos analisar o mesmo exemplo usado
seção acima para saber como podemos atingir a cota permitida de 10 solicitações para cada
endpoints.
- Defina uma política de cotas separada, uma para os endpoints de destino "Target-US" e
"Target-EU"
Política de cotas para o endpoint de destino "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>
Política de cotas para o endpoint de destino "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>
- Use a respectiva política de cotas na definição dos endpoints de destino, conforme mostrado abaixo:
Endpoint de destino "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>
Endpoint de destino "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>
- Como estamos usando uma política de cotas separada nos endpoints de destino "Target-US" e "Target-EU", um contador separado será mantido. Isso garante o recebimento da cota permitida de 10 solicitações de API por minuto para cada um dos endpoints de destino.
- Defina uma política de cotas separada, uma para os endpoints de destino "Target-US" e
"Target-EU"
- Use os elementos
<Class>
ou<Identifier>
para garantir que vários contadores exclusivos sejam mantidos.