Partager via


Gestion des variables pour les fragments de stratégie

S’APPLIQUE À : tous les niveaux de Gestion des API

Les variables de contexte permettent le partage de données entre les fragments de stratégie pour les scénarios de pipeline avancés. La gestion des variables appropriée est essentielle pour la création de pipelines fiables avec des performances optimales. Une gestion incorrecte peut entraîner des erreurs d’exécution, des problèmes de performances et un comportement imprévisible.

Notions de base des variables

Les variables de contexte permettent un partage sécurisé des données pour les threads entre des fragments de stratégie et sont créées grâce à la stratégie intégrée set-variable. Chaque requête conserve son propre contexte de variable isolé, ce qui garantit que les requêtes simultanées n’interfèrent pas entre elles.

Gestion du cycle de vie des variables

  • Étendue de la requête : les variables existent uniquement pendant une seule requête et sont automatiquement collectées par le récupérateur de mémoire lorsque la requête se termine.

  • Persistance de la phase : les variables définies dans la phase entrante restent disponibles dans l’ensemble du back-end, du trafic sortant et de la phase d’erreur dans la même requête.

  • Isolation des threads : l’isolation stricte des threads garantit que chaque requête s’exécute sur son propre thread avec son propre objet de contexte, ce qui empêche l’interférence des données entre requêtes.

  • Mises à jour séquentielles : tout fragment peut modifier des variables existantes, avec des fragments suivants remplaçant les valeurs précédentes. L’exécution séquentielle élimine le besoin de mécanismes de verrouillage.

  • Seuil de stockage : la plateforme optimise la gestion des variables de contexte pour les petites collections, généralement 50 variables par requête ou moins.

Définir et récupérer des variables dans des fragments

<!-- Example: Set a request-id context variable that is a required value for other fragments -->
<set-variable name="request-id" value="@{
    var requestId = context.Request.Headers.GetValueOrDefault("X-Request-ID", "");
    if (string.IsNullOrEmpty(requestId)) {
        return Guid.NewGuid().ToString();
    }
    return requestId;
}" />

<!-- Example: Retrieve the same request-id context variable safely in another fragment -->
<set-header name="X-Correlation-ID" value="@{
    return context.Variables.GetValueOrDefault<string>("request-id", "unknown");
}" />

Meilleures pratiques

Utiliser l’accès aux variables sécurisées

Faites toujours preuve de prudence avec les valeurs Null potentielles, utilisez un accès sécurisé avec GetValueOrDefaultet fournissez des valeurs par défaut significatives pour tous les accès aux variables :

<!-- Safe access with default value -->
<set-variable name="log-level" value="@{
    return context.Variables.GetValueOrDefault<string>("config-log-level", "INFO");
}" />

<!-- Safe string interpolation using GetValueOrDefault -->
<set-variable name="cache-key" value="@{
    var userId = context.Variables.GetValueOrDefault<string>("auth-user-id", "anon");
    var resource = context.Variables.GetValueOrDefault<string>("request-resource", "default");
    
    return $"cache:{userId}:{resource}";
}" />

Vérifier l’existence des variables

Vérifiez que les variables créées par les fragments requis existent avant d’y accéder. Lorsque les dépendances sont manquantes, choisissez parmi deux stratégies :

Stratégie 1 : Échec rapide (dépendances critiques)

Retourne une réponse d’erreur lorsque des dépendances critiques sont manquantes :

<choose>
    <when condition="@(!context.Variables.ContainsKey("user-id"))">
        <!-- Critical dependency missing - fail immediately -->
        <return-response>
            <set-status code="500" reason="Internal Server Error" />
            <set-body>{"error": "Required variable missing", "missing_dependency": "user-id"}</set-body>
        </return-response>
    </when>
    <otherwise>
        <!-- Safe to proceed - use the user-id variable -->
        <set-header name="X-User-ID" exists-action="override">
            <value>@(context.Variables.GetValueOrDefault<string>("user-id", ""))</value>
        </set-header>
    </otherwise>
</choose>

Stratégie 2 : Gérer correctement (dépendances facultatives)

Poursuivez l’exécution avec le comportement de secours approprié lorsque des dépendances facultatives sont manquantes :

<choose>
    <when condition="@(context.Variables.ContainsKey("user-id"))">
        <!-- Optional variable available - use it -->
        <set-header name="X-User-ID" exists-action="override">
            <value>@(context.Variables.GetValueOrDefault<string>("user-id", ""))</value>
        </set-header>
    </when>
    <otherwise>
        <!-- Fallback to default when variable unavailable -->
        <set-header name="X-User-ID" exists-action="override">
            <value>unknown</value>
        </set-header>
    </otherwise>
</choose>

Réduire l’accès aux variables

Réduisez les recherches de variables de contexte en consolidant plusieurs accès en expressions uniques :

<!-- Good: Single consolidated access -->
<set-variable name="log-entry" value="@{
    var level = context.Variables.GetValueOrDefault<string>("log-level", "INFO");
    var requestId = context.Variables.GetValueOrDefault<string>("request-id", "unknown");
    return $"[{level}] Request {requestId} completed";
}" />

<!-- Avoid: Multiple separate accesses -->
<set-variable name="level-prefix" value="@("[" + context.Variables.GetValueOrDefault<string>("log-level", "INFO") + "]")" />
<set-variable name="request-suffix" value="@("Request " + context.Variables.GetValueOrDefault<string>("request-id", "unknown") + " completed")" />
<set-variable name="log-entry" value="@(context.Variables.GetValueOrDefault<string>("level-prefix", "") + " " + context.Variables.GetValueOrDefault<string>("request-suffix", ""))" />

Maintenir des types cohérents

Utilisez la gestion de type explicite pour optimiser les performances et la fiabilité. Lorsque vous utilisez des expressions de stratégie, spécifiez le type attendu avec l’opérateur @() :

<!-- Set as boolean, use as boolean -->
<set-variable name="should-log-debug" value="@(true)" />
<choose>
    <when condition="@(context.Variables.GetValueOrDefault<bool>("should-log-debug", false))">
        <!-- Include detailed debug information in logs -->
    </when>
</choose>