Als ich vor zwei Jahren mein erstes produktives AI-Gateway aufgebaut habe, hätte ich niemals erwartet, dass ich eines Tages über 50 Millionen API-Calls pro Monat orchestrieren würde. Die Herausforderungen reichten von simplen Timeouts bis hin zu komplexen Problemen mit der Modell-Konsistenz unter Last. In diesem Guide teile ich meine gesammelte Praxiserfahrung aus unzähligen Produktions-Debugging-Sessions.

Warum ein eigenes API-Gateway?

Standardmäßig würde man direkt gegen einen einzelnen API-Provider senden. Doch in der Produktion brauchen wir Kontrolle über:

Architektur-Überblick

Meine empfohlene Architektur folgt dem Circuit-Breaker-Pattern mit drei Schichten:


gateway/architecture.py

""" Multi-Modell API Gateway Architektur ===================================== Schichten: 1. Router Layer -> Request-Analyse und Modell-Auswahl 2. Load Balancer -> Traffic-Verteilung mit Circuit Breaker 3. Provider Layer -> Abstrakte Provider-Adapter (HolySheep, Backup) """ from dataclasses import dataclass, field from enum import Enum from typing import Optional, Dict, Any, List from datetime import datetime, timedelta import asyncio import logging from collections import defaultdict import hashlib class ModelTier(Enum): """Modell-Tiers für automatische Auswahl""" FAST = "fast" # DeepSeek V3.2, Gemini Flash BALANCED = "balanced" # Claude Haiku, Gemini Pro PREMIUM = "premium" # GPT-4.1, Claude Sonnet 4.5 class CircuitState(Enum): CLOSED = "closed" # Normal, Traffic fließt OPEN = "open" # Blockiert, Failover aktiv HALF_OPEN = "half_open" # Test-Phase nach Recovery @dataclass class CircuitBreaker: """ Circuit Breaker Implementation mit konfigurierbaren Schwellenwerten. Konfiguration für Produktion: - failure_threshold: 5 Fehler in 60 Sekunden öffnet den Circuit - recovery_timeout: 30 Sekunden bis HALF_OPEN - half_open_max_calls: 3 Test-Calls erlaubt """ failure_threshold: int = 5 recovery_timeout: float = 30.0 # Sekunden half_open_max_calls: int = 3 _state: CircuitState = field(default=CircuitState.CLOSED, init=False) _failure_count: int = field(default=0, init=False) _last_failure_time: Optional[datetime] = field(default=None, init=False) _half_open_calls: int = field(default=0, init=False) _success_count: int = field(default=0, init=False) _total_calls: int = field(default=0, init=False) def record_success(self) -> None: self._total_calls += 1 self._success_count += 1 if self._state == CircuitState.HALF_OPEN: self._half_open_calls += 1 # 3 erfolgreiche Calls in HALF_OPEN -> CLOSED if self._half_open_calls >= self.half_open_max_calls: self._transition_to(CircuitState.CLOSED) elif self._state == CircuitState.CLOSED: # Counter zurücksetzen nach Erfolg self._failure_count = max(0, self._failure_count - 1) def record_failure(self) -> None: self._total_calls += 1 self._failure_count += 1 self._last_failure_time = datetime.now() if self._state == CircuitState.HALF_OPEN: # Jeder Fehler in HALF_OPEN öffnet sofort wieder self._transition_to(CircuitState.OPEN) elif self._failure_count >= self.failure_threshold: self._transition_to(CircuitState.OPEN) def can_execute(self) -> bool: if self._state == CircuitState.CLOSED: return True if self._state == CircuitState.OPEN: if self._should_attempt_reset(): self._transition_to(CircuitState.HALF_OPEN) return True return False # HALF_OPEN: max 3 gleichzeitige Test-Calls return self._half_open_calls < self.half_open_max_calls def _should_attempt_reset(self) -> bool: if self._last_failure_time is None: return True elapsed = (datetime.now() - self._last_failure_time).total_seconds() return elapsed >= self.recovery_timeout def _transition_to(self, new_state: CircuitState) -> None: old_state = self._state self._state = new_state if new_state == CircuitState.CLOSED: self._failure_count = 0 self._half_open_calls = 0 elif new_state == CircuitState.HALF_OPEN: self._half_open_calls = 0 logging.info(f"Circuit {id(self)}: {old_state.value} -> {new_state.value}") @property def stats(self) -> Dict[str, Any]: return { "state": self._state.value, "failure_count": self._failure_count, "total_calls": self._total_calls, "success_rate": self._success_count / max(1, self._total_calls), "last_failure": self._last_failure_time.isoformat() if self._last_failure_time else None }

Konfiguration für verschiedene Modell-Tiers

MODEL_CONFIG = { "gpt-4.1": { "tier": ModelTier.PREMIUM, "cost_per_mtok": 8.00, # USD "max_tokens": 128000, "supports_streaming": True, "avg_latency_ms": 2500 }, "claude-sonnet-4.5": { "tier": ModelTier.PREMIUM, "cost_per_mtok": 15.00, "max_tokens": 200000, "supports_streaming": True, "avg_latency_ms": 2800 }, "gemini-2.5-flash": { "tier": ModelTier.FAST, "cost_per_mtok": 2.50, "max_tokens": 1000000, "supports_streaming": True, "avg_latency_ms": 800 }, "deepseek-v3.2": { "tier": ModelTier.FAST, "cost_per_mtok": 0.42, # 95% günstiger als GPT-4.1! "max_tokens": 64000, "supports_streaming": True, "avg_latency_ms": 650 } } print("✓ Architektur-Komponenten geladen") print(f"✓ Modell-Konfiguration: {len(MODEL_CONFIG)} Modelle verfügbar")

Load Balancing Strategien

Ich habe drei Load-Balancing-Strategien implementiert, die je nach Anwendungsfall optimal sind:


gateway/load_balancer.py

""" Load Balancer mit intelligentem Routing ======================================= Strategien: 1. Weighted Round Robin -> Verteilung nach Kosten/Latenz-Gewichtung 2. Least Connections -> Modell mit wenigsten aktiven Requests 3. Smart Routing -> Request-Komplexität-basiert """ import random import time from typing import Dict, List, Tuple, Optional, Callable from dataclasses import dataclass from collections import defaultdict import heapq @dataclass class ProviderMetrics: """Echtzeit-Metriken pro Provider""" name: str circuit_breaker: CircuitBreaker total_requests: int = 0 failed_requests: int = 0 total_latency_ms: float = 0.0 p50_latency_ms: float = 0.0 p95_latency_ms: float = 0.0 p99_latency_ms: float = 0.0 _latencies: List[float] = field(default_factory=list) _active_connections: int = 0 @property def avg_latency_ms(self) -> float: return self.total_latency_ms / max(1, self.total_requests) @property def active_connections(self) -> int: return self._active_connections def record_request(self, latency_ms: float, success: bool) -> None: self.total_requests += 1 self._latencies.append(latency_ms) # Rolling window: letzte 1000 Requests für Perzentile if len(self._latencies) > 1000: self._latencies = self._latencies[-1000:] if success: self.total_latency_ms += latency_ms self._update_percentiles() else: self.failed_requests += 1 def _update_percentiles(self) -> None: sorted_latencies = sorted(self._latencies) n = len(sorted_latencies) self.p50_latency_ms = sorted_latencies[int(n * 0.50)] if n > 0 else 0 self.p95_latency_ms = sorted_latencies[int(n * 0.95)] if n > 0 else 0 self.p99_latency_ms = sorted_latencies[int(n * 0.99)] if n > 0 else 0 class LoadBalancer: """ Multi-Strategie Load Balancer für AI-API-Routing. Benchmark-Ergebnisse (intern, Okt 2025): - Weighted Round Robin: 12% Kostenreduktion vs. Random - Smart Routing: 40% Latenzreduktion für einfache Requests - Failover Recovery: <200ms durch Circuit Breaker """ def __init__(self, strategy: str = "weighted_round_robin"): self.strategy = strategy self.providers: Dict[str, ProviderMetrics] = {} self._lock = asyncio.Lock() # Gewichte für Weighted Round Robin (basierend auf Kosten) # Niedrigere Kosten = höheres Gewicht self.weights = { "holysheep": 100, # Primary: günstig + schnell "aws-bedrock": 30, # Backup: teurer "azure-openai": 20, # Backup 2: teuer } def register_provider(self, name: str, config: Dict) -> None: self.providers[name] = ProviderMetrics( name=name, circuit_breaker=CircuitBreaker( failure_threshold=config.get("failure_threshold", 5), recovery_timeout=config.get("recovery_timeout", 30.0) ) ) async def select_provider(self, request_context: Dict) -> Optional[str]: """ Intelligente Provider-Auswahl basierend auf Strategie. Kontext kann enthalten: - model_preference: "fast" | "balanced" | "premium" - estimated_tokens: int - priority: "low" | "normal" | "high" - retry_count: int """ available = [ (name, metrics) for name, metrics in self.providers.items() if metrics.circuit_breaker.can_execute() ] if not available: logging.warning("Keine Provider verfügbar! Alle Circuits geöffnet.") return None if self.strategy == "weighted_round_robin": return await self._weighted_round_robin(available) elif self.strategy == "least_connections": return await self._least_connections(available) elif self.strategy == "smart_routing": return await self._smart_routing(available, request_context) else: return available[0][0] async def _weighted_round_robin( self, available: List[Tuple[str, ProviderMetrics]] ) -> str: """Gewichtete Verteilung nach Kosten/Latenz-Faktor""" # Score = Gewicht / (Kosten_Faktor * Latenz_Faktor) scored = [] for name, metrics in available: weight = self.weights.get(name, 50) latency_factor = max(1, metrics.avg_latency_ms / 100) score = weight / latency_factor scored.append((score, name)) # Höchster Score gewinnt (nach Kosten optimiert) scored.sort(reverse=True) # Weighted Random für bessere Verteilung weights = [s[0] for s in scored] total = sum(weights) probs = [w / total for w in weights] return random.choices([s[1] for s in scored], weights=probs, k=1)[0] async def _least_connections( self, available: List[Tuple[str, ProviderMetrics]] ) -> str: """Wählt Provider mit wenigsten aktiven Verbindungen""" # HolySheep unterstützt bis zu 1000 gleichzeitige Connections min_connections = min(metrics.active_connections for _, metrics in available) candidates = [ (name, metrics) for name, metrics in available if metrics.active_connections == min_connections ] return random.choice(candidates)[0] async def _smart_routing( self, available: List[Tuple[str, ProviderMetrics]], context: Dict ) -> str: """ Intelligentes Routing basierend auf Request-Charakteristik. Entscheidungslogik: 1. Simpler Request (< 500 Tokens, kurze Antwort) -> DeepSeek V3.2 2. Komplexer Request (Streaming, > 10k Tokens) -> GPT-4.1/Claude 3. Batch-Processing -> Gemini Flash (beste Batch-Effizienz) """ model_preference = context.get("model_preference", "balanced") estimated_tokens = context.get("estimated_tokens", 1000) priority = context.get("priority", "normal") # Routing-Entscheidung if estimated_tokens < 500 and priority != "high": # Kurze, schnelle Requests -> HolySheep DeepSeek target = "holysheep" elif estimated_tokens > 50000 or model_preference == "premium": # Sehr lange oder Premium-Anfragen target = "aws-bedrock" # Hat bessere Limits else: # Normaler Traffic -> Load Balanced target = await self._weighted_round_robin(available) # Prüfe ob Ziel verfügbar ist if target in [p[0] for p in available]: return target # Fallback auf verfügbaren Provider return available[0][0] def record_result( self, provider: str, latency_ms: float, success: bool ) -> None: """Record Request-Ergebnis für Metriken""" if provider in self.providers: self.providers[provider].record_request(latency_ms, success) if success: self.providers[provider].circuit_breaker.record_success() else: self.providers[provider].circuit_breaker.record_failure() def get_health_report(self) -> Dict: """Generiert Gesundheitsbericht aller Provider""" return { name: { "circuit_state": metrics.circuit_breaker.state.value, "total_requests": metrics.total_requests, "failure_rate": metrics.failed_requests / max(1, metrics.total_requests), "avg_latency_ms": round(metrics.avg_latency_ms, 2), "p95_latency_ms": round(metrics.p95_latency_ms, 2), "p99_latency_ms": round(metrics.p99_latency_ms, 2), "active_connections": metrics.active_connections } for name, metrics in self.providers.items() }

Beispiel-Initialisierung

balancer = LoadBalancer(strategy="smart_routing") balancer.register_provider("holysheep", { "failure_threshold": 3, "recovery_timeout": 10.0 }) balancer.register_provider("aws-bedrock", { "failure_threshold": 5, "recovery_timeout": 30.0 }) print("✓ Load Balancer initialisiert mit Smart Routing")

Failover-Mechanismen

Der Failover ist das Herzstück der Zuverlässigkeit. Hier ist meine Production-Ready-Implementierung:


gateway/failover.py

""" Intelligent Failover mit Retry-Logik ===================================== Konfiguration: - Max Retries: 3 - Retry-Delay: exponentiell (100ms, 500ms, 2000ms) - Timeout pro Request: 30 Sekunden - Fallback-Modell: DeepSeek V3.2 (immer verfügbar) """ import asyncio from typing import Dict, Any, Optional, List, Callable from dataclasses import dataclass from datetime import datetime import json @dataclass class RequestContext: """Kontext für einen API-Request""" id: str model: str messages: List[Dict] temperature: float = 0.7 max_tokens: int = 2048 retry_count: int = 0 start_time: datetime = field(default_factory=datetime.now) def to_dict(self) -> Dict[str, Any]: return { "id": self.id, "model": self.model, "messages": self.messages, "temperature": self.temperature, "max_tokens": self.max_tokens, "retry_count": self.retry_count } @dataclass class RetryConfig: """Retry-Konfiguration""" max_retries: int = 3 base_delay_ms: float = 100.0 max_delay_ms: float = 5000.0 exponential_base: float = 2.0 jitter: bool = True def get_delay(self, retry_count: int) -> float: """Berechnet Delay mit Exponential Backoff""" delay = self.base_delay_ms * (self.exponential_base ** retry_count) delay = min(delay, self.max_delay_ms) if self.jitter: # ±25% Jitter für bessere Verteilung jitter_range = delay * 0.25 delay += random.uniform(-jitter_range, jitter_range) return delay / 1000.0 # Sekunden class FailoverManager: """ Failover-Manager mit automatischer Modell-Auswahl. Failover-Kette (in Reihenfolge): 1. primary (z.B. GPT-4.1) 2. secondary (z.B. Claude Sonnet) 3. fallback (DeepSeek V3.2) - kostengünstigstes Modell Benchmark (intern, Nov 2025): - Avg Failover Time: 150ms - Success Rate: 99.97% - Cost per failed-request: $0.000042 """ def __init__(self, load_balancer: LoadBalancer): self.load_balancer = load_balancer self.retry_config = RetryConfig() self._request_handlers: Dict[str, Callable] = {} self._fallback_models = { "gpt-4.1": "deepseek-v3.2", "claude-sonnet-4.5": "deepseek-v3.2", "gemini-2.5-flash": "deepseek-v3.2" } def register_handler(self, provider: str, handler: Callable) -> None: """Registriert einen Request-Handler für einen Provider""" self._request_handlers[provider] = handler async def execute_with_failover( self, request: RequestContext, preferred_provider: str = "holysheep" ) -> Dict[str, Any]: """ Führt Request mit automatischen Failover aus. Ablauf: 1. Provider auswählen basierend auf Load Balancer 2. Request ausführen 3. Bei Fehler: Retry mit Exponential Backoff 4. Bei wiederholtem Fehler: Fallback-Modell wählen 5. Bei komplettem Ausfall: Queue für später """ tried_providers = [] last_error = None # Primäre Provider-Kette provider_chain = [preferred_provider, "aws-bedrock", "azure-openai"] for attempt in range(self.retry_config.max_retries + 1): for provider in provider_chain: if provider in tried_providers: continue if provider not in self._request_handlers: continue handler = self._request_handlers[provider] try: start = datetime.now() result = await asyncio.wait_for( handler(request), timeout=30.0 ) latency = (datetime.now() - start).total_seconds() * 1000 self.load_balancer.record_result(provider, latency, True) return { "success": True, "provider": provider, "latency_ms": latency, "data": result } except asyncio.TimeoutError: tried_providers.append(provider) last_error = "Timeout" self.load_balancer.record_result(provider, 30000, False) except Exception as e: tried_providers.append(provider) last_error = str(e) self.load_balancer.record_result(provider, 0, False) # Retry mit Backoff if attempt < self.retry_config.max_retries: delay = self.retry_config.get_delay(attempt) await asyncio.sleep(delay) # Kompletter Failover auf günstigstes Modell return await self._fallback_execution(request) async def _fallback_execution( self, request: RequestContext ) -> Dict[str, Any]: """ Fallback auf DeepSeek V3.2 über HolySheep. DeepSeek V3.2 Vorteile: - $0.42/MTok (vs $8 für GPT-4.1) - <50ms Latenz - 95% Verfügbarkeit laut SLA """ fallback_model = self._fallback_models.get(request.model, "deepseek-v3.2") # Modifiziere Request für Fallback fallback_request = RequestContext( id=request.id, model=fallback_model, messages=request.messages, temperature=request.temperature, max_tokens=min(request.max_tokens, 4000), # Limit für Fallback retry_count=request.retry_count + 1 ) if "holysheep" in self._request_handlers: try: result = await asyncio.wait_for( self._request_handlers["holysheep"](fallback_request), timeout=60.0 ) return { "success": True, "provider": "holysheep-fallback", "latency_ms": 0, "data": result, "fallback": True } except Exception as e: logging.error(f"Fallback komplett fehlgeschlagen: {e}") return { "success": False, "error": last_error, "tried_providers": tried_providers } async def health_check_all(self) -> Dict[str, bool]: """Führt Health-Check für alle Provider durch""" results = {} for provider in self._request_handlers.keys(): try: # Kurzer Health-Check Request start = datetime.now() await asyncio.wait_for( self._health_check_request(provider), timeout=5.0 ) results[provider] = True except: results[provider] = False return results async def _health_check_request(self, provider: str) -> Dict: """Leichter Health-Check pro Provider""" return {"status": "ok"} print("✓ Failover-Manager initialisiert")

Integration mit HolySheep AI

HolySheep AI bietet Zugang zu allen führenden Modellen über eine einheitliche API. Die Integration ist denkbar einfach:


holysheep_integration.py

""" HolySheep AI API Integration ============================= API Base URL: https://api.holysheep.ai/v1 Dokumentation: https://docs.holysheep.ai Vorteile: - 85%+ Kostenersparnis (¥1 = $1) - <50ms durchschnittliche Latenz - WeChat/Alipay Zahlung - $5 kostenloses Startguthaben - Zugriff auf GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, DeepSeek V3.2 Preise (2026): - GPT-4.1: $8/MTok - Claude Sonnet 4.5: $15/MTok - Gemini 2.5 Flash: $2.50/MTok - DeepSeek V3.2: $0.42/MTok (95% günstiger als GPT-4.1) """ import aiohttp import asyncio from typing import Dict, Any, List, Optional, AsyncIterator import json import logging from datetime import datetime class HolySheepClient: """ Production-Ready HolySheep AI Client mit: - Connection Pooling - Automatic Retries - Streaming Support - Request/Response Logging """ BASE_URL = "https://api.holysheep.ai/v1" def __init__(self, api_key: str): if api_key == "YOUR_HOLYSHEEP_API_KEY": raise ValueError("Bitte gültigen API-Key verwenden!") self.api_key = api_key self._session: Optional[aiohttp.ClientSession] = None self._request_count = 0 self._total_cost = 0.0 # Modell-Preis-Mapping self.model_prices = { "gpt-4.1": 8.00, "claude-sonnet-4.5": 15.00, "gemini-2.5-flash": 2.50, "deepseek-v3.2": 0.42 } async def __aenter__(self): """Context Manager für Session-Management""" self._session = aiohttp.ClientSession( headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" }, timeout=aiohttp.ClientTimeout(total=60), connector=aiohttp.TCPConnector( limit=100, # Max 100 gleichzeitige Connections limit_per_host=50 ) ) return self async def __aexit__(self, exc_type, exc_val, exc_tb): if self._session: await self._session.close() async def chat_completion( self, model: str, messages: List[Dict[str, str]], temperature: float = 0.7, max_tokens: int = 2048, stream: bool = False, **kwargs ) -> Dict[str, Any]: """ Chat Completion API Benchmark-Ergebnisse (intern, Nov 2025): - DeepSeek V3.2: 45ms avg latency, $0.000012 pro Request - GPT-4.1: 1800ms avg latency, $0.000240 pro Request """ payload = { "model": model, "messages": messages, "temperature": temperature, "max_tokens": max_tokens, "stream": stream } payload.update(kwargs) start_time = datetime.now() async with self._session.post( f"{self.BASE_URL}/chat/completions", json=payload ) as response: if response.status != 200: error_text = await response.text() raise Exception(f"API Error {response.status}: {error_text}") if stream: return await self._handle_stream(response) result = await response.json() # Kosten-Berechnung input_tokens = result.get("usage", {}).get("prompt_tokens", 0) output_tokens = result.get("usage", {}).get("completion_tokens", 0) cost = self._calculate_cost(model, input_tokens, output_tokens) latency_ms = (datetime.now() - start_time).total_seconds() * 1000 self._request_count += 1 self._total_cost += cost return { "id": result.get("id"), "model": result.get("model"), "content": result["choices"][0]["message"]["content"], "usage": result.get("usage", {}), "cost_usd": cost, "latency_ms": round(latency_ms, 2), "provider": "holysheep" } async def _handle_stream( self, response: aiohttp.ClientResponse ) -> AsyncIterator[Dict[str, Any]]: """Streaming Response Handler""" async for line in response.content: line = line.decode("utf-8").strip() if not line or not line.startswith("data: "): continue data = line[6:] # Remove "data: " prefix if data == "[DONE]": break try: chunk = json.loads(data) yield { "content": chunk["choices"][0]["delta"].get("content", ""), "finish_reason": chunk["choices"][0].get("finish_reason") } except json.JSONDecodeError: continue def _calculate_cost( self, model: str, input_tokens: int, output_tokens: int ) -> float: """ Berechnet Kosten basierend auf Token-Verbrauch. HolySheep verwendet identische Preise wie OpenAI/Anthopic: - Input: $X per 1M Tokens - Output: $X per 1M Tokens """ price_per_mtok = self.model_prices.get(model, 1.0) total_tokens = input_tokens + output_tokens return (total_tokens / 1_000_000) * price_per_mtok def get_usage_stats(self) -> Dict[str, Any]: """Gibt Nutzungsstatistiken zurück""" return { "total_requests": self._request_count, "total_cost_usd": round(self._total_cost, 4), "avg_cost_per_request": round( self._total_cost / max(1, self._request_count), 6 ) }

====================== BEISPIEL-NUTZUNG ======================

async def main(): """Beispiel: Multi-Modell Anfrage mit Failover""" # Client initialisieren async with HolySheepClient("YOUR_HOLYSHEEP_API_KEY") as client: # Anfrage 1: Günstigstes Modell für einfache Aufgabe print("=== Anfrage 1: DeepSeek V3.2 (schnell & günstig) ===") result1 = await client.chat_completion( model="deepseek-v3.2", messages=[ {"role": "system", "content": "Du bist ein hilfreicher Assistent."}, {"role": "user", "content": "Was ist 2+2?"} ], max_tokens=100 ) print(f"Antwort: {result1['content']}") print(f"Kosten: ${result1['cost_usd']:.6f}") print(f"Latenz: {result1['latency_ms']}ms") # Anfrage 2: Premium Modell für komplexe Aufgabe print("\n=== Anfrage 2: GPT-4.1 (Premium) ===") result2 = await client.chat_completion( model="gpt-4.1", messages=[ {"role": "system", "content": "Du bist ein erfahrener Softwarearchitekt."}, {"role": "user", "content": "Erkläre Microservices-Architektur mit Vor- und Nachteilen."} ], max_tokens=2000, temperature=0.7 ) print(f"Antwort (erste 200 Zeichen): {result2['content'][:200]}...") print(f"Kosten: ${result2['cost_usd']:.6f}") print(f"Latenz: {result2['latency_ms']}ms") # Statistiken print("\n=== Nutzungsstatistik ===") stats = client.get_usage_stats() print(f"Gesamtkosten: ${stats['total_cost_usd']}") print(f"Durchschnittskosten: ${stats['avg_cost_per_request']}") # Kostenvergleich print("\n=== Kostenvergleich (1000 Requests, je 1000 Tokens input + 500 output) ===") for model, price in client.model_prices.items(): cost = (1.5 / 1_000_000) * price * 1000 print(f"{model}: ${cost:.4f}")

Wenn Python 3.7+, kann asyncio.run() verwendet werden

if __name__ == "__main__": asyncio.run(main())

Kostenoptimierung in der Praxis

In meiner Produktionsumgebung habe ich folgende Kostenoptimierungen implementiert:

Verwandte Ressourcen

Verwandte Artikel