Pochopení HTTP pipeline a opakování v Azure SDK pro Python

Když zavoláte jakoukoli službu Azure pomocí sady Azure SDK pro Python, vaše žádost nepřejde přímo do služby Azure. Nezáleží na tom, jestli se jedná o službu Azure Blob Storage, Azure Key Vault, Azure Cosmos DB nebo jakoukoli jinou službu založenou na protokolu HTTP. Místo toho vaše žádost prochází sofistikovaným kanálem HTTP, který automaticky zpracovává kritické průřezové záležitosti.

Pochopení fungování kanálu HTTP je nezbytné pro vytváření robustních a výkonných aplikací. Kanál:

  • Zvládá opakované pokusy při přechodných selháních.
  • Zpracovává autentizaci.
  • Poskytuje možnosti protokolování.
  • Umožňuje přidat vlastní chování v případě potřeby.

Tyto znalosti vám pomůžou ladit problémy s výkonem, optimalizovat odolnost a přizpůsobit interakci vaší aplikace se službami Azure.

Co je kanál HTTP?

Sada Azure SDK pro Python používá k zpracování všech požadavků a odpovědí interní architekturu kanálu HTTP. Tento potrubí se skládá z řady politik, které se spouštějí postupně. Každá zásada zodpovídá za konkrétní aspekt komunikace HTTP. Kanál si můžete představit jako řetěz kroků zpracování:

Client Request → Retry Policy → Authentication Policy → Logging Policy → HTTP Transport → Azure Service
                                                                                              ↓
Client Response ← Retry Policy ← Authentication Policy ← Logging Policy ← HTTP Transport ← Response

Každá zásada v kanálu může:

  • Před odesláním upravte požadavek.
  • Zpracování odpovědi po přijetí
  • Proveďte akce, jako je opakování neúspěšných požadavků.
  • Přidejte hlavičky, informace o protokolu nebo implementujte vlastní logiku.

Klíčové zásady v kanálu

Sada Azure SDK pro Python obsahuje několik předdefinovaných zásad, které zpracovávají běžné scénáře:

  • RetryPolicy: Automaticky opakuje žádosti, které selžou kvůli přechodným chybám. Tato zásada implementuje inteligentní logiku opakování s exponenciálním zpovracením, aby se zabránilo zahlcení služeb během výpadků.
  • BearerTokenCredentialPolicy: Spravuje ověřování automatickým získáním a aktualizací přístupových tokenů. Tato zásada zajišťuje, že vaše požadavky zahrnují platné ověřovací přihlašovací údaje bez ruční správy tokenů.
  • NetworkTraceLoggingPolicy: Zaznamenává podrobné informace o požadavcích HTTP a odpovědích pro účely ladění. Tato zásada je neocenitelná při řešení problémů s komunikací.
  • HttpTransport: Nejnižší vrstva kanálu, která ve skutečnosti odesílá požadavky HTTP přes síť. V sadě Azure SDK pro Python se tato zásada obvykle implementuje pomocí knihovny Requests nebo aiohttp pro asynchronní operace.

Další zásady

  • RedirectPolicy: Zpracovává přesměrování HTTP automaticky.
  • DistributedTracingPolicy: Integruje se s distribuovanými systémy trasování pro monitorování.
  • ProxyPolicy: Směruje požadavky prostřednictvím proxy serverů HTTP při konfiguraci.
  • UserAgentPolicy: Přidá informace o verzi sady SDK do hlaviček požadavků.

Chování opakování

Sada Azure SDK pro Python implementuje inteligentní logiku opakování pro automatické zpracování přechodných selhání. Pochopení tohoto chování vám pomůže vytvářet odolnější aplikace.

Automaticky opakovat podmínky

Sada SDK opakuje požadavky na tyto stavové kódy HTTP:

  • 408 Vypršení časového limitu požadavku: Server čekal na žádost příliš dlouho a vypršel časový limit.
  • 429 Příliš mnoho požadavků: Omezování rychlosti je v platnosti.
  • 500 Vnitřní chyba serveru: Problém s dočasným serverem.
  • 502 – Chybná brána: Dočasný problém se sítí
  • 503 Služba není k dispozici: Služba je dočasně nedostupná.
  • 504 Vypršení časového limitu brány: Časový limit brány nebo proxy serveru vypršel.

Výchozí konfigurace opakování

Výchozí nastavení opakování poskytují dobrou rovnováhu mezi odolností a výkonem:

  • Maximální počet pokusů o opakování: 3
  • Režim opakování: Exponenciální prodleva
  • Základní zpoždění: 0,8 sekundy
  • Maximální zpoždění: 60 sekund
  • Maximální celková doba opakování: 120 sekund

Exponenciální výpočet zpětného odpočtu se řídí tímto vzorem:

delay = min(base_delay * (2 ** retry_attempt), max_delay)

Přizpůsobení opakovaných pokusů

Chování opakování můžete přizpůsobit při vytváření klientů sady SDK tak, aby odpovídaly konkrétním požadavkům vaší aplikace.

from azure.storage.blob import BlobServiceClient
from azure.core.pipeline.policies import RetryPolicy

# Custom retry configuration
retry_policy = RetryPolicy(
    retry_total=5,                    # Maximum number of retry attempts
    retry_backoff_factor=0.5,         # Base backoff time in seconds
    retry_backoff_max=120,            # Maximum backoff time in seconds
    retry_on_status_codes=[429, 500, 502, 503, 504]  # HTTP status codes to retry
)

# Apply custom retry policy to client
client = BlobServiceClient(
    account_url="https://myaccount.blob.core.windows.net",
    credential=credential,
    retry_policy=retry_policy
)

Zakázání opakovaných pokusů

Pro scénáře, kdy opakování není vhodné:

from azure.core.pipeline.policies import RetryPolicy

# Disable retries completely
no_retry_policy = RetryPolicy(retry_total=0)

client = BlobServiceClient(
    account_url="https://myaccount.blob.core.windows.net",
    credential=credential,
    retry_policy=no_retry_policy
)

Diagnostikovat a ladit chování opakovaných pokusů

Pochopení, kdy a proč dochází k opakovaným pokusům, je zásadní pro řešení potíží s výkonem.

Povolení protokolování sady SDK

Sada Azure SDK pro Python používá standardní protokolovací architekturu Pythonu:

import logging
import sys

# Configure logging to see retry attempts
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    stream=sys.stdout
)

# Enable specific Azure SDK loggers
azure_logger = logging.getLogger('azure')
azure_logger.setLevel(logging.DEBUG)

# Now SDK operations will log retry attempts

Identifikace vzorů opakování

Vyhledejte položky protokolu, jako jsou:

Retry attempt 1 for request [GET] https://myaccount.blob.core.windows.net/container/blob
Waiting 0.8 seconds before retry

Běžné úskalí opakování

  • Opakování ne přechodných chyb: Sada SDK neopakuje chyby klienta (4xx) s výjimkou 408 a 429.
  • Ignorování latence opakování: Nezapomeňte, že opakování přidává latenci k neúspěšných operacím.
  • Nastavení příliš krátkého časového limitu: Ujistěte se, že váš celkový časový limit operace počítá se zpožděním způsobeným opakovanými pokusy.

Upřesnit: Přidání vlastních zásad

Kanál můžete rozšířit o vlastní zásady pro specializované scénáře.

Vytvoření vlastní zásady

from azure.core.pipeline import PipelineRequest, PipelineResponse
from azure.core.pipeline.policies import HTTPPolicy
from typing import Any, Optional

class CustomTelemetryPolicy(HTTPPolicy):
    """Custom policy to add telemetry headers"""
    
    def send(self, request: PipelineRequest) -> PipelineResponse:
        # Add custom header before sending request
        request.http_request.headers['X-Custom-Telemetry'] = 'my-app-v1.0'
        
        # Continue with the pipeline
        response = self.next.send(request)
        
        # Log response time
        print(f"Request to {request.http_request.url} completed")
        
        return response

Použít vlastní zásady

from azure.storage.blob import BlobServiceClient

# Create client with custom policy
client = BlobServiceClient(
    account_url="https://myaccount.blob.core.windows.net",
    credential=credential,
    per_call_policies=[CustomTelemetryPolicy()],  # Policies that run per request
    per_retry_policies=[]  # Policies that run per retry attempt
)

Řazení zásad

Zásady se spouštějí v určitém pořadí:

  • Zásady jednotlivých volání (provést jednou za operaci)
  • Zásady opakování
  • Zásady pro každý pokus (provést při každém pokusu)
  • Zásady ověřování.
  • Přenos HTTP.

Osvědčené postupy

Pokud je to možné, použijte výchozí nastavení.

Výchozí konfigurace opakování funguje dobře pro většinu scénářů. Přizpůsobte si ho jenom v případech, kdy máte specifické požadavky.

Pokyny pro přizpůsobení

Při přizpůsobení chování opakování pokusů:

  • Použijte exponenciální zálohu: Slouží k zabránění zahlcení služeb během obnovení.
  • Nastavte přiměřené limity: Omezte celkovou dobu opakování, aby se zabránilo neomezenému čekání.
  • Monitorování metrik opakovaných pokusů: Sledujte sazby opakovaných pokusů v produkci a identifikujte problémy.
  • Zvažte jističe: Implementujte vzory jističe pro scénáře s velkým objemem.

Co neopakovat

Vyhněte se opakování těchto typů chyb:

  • Selhání ověřování (401, 403): Chyby ověřování vyžadují opravu přihlašovacích údajů, nikoli opakování.
  • Chyby klienta (400, 404): Chyby klienta označují problémy se samotným požadavkem.
  • Chyby obchodní logiky: Chyby specifické pro aplikaci, které se nevyřešily opakovanými pokusy.

Provozní excelentnost

  • ID korelace protokolu: Zahrňte x-ms-client-request-id do protokolů pro podporu Azure.
  • Nastavte vhodné časové limity: Vyvážení mezi spolehlivostí a uživatelským prostředím
  • Chování aplikace při opakování testů: Ověřte, že vaše aplikace řádně zvládá opakované pokusy.
  • Monitorování výkonu: Sledujte latence P95/P99 (metriky latence na základě percentilu), včetně režie na opakování.