A HTTP-folyamat ismertetése és újrapróbálkozása a Pythonhoz készült Azure SDK-ban

Ha bármely Azure-szolgáltatáshoz az Azure SDK for Python használatával hív meg, a kérés nem közvetlenül az Azure szolgáltatáshoz kerül. Nem számít, hogy az Azure Blob Storage, az Azure Key Vault, az Azure Cosmos DB vagy bármely más HTTP-alapú szolgáltatás. Ehelyett a kérés egy kifinomult HTTP-folyamaton halad át, amely automatikusan kezeli a kritikus keresztvágási problémákat.

A HTTP-folyamat működésének megértése elengedhetetlen a robusztus, hatékony alkalmazások létrehozásához. A folyamat:

  • Kezeli az átmeneti hibák újrapróbálkozását.
  • Kezeli a hitelesítést.
  • Naplózási képességeket biztosít.
  • Lehetővé teszi, hogy szükség esetén egyéni viselkedést adjon hozzá.

Ez a tudás segít a teljesítményproblémák hibakeresésében, a rugalmasság optimalizálásában és az alkalmazás Azure-szolgáltatásokkal való interakciójának testreszabásában.

Mi a HTTP-folyamat?

Az Azure SDK for Python egy belső HTTP-folyamatarchitektúrát használ az összes kérés és válasz feldolgozásához. Ez a folyamat több szabályzatból áll, amelyek egymás után futnak. Minden szabályzat a HTTP-kommunikáció egy adott aspektusáért felelős. A folyamat a feldolgozási lépések láncaként jelenik meg:

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

A folyamat minden szabályzata a következő lehet:

  • Mielőtt elküldené, módosítsa a kérést.
  • A válasz feldolgozása a beérkezés után.
  • Olyan műveleteket hajt végre, mint a sikertelen kérések újrapróbálkozása.
  • Fejlécek, naplóadatok hozzáadása vagy egyéni logika implementálása.

Kulcsszabályzatok a folyamatban

A Pythonhoz készült Azure SDK számos beépített szabályzatot tartalmaz, amelyek a gyakori forgatókönyveket kezelik:

  • RetryPolicy: Automatikusan újrapróbálkozza az átmeneti hibák miatt sikertelen kéréseket. Ez a szabályzat intelligens újrapróbálkozási logikát implementál exponenciális visszalépéssel, hogy elkerülje a túlterhelt szolgáltatásokat a kimaradások során.
  • BearerTokenCredentialPolicy: A hitelesítés kezelése a hozzáférési jogkivonatok automatikus beszerzésével és frissítésével. Ez a szabályzat biztosítja, hogy a kérések érvényes hitelesítési hitelesítő adatokat tartalmazzanak manuális jogkivonat-kezelés nélkül.
  • NetworkTraceLoggingPolicy: Részletes információkat rögzít a HTTP-kérelmekről és a válaszokról hibakeresés céljából. Ez a szabályzat felbecsülhetetlen értékű a kommunikációs problémák elhárítása során.
  • HttpTransport: A folyamat legalacsonyabb rétege, amely http-kéréseket küld a hálózaton keresztül. A Pythonhoz készült Azure SDK-ban ezt a szabályzatot általában kérések vagy aiohttp használatával implementáljuk aszinkron műveletekhez.

Egyéb szabályzatok

  • RedirectPolicy: Automatikusan kezeli a HTTP-átirányításokat.
  • DistributedTracingPolicy: Integrálható elosztott nyomkövetési rendszerekkel a monitorozáshoz.
  • ProxyPolicy: Konfigurálva HTTP-proxykon keresztül irányítja a kéréseket.
  • UserAgentPolicy: Hozzáadja az SDK verzióadatait a kérelemfejlécekhez.

Újrapróbálkozás viselkedése

Az Azure SDK for Python intelligens újrapróbálkozási logikát implementál az átmeneti hibák automatikus kezeléséhez. Ennek a viselkedésnek a megértése segít rugalmasabb alkalmazások létrehozásában.

Automatikusan újrapróbálkozott feltételek

Az SDK újrapróbálkozásokat kezdeményez az alábbi HTTP-állapotkódokhoz:

  • 408 Kérelem időtúllépése: A kiszolgáló időtúllépett, miközben a kérésre várt.
  • 429 Túl sok kérés: A sebességkorlátozás érvényben van.
  • 500 belső kiszolgálóhiba: Ideiglenes kiszolgálóhiba.
  • 502 Hibás átjáró: Ideiglenes hálózati probléma.
  • 503 Szolgáltatás nem érhető el: A szolgáltatás átmenetileg nem érhető el.
  • 504 Átjáró időtúllépése: Átjáró vagy proxy időtúllépése.

Alapértelmezett újrapróbálkozás konfigurálása

Az alapértelmezett újrapróbálkozési beállítások jó egyensúlyt biztosítanak a rugalmasság és a teljesítmény között:

  • Újrapróbálkozási kísérletek maximális száma: 3
  • Újrapróbálkozási mód: Exponenciális visszalépés
  • Alapkésés: 0,8 másodperc
  • Maximális késleltetés: 60 másodperc
  • Az újrapróbálkozás maximális időtartama: 120 másodperc

Az exponenciális visszalépés számítása a következő mintát követi:

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

Újrapróbálkozések testreszabása

Az újrapróbálkozási viselkedés testre szabható, ha SDK-ügyfeleket hoz létre az alkalmazás egyedi igényeinek megfelelően.

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
)

Újrapróbálkozések letiltása

Olyan forgatókönyvek esetén, ahol az újrapróbálkozások nem megfelelőek:

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
)

Az újrapróbálkozás viselkedésének diagnosztizálása és hibakeresése

A teljesítményproblémák elhárításához elengedhetetlen az újrapróbálkozások időpontjának és okának megértése.

SDK-naplózás engedélyezése

A Pythonhoz készült Azure SDK a Python szabványos naplózási keretrendszerét használja:

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

Újrapróbálkozási minták azonosítása

Keresse meg a következő naplóbejegyzéseket:

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

Gyakori újrapróbálkozások buktatói

  • Nem átmeneti hibák újrapróbálkozása: Az SDK nem próbálkozik újra az ügyfélhibákkal (4xx), kivéve a 408-at és a 429-et.
  • Az újrapróbálkozási késés figyelmen kívül hagyása: Ne feledje, hogy az újrapróbálkozási műveletek késést adnak a sikertelen műveletekhez.
  • Nem megfelelő időtúllépés: Győződjön meg róla, hogy a teljes művelet időtúllépése figyelembe veszi az újrapróbálkozási késéseket.

Speciális: Egyéni szabályzatok hozzáadása

A folyamatot speciális forgatókönyvek egyéni szabályzataival bővítheti.

Egyéni szabályzat létrehozása

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

Egyéni szabályzatok alkalmazása

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
)

Szabályzatrendezés

A szabályzatok meghatározott sorrendben futnak:

  • Hívásonkénti szabályzatok (műveletenként egyszer hajtják végre).
  • Újrapróbálási irányelv.
  • Újrapróbálkozási irányelvek (mindegyik próbálkozásnál történő végrehajtás).
  • Hitelesítési szabályzat.
  • HTTP-átvitel.

Ajánlott eljárások

Ha lehetséges, használja az alapértelmezett beállításokat

Az alapértelmezett újrapróbálkozások konfigurálása a legtöbb forgatókönyv esetében jól működik. Csak akkor szabhat testre, ha adott követelményekkel rendelkezik.

Testreszabási irányelvek

Az újrapróbálkozás viselkedésének testreszabásakor:

  • Exponenciális visszalépés használata: Használatával megelőzheti a túlterhelt szolgáltatásokat a helyreállítás során.
  • Ésszerű korlátok beállítása: A határozatlan idejű várakozás elkerülése érdekében a teljes újrapróbálkozás időtartamának korlátja.
  • Újrapróbálkozások metrikáinak figyelése: A problémák azonosítása érdekében figyelje a működő rendszerbeli újrapróbálkozási arányokat.
  • Fontolja meg az áramkör-megszakítókat: Áramkör-megszakító minták implementálása nagy forgalmú forgatókönyvekhez.

Mit ne próbálkozzon újra?

Kerülje az ilyen típusú hibák újrapróbálkozását:

  • Hitelesítési hibák (401, 403): A hitelesítési hibákhoz meg kell javítani a hitelesítő adatokat, és nem kell újrapróbálkoznia.
  • Ügyfélhibák (400, 404): Az ügyfélhibák a kéréssel kapcsolatos problémákat jelzik.
  • Üzleti logikával kapcsolatos hibák: Alkalmazásspecifikus hibák, amelyek nem oldódnak meg újrapróbálkozással.

Működési kiválóság

  • Naplókorrelációs azonosítók: Tartalmazza x-ms-client-request-id az Azure támogatás számára készült naplókban.
  • Állítsa be a megfelelő időtúllépéseket: Egyensúly a megbízhatóság és a felhasználói élmény között.
  • Újrapróbálkozás tesztelése: Ellenőrizze, hogy az alkalmazás megfelelően kezeli-e az újrapróbálkozásokat.
  • Teljesítmény figyelése: Kövesse nyomon a P95/P99 késéseket (percentilisalapú késési metrikákat), beleértve az újrapróbálkozási többletterhelést is.