Les disjoncteurs protègent votre système lorsque les performances du backend se dégradent. Configurez les conditions de déclenchement, les durées d'ouverture et les backends de secours pour les instances dédiées.
Limites
Instances dédiées uniquement.
Maximum 512 caractères par expression.
Taille maximale de la configuration du plug-in : 50 Ko.
1. Présentation
Par défaut, si 1 000 délais d'attente se produisent au niveau d'un backend d'API dans un délai de 30 secondes, le disjoncteur se déclenche et passe à l'état ouvert pendant 90 secondes. Durant cette période, toutes les requêtes renvoient Status=503 avec le code d'erreur X-Ca-Error-Code=D503CB. Au bout de 90 secondes, le disjoncteur passe à l'état semi-ouvert et autorise un petit nombre de requêtes. Si le backend récupère, le disjoncteur se ferme et les requêtes reprennent normalement.
Sur une instance dédiée, le plug-in de disjoncteur vous permet de personnaliser les paramètres suivants du disjoncteur :
Condition de déclenchement : le disjoncteur se déclenche lorsque les délais d'attente du backend ou les erreurs spécifiées dépassent un seuil dans une fenêtre temporelle.
Fenêtre temporelle d'évaluation des conditions de déclenchement.
Durée d'ouverture après le déclenchement du disjoncteur.
Backend de secours pour les requêtes lorsque le disjoncteur est ouvert.
2. Configurations
Les configurations des plug-ins de disjoncteur s'appliquent uniquement aux API sur des instances dédiées. Sur les instances serverless, la configuration par défaut du disjoncteur est utilisée même si un plug-in est lié à l'API.
2.1 Configuration des politiques de dégradation basées sur les délais d'attente du backend
Configurez une politique de dégradation basée sur les délais d'attente du backend. Une requête est considérée comme ayant expiré si le backend ne répond pas dans le délai défini par l'API.
timeoutThreshold: 15 # The threshold of the number of occurrences of timeout at the backend.
windowInSeconds: 30 # The time window during which the number of occurrences of timeout at the backend is checked by the circuit breaker to determine whether to trip.
openTimeoutSeconds: 15 # The period of time during which the circuit breaker stays open after it trips.
downgradeBackend: # The backend to which API requests are directed when the circuit breaker is open.
type: mock
statusCode: 418
Champs :
timeoutThreshold: nombre de délais d'attente du backend qui déclenche le disjoncteur. Valeur maximale : 5000. Une valeur trop faible entraîne des déclenchements fréquents.windowInSeconds: fenêtre temporelle d'évaluation. Valeurs valides : 10 à 90. Unité : secondes.openTimeoutSeconds: durée pendant laquelle le disjoncteur reste ouvert. Valeurs valides : 15 à 300. Unité : secondes.downgradeBackend: facultatif. Backend de secours utilisé lorsque le disjoncteur est ouvert.
2.2 Configuration d'une politique de dégradation basée sur le temps de réponse du backend
Configurez une politique de dégradation basée sur le temps de réponse du backend, mesuré depuis l'envoi de la requête par la passerelle jusqu'à la réception de la réponse.
errorThreshold: 10 # The threshold of the number of occurrences of long response at the backend.
windowInSeconds: 60 # The time window during which the number of occurrences of long response at the backend is checked by the circuit breaker to determine whether to trip.
openTimeoutSeconds: 120 # The period of time during which the circuit breaker stays open after it trips.
errorCondition: "$LatencyMilliSeconds > 500" # The conditional expression that is used to determine whether the backend response is counted as a long response. In this example, if the backend response time exceeds 500 ms, the response is considered as a long response.
downgradeBackend: # The backend to which API requests are directed when the circuit breaker is open.
type: mock
statusCode: 403
Champs :
errorThreshold: nombre de réponses lentes qui déclenche le disjoncteur.windowInSeconds: fenêtre temporelle d'évaluation. Valeurs valides : 10 à 90. Unité : secondes.openTimeoutSeconds: durée pendant laquelle le disjoncteur reste ouvert. Valeurs valides : 15 à 300. Unité : secondes.errorCondition: expression définissant une réponse lente. Variables disponibles :$LatencyMilliSeconds(millisecondes) et$LatencySeconds(secondes).downgradeBackend: facultatif. Backend de secours utilisé lorsque le disjoncteur est ouvert.
2.3 Configuration d'une politique de dégradation basée sur les erreurs du backend
Configurez une politique de dégradation basée sur les codes d'erreur du backend.
errorCondition: "$StatusCode == 503" # The conditional expression that specifies the error whose number of occurrences is checked by the circuit breaker to determine whether to trip.
errorThreshold: 1000 # The threshold of the number of occurrences of the specified error.
windowInSeconds: 30 # The time window during which the number of occurrences of the specified error at the backend is checked by the circuit breaker to determine whether to trip.
openTimeoutSeconds: 15 # The period of time during which the circuit breaker stays open after it trips.
downgradeBackend: # The backend to which API requests are directed when the circuit breaker is open.
type: "HTTP"
address: "http://api.foo.com"
path: "/system-busy.json"
method: GET
-
errorCondition: expression d'erreur. Variables disponibles :$StatusCode(code de réponse) et$LatencySeconds(latence en secondes).Par exemple, l'expression
$StatusCode = 503 or $StatusCode = 504renvoie la valeur true si le code d'état de la réponse du backend est 503 ou 504.Par exemple,
$LatencySeconds > 30indique que le délai d'attente dépasse 30 secondes.
errorThreshold: nombre d'erreurs correspondantes qui déclenche le disjoncteur.windowsInSeconds: fenêtre temporelle d'évaluation. Valeurs valides : 10 à 90. Unité : secondes.openTimeoutSeconds: durée pendant laquelle le disjoncteur reste ouvert. Valeurs valides : 15 à 300. Unité : secondes.downgradeBackend: facultatif. Backend de secours utilisé lorsque le disjoncteur est ouvert.
2.4 Contrôle précis de l'état
API Gateway s'exécute sur plusieurs nœuds de cluster, chacun maintenant son propre état de disjoncteur. Cela peut entraîner une imprécision de l'état entre les nœuds. Pour activer un état de disjoncteur globalement cohérent, ajoutez le useGlobalState champ à la configuration de votre plug-in :
---
timeoutThreshold: 15 # The threshold of the number of occurrences of timeout at the backend.
windowInSeconds: 30 # The time window during which the number of occurrences of timeout at the backend is checked by the circuit breaker to determine whether to trip.
openTimeoutSeconds: 15 # The period of time during which the circuit breaker stays open after it trips.
useGlobalState: true # Accurate status control is enabled.
downgradeBackend: # The backend to which API requests are directed when the circuit breaker is open.
type: mock
statusCode: 302
body: |
<result>
<errorCode>I's a teapot</errorCode>
</result>
La valeur par défaut de useGlobalState est false. La définir sur true permet d'obtenir un état précis au prix d'une légère surcharge de performance, ce qui n'affecte pas les QPS garantis ni le SLA de votre instance.
2.5 Configuration d'une politique de dégradation par pourcentage
Le disjoncteur se déclenche lorsque l'une des quatre conditions suivantes est remplie. Toutes les conditions ont la même priorité.
errorThreshold: nombre d'erreurs du backend (correspondant àerrorCondition) qui déclenche le disjoncteur.timeoutThreshold: nombre de délais d'attente du backend qui déclenche le disjoncteur.errorThresholdByPercent: seuil de taux d'erreur, évalué par rapport au taux d'erreur de la fenêtre temporelle précédente.timeoutThresholdByPercent: seuil de taux de délai d'attente en pourcentage du total des requêtes dans une fenêtre temporelle.
Exemple :
---
windowInSeconds: 3 # The time window during which the circuit breaker determines whether to trip. Valid values: 10 to 90. Unit: seconds.
openTimeoutSeconds: 3
errorThreshold: 90 # The threshold of the number of occurrences of the specified error.
timeoutThreshold: 90 # The threshold of the number of occurrences of timeout.
errorThresholdByPercent: 20 # The threshold of the percentage of requests in which the specified error occurs to the total number of requests.
timeoutThresholdByPercent: 20 # The threshold of the percentage of requests in which timeout occurs to the total number of requests.
errorCondition: "$StatusCode = 500" # The error condition.
downgradeBackend:
type: mock
statusCode: 418
body: |
<result>
<errorCode>I's a teapot</errorCode>
</result>
Les seuils de pourcentage nécessitent au moins 100 requêtes dans une fenêtre temporelle pour prendre effet.
Dans cet exemple,
errorThreshold: 90ettimeoutThreshold: 90provoquent le déclenchement du disjoncteur si les erreurs ou les délais d'attente dépassent 90 dans une fenêtre temporelle.errorThresholdByPercent: 20ettimeoutThresholdByPercent: 20déclenchent le disjoncteur si la fenêtre temporelle précédente comportait au moins 100 requêtes et si le taux d'erreur ou de délai d'attente dépassait 20 %.Les politiques de délai d'attente basées sur le pourcentage sont prises en charge à partir de la version de juin 2023.
2.6 Limitation des requêtes lors du déclenchement du disjoncteur
Lorsque le disjoncteur se déclenche, une configuration de limitation temporaire s'applique à tout le trafic pendant que le disjoncteur est ouvert ou semi-ouvert :
---
windowInSeconds: 1 # The time window in which the circuit breaker checks the number of occurrences of timeout at the backend.
openTimeoutSeconds: 15 # The period of time during which the circuit breaker stays open after it trips.
errorThreshold: 3
errorCondition: "$LatencyMilliSeconds > 1"
downgradeTrafficLimit: # The backend to which API requests are directed when the circuit breaker is open.
limit: 2
period: MINUTE
3. Configuration du backend de secours
Utilisez downgradeBackend pour spécifier un backend de secours lorsque le disjoncteur est ouvert. La configuration du backend doit correspondre au format de spécification d'API utilisé dans API Gateway (Importer des fichiers Swagger pour créer des API avec les extensions API Gateway). Les types de backend suivants sont pris en charge :
Backend HTTP
---
backend:
type: HTTP
address: "http://10.10.100.2:8000"
path: "/users/{userId}"
method: GET
timeout: 7000
Backend HTTP (VPC)
---
backend:
type: HTTP-VPC
vpcAccessName: vpcAccess1
path: "/users/{userId}"
method: GET
timeout: 10000
Function Compute
---
backend:
type: FC
fcRegion: cn-shanghai
serviceName: fcService
functionName: fcFunction
arn: "acs:ram::111111111:role/aliyunapigatewayaccessingfcrole"
MOCK
---
backend:
type: MOCK
mockResult: "mock result sample"
mockStatusCode: 200
mockHeaders:
- name: Content-Type
value: text-plain
- name: Content-Language
value: zhCN
4. Codes d'erreur
|
Code d'erreur |
Code d'état HTTP |
Message |
Description |
|
D503BB |
503 |
Backend circuit breaker busy |
L'API est protégée par son disjoncteur. |
|
D503CB |
503 |
Backend circuit breaker open, ${Reason} |
Le disjoncteur est ouvert. Vérifiez les performances du backend avant de retester les appels d'API. |