Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Wanneer u een aanroep uitvoert naar een Azure-service met behulp van de Azure SDK voor Python, gaat uw aanvraag niet rechtstreeks naar de Azure-service. Het maakt niet uit of het Azure Blob Storage, Azure Key Vault, Azure Cosmos DB of een andere HTTP-service is. In plaats daarvan loopt uw aanvraag via een geavanceerde HTTP-pijplijn die kritieke kruislingse problemen automatisch afhandelt.
Begrijpen hoe de HTTP-pijplijn werkt, is essentieel voor het bouwen van robuuste en krachtige toepassingen. De pijplijn:
- Beheert herhaalde pogingen voor tijdelijke fouten.
- Hiermee wordt verificatie afgehandeld.
- Biedt mogelijkheden voor logboekregistratie.
- Hiermee kunt u aangepast gedrag toevoegen wanneer dat nodig is.
Deze kennis helpt u bij het opsporen van prestatieproblemen, het optimaliseren van tolerantie en het aanpassen van de interactie van uw toepassing met Azure-services.
Wat is de HTTP-pijplijn?
De Azure SDK voor Python maakt gebruik van een interne HTTP-pijplijnarchitectuur om alle aanvragen en antwoorden te verwerken. Deze pijplijn bestaat uit een reeks beleidsregels die op volgorde worden uitgevoerd. Elk beleid is verantwoordelijk voor een specifiek aspect van de HTTP-communicatie. U kunt de pijplijn beschouwen als een keten van verwerkingsstappen:
Client Request → Retry Policy → Authentication Policy → Logging Policy → HTTP Transport → Azure Service
↓
Client Response ← Retry Policy ← Authentication Policy ← Logging Policy ← HTTP Transport ← Response
Elk beleid in de pijplijn kan het volgende doen:
- Wijzig de aanvraag voordat deze wordt verzonden.
- Het antwoord verwerken nadat het is ontvangen.
- Voer acties uit, zoals het opnieuw proberen van mislukte aanvragen.
- Voeg headers, logboekgegevens toe of implementeer aangepaste logica.
Sleutelbeleid in de pijplijn
De Azure SDK voor Python bevat verschillende ingebouwde beleidsregels die algemene scenario's verwerken:
-
RetryPolicy: Probeert automatisch opnieuw verzoeken die mislukken door tijdelijke fouten. Dit beleid implementeert intelligente logica voor opnieuw proberen met exponentieel uitstel om overweldigende services tijdens storingen te voorkomen. -
BearerTokenCredentialPolicy: hiermee beheert u verificatie door automatisch toegangstokens te verkrijgen en te vernieuwen. Dit beleid zorgt ervoor dat uw aanvragen geldige verificatiereferenties bevatten zonder handmatig tokenbeheer. -
NetworkTraceLoggingPolicy: legt gedetailleerde informatie vast over HTTP-aanvragen en -antwoorden voor foutopsporingsdoeleinden. Dit beleid is van groot belang wanneer u communicatieproblemen oplost. -
HttpTransport: De laagste laag van de pijplijn die HTTP-aanvragen daadwerkelijk via het netwerk verzendt. In de Azure SDK voor Python wordt dit beleid doorgaans geïmplementeerd met behulp van aanvragen of aiohttp voor asynchrone bewerkingen.
Ander beleid
-
RedirectPolicy: verwerkt HTTP-omleidingen automatisch. -
DistributedTracingPolicy: integreert met gedistribueerde traceringssystemen voor bewaking. -
ProxyPolicy: routes aanvragen via HTTP-proxy's wanneer deze zijn geconfigureerd. -
UserAgentPolicy: Voegt SDK-versiegegevens toe om headers aan te vragen.
Gedrag voor opnieuw proberen
De Azure SDK voor Python implementeert intelligente logica voor opnieuw proberen om tijdelijke fouten automatisch af te handelen. Als u dit gedrag begrijpt, kunt u tolerantere toepassingen bouwen.
Voorwaarden die automatisch opnieuw zijn geprobeerd
De SDK probeert aanvragen voor deze HTTP-statuscodes opnieuw uit te voeren:
- 408 Verzoek Time-out: De server heeft gewacht op de aanvraag en is daardoor in de time-out gegaan.
- 429 Te veel aanvragen: snelheidsbeperking is van kracht.
- 500 Interne serverfout: tijdelijk serverprobleem.
- 502 Ongeldige gateway: tijdelijk netwerkprobleem.
- 503 Service niet beschikbaar: Service tijdelijk niet beschikbaar.
- 504 Gateway Time-out: Uitvaltijd limiet van een gateway of proxy.
Standaardconfiguratie voor opnieuw proberen
De standaardinstellingen voor opnieuw proberen bieden een goede balans tussen tolerantie en prestaties:
- Maximum aantal nieuwe pogingen: 3
- Opnieuw proberen-modus: Exponentiële back-off
- Basisvertraging: 0,8 seconden
- Maximale vertraging: 60 seconden
- Maximale totale tijd voor opnieuw proberen: 120 seconden
De exponentiële uitstelberekening volgt dit patroon:
delay = min(base_delay * (2 ** retry_attempt), max_delay)
Herhalingspogingen aanpassen
U kunt het gedrag van nieuwe pogingen aanpassen wanneer u SDK-clients maakt die overeenkomen met de specifieke vereisten van uw toepassing.
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
)
Herhalingen uitschakelen
Voor scenario's waarbij nieuwe pogingen niet geschikt zijn:
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
)
Gedrag voor opnieuw proberen vaststellen en fouten opsporen
Inzicht in wanneer en waarom nieuwe pogingen optreden, is van cruciaal belang voor het oplossen van prestatieproblemen.
SDK-logboekregistratie inschakelen
De Azure SDK voor Python maakt gebruik van het standaardframework voor logboekregistratie van Python:
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
Identificeer herhaalpatronen
Zoek naar logboekvermeldingen zoals:
Retry attempt 1 for request [GET] https://myaccount.blob.core.windows.net/container/blob
Waiting 0.8 seconds before retry
Veelvoorkomende valkuilen voor nieuwe pogingen
- Niet-tijdelijke fouten opnieuw proberen: De SDK probeert clientfouten (4xx) niet opnieuw, met uitzondering van 408 en 429.
- Latentie voor opnieuw proberen wordt genegeerd: Vergeet niet dat nieuwe pogingen latentie toevoegen aan mislukte bewerkingen.
- Onvoldoende time-out instellen: Zorg ervoor dat uw totale bewerkingstime-out rekening houdt met vertragingen door opnieuw proberen.
Geavanceerd: Aangepast beleid toevoegen
U kunt de pijplijn uitbreiden met aangepast beleid voor gespecialiseerde scenario's.
Aangepast beleid maken
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
Aangepast beleid toepassen
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
)
Volgorde van beleid
Beleidsregels worden uitgevoerd in een specifieke volgorde:
- Beleid per aanroep (één keer per bewerking uitvoeren).
- Beleid voor opnieuw proberen.
- Beleid per nieuwe poging (wordt uitgevoerd bij elke poging).
- Verificatiebeleid.
- HTTP-transport.
Beste praktijken
Standaardinstellingen gebruiken indien mogelijk
De standaardconfiguratie voor opnieuw proberen werkt goed voor de meeste scenario's. Pas alleen aan wanneer u specifieke vereisten hebt.
Aanpassingsrichtlijnen
Wanneer u het gedrag voor opnieuw proberen aanpast:
- Exponentieel uitstel gebruiken: Gebruik dit om overweldigende services tijdens het herstel te voorkomen.
- Stel redelijke limieten in: Beperk de totale wachttijd voor nieuwe pogingen om onbepaalde wachttijd te voorkomen.
- Metrische gegevens voor opnieuw proberen bewaken: Volg de frequenties voor nieuwe pogingen in productie om problemen te identificeren.
- Overweeg circuitonderbrekers: Implementeer circuitonderbrekerpatronen voor scenario's met grote volumes.
Wat u niet opnieuw moet proberen
Vermijd het opnieuw proberen van deze typen fouten:
- Verificatiefouten (401, 403): Verificatiefouten vereisen het herstellen van referenties, niet opnieuw proberen.
- Clientfouten (400, 404): Clientfouten geven problemen aan met de aanvraag zelf.
- Bedrijfslogicafouten: Toepassingsspecifieke fouten die niet worden opgelost met nieuwe pogingen.
Operationele uitmuntendheid
-
Correlatie-id's voor logboeken: Opnemen
x-ms-client-request-idin logboeken voor Azure-ondersteuning. - Stel de juiste time-outs in: Balans tussen betrouwbaarheid en gebruikerservaring.
- Gedrag voor opnieuw proberen testen: Controleer of uw toepassing nieuwe pogingen correct afhandelt.
- Prestaties bewaken: Houd P95/P99-latenties (metrische latentiegegevens op basis van percentiel) bij, inclusief overhead voor opnieuw proberen.