Das Problem, das jeden trifft: Black Friday am KI-Kundenservice
Stellen Sie sich folgendes Szenario vor: Sie betreiben einen E-Commerce-Shop mit 500.000 monatlichen Besuchern. Ihr KI-Chatbot für den Kundenservice basiert auf einem Microservice-Architektur. Am 11. November um 14:32 Uhr — dem Höhepunkt des Singles' Day — fallen 12.000 Anfragen pro Minute ein. Ihr KI-Backend beginnt zu stottern, reagiert mit Verzögerungen von über 30 Sekunden, und dann... bricht alles zusammen. Nicht weil Ihre Infrastruktur versagt, sondern weil der externe KI-Dienst überlastet ist und keine Connection Timeouts konfiguriert sind.
Genau das ist mir im Jahr 2024 passiert, als wir für einen großen deutschen Online-Händler ein RAG-System (Retrieval-Augmented Generation) implementiert haben. Nach 72 Stunden几乎没有 Schlaf und drei Produktionsausfällen habe ich gelernt:
Resilienz ist nicht optional, sondern überlebenswichtig. In diesem Tutorial zeige ich Ihnen, wie Sie Circuit Breaker Patterns mit der
HolySheep AI API implementieren — einem Dienst, der mit Preisen ab $0.42 pro Million Token und WeChat/Alipay-Zahlung eine 85%+ Kostenersparnis gegenüber kommerziellen Alternativen bietet.
Warum Circuit Breaker in KI-Microservices?
Traditionelle Circuit Breaker schützen gegen Kaskadenausfälle zwischen Services. Bei KI-APIs kommen jedoch drei zusätzliche Herausforderungen hinzu:
- Latenz-Varianz: KI-Inferenz kann 200ms bis 45 Sekunden dauern. Ohne Timeout-Management können Anfragen Ihre Thread-Pools erschöpfen.
- Token-Kosten: Jede fehlgeschlagene Anfrage kostet Geld. Ein endloser Retry-Loop kann Ihre monatliche Rechnung verzehnfachen.
- Kontext-Verlust: Bei RAG-Systemen muss der Circuit Breaker den Kontext-Buffer berücksichtigen — ein partialer Failure kann inkonsistente Antworten erzeugen.
Die HolySheep AI API bietet eine durchschnittliche Latenz von unter 50ms, was Circuit Breaker weniger kritisch macht als bei Diensten mit 500ms+ Latenz. Dennoch: Selbst bei optimaler Infrastruktur können Netzwerkausfälle, Rate-Limits oder geplante Wartungen auftreten.
Die Architektur: Circuit Breaker State Machine
Ein Circuit Breaker durchläuft drei Zustände:
┌─────────────────────────────────────────────────────────────┐
│ CIRCUIT BREAKER ZUSTÄNDE │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ failure ≥ threshold ┌────────────────┐ │
│ │ CLOSED │ ─────────────────────────▶│ OPEN │ │
│ │ Normal │ │ Blocked Calls │ │
│ │ Flow │ │ & Exceptions │ │
│ └─────────┘ └────────────────┘ │
│ ▲ │ │
│ │ timeout elapsed │ │
│ │ ▼ │
│ │ ┌────────────┐ │
│ │ │ HALF-OPEN │ │
│ │ │ Test Call │ │
│ │ │ Allowed │ │
│ │ └────────────┘ │
│ │ success │ │
│ └──────────────────────────────── │
│ │
└─────────────────────────────────────────────────────────────┘
Konfiguration für HolySheep AI:
- failureThreshold: 5 (5 Fehler in 30s öffnen Circuit)
- successThreshold: 3 (3 Erfolge im HALF-OPEN schließen)
- timeout: 60s (60 Sekunden bis HALF-OPEN Versuch)
Python-Implementation: Production-Ready Circuit Breaker
Hier ist eine vollständige, production-ready Implementation mit der HolySheep AI API:
import time
import asyncio
import logging
from enum import Enum
from typing import Callable, Any, Optional
from dataclasses import dataclass
from functools import wraps
import httpx
HolySheep AI Configuration
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
class CircuitState(Enum):
CLOSED = "closed"
OPEN = "open"
HALF_OPEN = "half_open"
@dataclass
class CircuitBreakerConfig:
failure_threshold: int = 5
success_threshold: int = 3
timeout_seconds: float = 60.0
half_open_max_calls: int = 3
class CircuitBreakerOpen(Exception):
"""Raised when circuit breaker is OPEN and rejects calls"""
def __init__(self, retry_after: float):
self.retry_after = retry_after
super().__init__(f"Circuit breaker is OPEN. Retry after {retry_after:.1f}s")
class CircuitBreaker:
def __init__(self, name: str, config: Optional[CircuitBreakerConfig] = None):
self.name = name
self.config = config or CircuitBreakerConfig()
self.state = CircuitState.CLOSED
self.failure_count = 0
self.success_count = 0
self.last_failure_time: Optional[float] = None
self.last_state_change = time.time()
self.half_open_calls = 0
def record_success(self):
self.failure_count = 0
if self.state == CircuitState.HALF_OPEN:
self.success_count += 1
if self.success_count >= self.config.success_threshold:
self._transition_to(CircuitState.CLOSED)
elif self.state == CircuitState.CLOSED:
self.success_count = 0
def record_failure(self):
self.failure_count += 1
self.last_failure_time = time.time()
if self.state == CircuitState.HALF_OPEN:
self._transition_to(CircuitState.OPEN)
elif (self.state == CircuitState.CLOSED and
self.failure_count >= self.config.failure_threshold):
self._transition_to(CircuitState.OPEN)
def _transition_to(self, new_state: CircuitState):
old_state = self.state
self.state = new_state
self.last_state_change = time.time()
logging.warning(
f"[{self.name}] Circuit: {old_state.value} → {new_state.value} "
f"(failures: {self.failure_count})"
)
if new_state == CircuitState.HALF_OPEN:
self.half_open_calls = 0
self.success_count = 0
def can_execute(self) -> tuple[bool, Optional[float]]:
if self.state == CircuitState.CLOSED:
return True, None
elapsed = time.time() - self.last_state_change
if self.state == CircuitState.OPEN:
if elapsed >= self.config.timeout_seconds:
self._transition_to(CircuitState.HALF_OPEN)
return True, None
return False, self.config.timeout_seconds - elapsed
if self.state == CircuitState.HALF_OPEN:
if self.half_open_calls < self.config.half_open_max_calls:
self.half_open_calls += 1
return True, None
return False, None
return False, None
def get_stats(self) -> dict:
return {
"name": self.name,
"state": self.state.value,
"failure_count": self.failure_count,
"success_count": self.success_count,
"uptime_seconds": time.time() - self.last_state_change
}
Global circuit breaker instance
ai_circuit_breaker = CircuitBreaker(
name="holySheepAI",
config=CircuitBreakerConfig(
failure_threshold=5,
success_threshold=3,
timeout_seconds=60.0,
half_open_max_calls=3
)
)
async def call_holysheep_chat(
messages: list[dict],
model: str = "gpt-4.1",
temperature: float = 0.7,
max_tokens: int = 1000
) -> dict:
"""
Call HolySheep AI API with circuit breaker protection.
Pricing 2026 (per Million Tokens):
- GPT-4.1: $8.00
- Claude Sonnet 4.5: $15.00
- DeepSeek V3.2: $0.42
- Gemini 2.5 Flash: $2.50
"""
can_execute, retry_after = ai_circuit_breaker.can_execute()
if not can_execute:
raise CircuitBreakerOpen(retry_after or 60.0)
headers = {
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
}
try:
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.post(
f"{HOLYSHEEP_BASE_URL}/chat/completions",
headers=headers,
json=payload
)
response.raise_for_status()
ai_circuit_breaker.record_success()
return response.json()
except httpx.HTTPStatusError as e:
ai_circuit_breaker.record_failure()
# Handle rate limits specifically
if e.response.status_code == 429:
retry_after_header = e.response.headers.get("Retry-After", 60)
logging.error(f"Rate limited by HolySheep AI. Retry after {retry_after_header}s")
raise
except httpx.TimeoutException:
ai_circuit_breaker.record_failure()
raise
except Exception as e:
ai_circuit_breaker.record_failure()
raise
print("HolySheep AI Circuit Breaker initialized successfully!")
print(f"API Endpoint: {HOLYSHEEP_BASE_URL}")
print(f"Stats: {ai_circuit_breaker.get_stats()}")
Node.js/TypeScript Implementation für Enterprise-Systeme
Für Enterprise-Microservices mit TypeScript und einem Orchestrierungsframework wie Temporal.io oder Conductor:
// holySheepCircuitBreaker.ts
import { EventEmitter } from 'events';
import { HttpsProxyAgent } from 'https-proxy-agent';
const HOLYSHEEP_BASE_URL = 'https://api.holysheep.ai/v1';
const HOLYSHEEP_API_KEY = process.env.HOLYSHEEP_API_KEY || 'YOUR_HOLYSHEEP_API_KEY';
enum CircuitState {
CLOSED = 'CLOSED',
OPEN = 'OPEN',
HALF_OPEN = 'HALF_OPEN'
}
interface CircuitConfig {
failureThreshold: number; // Default: 5
successThreshold: number; // Default: 3
timeoutMs: number; // Default: 60000 (60s)
halfOpenMaxCalls: number; // Default: 3
volumeThreshold: number; // Minimum calls before evaluating
}
interface HolySheepRequest {
model: 'gpt-4.1' | 'claude-sonnet-4.5' | 'deepseek-v3.2' | 'gemini-2.5-flash';
messages: Array<{ role: 'user' | 'assistant' | 'system'; content: string }>;
temperature?: number;
max_tokens?: number;
}
interface HolySheepResponse {
id: string;
model: string;
choices: Array<{
message: { role: string; content: string };
finish_reason: string;
}>;
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
};
}
class HolySheepCircuitBreaker extends EventEmitter {
private state: CircuitState = CircuitState.CLOSED;
private failureCount = 0;
private successCount = 0;
private lastFailureTime = 0;
private lastStateChange = Date.now();
private halfOpenCalls = 0;
private consecutiveFailures: number[] = [];
private config: CircuitConfig = {
failureThreshold: 5,
successThreshold: 3,
timeoutMs: 60000,
halfOpenMaxCalls: 3,
volumeThreshold: 10
};
constructor(config?: Partial) {
super();
if (config) {
this.config = { ...this.config, ...config };
}
}
async call(request: HolySheepRequest): Promise {
// Check circuit state
if (this.state === CircuitState.OPEN) {
const elapsed = Date.now() - this.lastStateChange;
if (elapsed >= this.config.timeoutMs) {
this.transitionTo(CircuitState.HALF_OPEN);
} else {
throw new Error(
CIRCUIT_OPEN: HolySheep AI unavailable. Retry in ${Math.ceil((this.config.timeoutMs - elapsed) / 1000)}s
);
}
}
if (this.state === CircuitState.HALF_OPEN) {
if (this.halfOpenCalls >= this.config.halfOpenMaxCalls) {
throw new Error('CIRCUIT_OPEN: Max half-open calls reached');
}
this.halfOpenCalls++;
}
try {
const response = await this.executeRequest(request);
this.onSuccess();
return response;
} catch (error) {
this.onFailure();
throw error;
}
}
private async executeRequest(request: HolySheepRequest): Promise {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 30000); // 30s timeout
try {
const response = await fetch(${HOLYSHEEP_BASE_URL}/chat/completions, {
method: 'POST',
headers: {
'Authorization': Bearer ${HOLYSHEEP_API_KEY},
'Content-Type': 'application/json',
},
body: JSON.stringify(request),
signal: controller.signal,
});
clearTimeout(timeoutId);
if (!response.ok) {
const errorBody = await response.text();
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || '60';
this.emit('rateLimit', { retryAfter: parseInt(retryAfter) });
}
throw new Error(HTTP ${response.status}: ${errorBody});
}
return await response.json();
} catch (error) {
clearTimeout(timeoutId);
if (error instanceof Error && error.name === 'AbortError') {
throw new Error('REQUEST_TIMEOUT: HolySheep AI did not respond within 30s');
}
throw error;
}
}
private onSuccess(): void {
this.failureCount = 0;
this.consecutiveFailures = [];
if (this.state === CircuitState.HALF_OPEN) {
this.successCount++;
if (this.successCount >= this.config.successThreshold) {
this.transitionTo(CircuitState.CLOSED);
}
}
this.emit('success', { timestamp: Date.now() });
}
private onFailure(): void {
this.failureCount++;
this.lastFailureTime = Date.now();
this.consecutiveFailures.push(Date.now());
// Clean old failures (> 60s)
const cutoff = Date.now() - 60000;
this.consecutiveFailures = this.consecutiveFailures.filter(t => t > cutoff);
if (this.state === CircuitState.HALF_OPEN) {
this.transitionTo(CircuitState.OPEN);
} else if (
this.state === CircuitState.CLOSED &&
this.consecutiveFailures.length >= this.config.failureThreshold
) {
this.transitionTo(CircuitState.OPEN);
}
this.emit('failure', {
timestamp: Date.now(),
consecutiveFailures: this.consecutiveFailures.length
});
}
private transitionTo(newState: CircuitState): void {
const oldState = this.state;
this.state = newState;
this.lastStateChange = Date.now();
if (newState === CircuitState.HALF_OPEN) {
this.halfOpenCalls = 0;
this.successCount = 0;
}
console.log([CircuitBreaker] ${oldState} → ${newState});
this.emit('stateChange', { from: oldState, to: newState });
}
getStatus() {
return {
state: this.state,
failureCount: this.failureCount,
successCount: this.successCount,
uptime: Date.now() - this.lastStateChange,
recentFailures: this.consecutiveFailures.length
};
}
}
// Usage Example
const breaker = new HolySheepCircuitBreaker({
failureThreshold: 5,
timeoutMs: 60000,
successThreshold: 3
});
breaker.on('stateChange', ({ from, to }) => {
console.log(⚡ Circuit state changed: ${from} → ${to});
});
breaker.on('rateLimit', ({ retryAfter }) => {
console.log(⚠️ Rate limited. Waiting ${retryAfter}s before retry);
});
async function chatWithRetry(
messages: Array<{ role: string; content: string }>,
maxRetries = 3
): Promise {
let lastError: Error | null = null;
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await breaker.call({
model: 'deepseek-v3.2', // $0.42/MTok - most cost-effective
messages,
temperature: 0.7,
max_tokens: 1000
});
return response.choices[0].message.content;
} catch (error) {
lastError = error as Error;
if (error instanceof Error && error.message.startsWith('CIRCUIT_OPEN')) {
const match = error.message.match(/Retry in (\d+)s/);
const waitTime = match ? parseInt(match[1]) * 1000 : 5000;
await new Promise(resolve => setTimeout(resolve, waitTime));
} else if (attempt < maxRetries - 1) {
await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, attempt)));
}
}
}
throw lastError;
}
// Export for use in microservices
export { HolySheepCircuitBreaker, chatWithRetry, HOLYSHEEP_BASE_URL };
export type { HolySheepRequest, HolySheepResponse };
Java Spring Boot Integration für Enterprise RAG-Systeme
Für Java-basierte Microservices, wie sie in Banken und Versicherungen üblich sind:
package com.enterprise.ai.service;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.http.*;
import org.springframework.beans.factory.annotation.Value;
import lombok.extern.slf4j.Slf4j;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
@Service
@Slf4j
public class HolySheepAIService {
// Configuration
@Value("${holysheep.api.base-url:https://api.holysheep.ai/v1}")
private String baseUrl;
@Value("${holysheep.api.key:YOUR_HOLYSHEEP_API_KEY}")
private String apiKey;
// Circuit Breaker State
private enum CircuitState { CLOSED, OPEN, HALF_OPEN }
private volatile CircuitState state = CircuitState.CLOSED;
private final AtomicInteger failureCount = new AtomicInteger(0);
private final AtomicInteger successCount = new AtomicInteger(0);
private volatile Instant lastFailureTime = Instant.now();
private volatile Instant stateChangeTime = Instant.now();
private final AtomicInteger halfOpenCalls = new AtomicInteger(0);
// Configuration Constants
private static final int FAILURE_THRESHOLD = 5;
private static final int SUCCESS_THRESHOLD = 3;
private static final Duration TIMEOUT = Duration.ofSeconds(60);
private static final int HALF_OPEN_MAX_CALLS = 3;
// Metrics Storage
private final Map metricsByModel = new ConcurrentHashMap<>();
@Data
@AllArgsConstructor
private static class CircuitMetrics {
private String model;
private int totalCalls;
private int successCalls;
private int failedCalls;
private double averageLatencyMs;
}
@PostConstruct
public void init() {
log.info("HolySheep AI Service initialized");
log.info("Base URL: {}", baseUrl);
log.info("Pricing 2026: GPT-4.1=$8/MTok, DeepSeek V3.2=$0.42/MTok");
}
public record ChatRequest(
String model,
java.util.List messages,
Double temperature,
Integer maxTokens
) {
public record Message(String role, String content) {}
}
public record ChatResponse(
String id,
String model,
List choices,
Usage usage
) {
public record Choice(Message message, String finishReason) {
public record Message(String role, String content) {}
}
public record Usage(int promptTokens, int completionTokens, int totalTokens) {}
}
public ChatResponse chat(ChatRequest request) {
// Check circuit breaker
checkCircuitState();
long startTime = System.currentTimeMillis();
String model = request.model();
try {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer " + apiKey);
Map payload = Map.of(
"model", model,
"messages", request.messages().stream()
.map(m -> Map.of("role", m.role(), "content", m.content()))
.toList()
);
HttpEntity
Monitoring und Observability
Ein Circuit Breaker ist nur so gut wie seine Überwachung. Für Produktionsumgebungen empfehle ich die Integration mit Prometheus und Grafana:
# prometheus-circuit-breaker-monitor.py
from prometheus_client import Counter, Histogram, Gauge, start_http_server
import time
import random
Prometheus Metrics
circuit_state = Gauge(
'ai_circuit_breaker_state',
'Current circuit breaker state (0=CLOSED, 1=HALF_OPEN, 2=OPEN)',
['service', 'provider']
)
circuit_failures_total = Counter(
'ai_circuit_breaker_failures_total',
'Total number of circuit breaker failures',
['service', 'provider', 'error_type']
)
ai_request_latency = Histogram(
'ai_request_latency_seconds',
'AI API request latency in seconds',
['service', 'provider', 'model'],
buckets=[0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]
)
ai_tokens_consumed = Counter(
'ai_tokens_consumed_total',
'Total tokens consumed',
['service', 'provider', 'model', 'token_type']
)
circuit_state.labels(service='customer-service', provider='holysheep').set(0)
def simulate_production_traffic():
"""Simulate 1000 requests over 10 minutes to test circuit breaker"""
models = ['gpt-4.1', 'deepseek-v3.2', 'gemini-2.5-flash']
states = {'CLOSED': 0, 'HALF_OPEN': 1, 'OPEN': 2}
current_state = 'CLOSED'
failures_in_window = 0
window_start = time.time()
for i in range(1000):
request_start = time.time()
# Simulate occasional failures (5% base rate)
failure_probability = 0.05 if current_state == 'CLOSED' else 0.5
if random.random() < failure_probability:
# Record failure
error_types = ['timeout', 'rate_limit', 'server_error', 'connection_refused']
circuit_failures_total.labels(
service='customer-service',
provider='holysheep',
error_type=random.choice(error_types)
).inc()
failures_in_window += 1
# Check if circuit should open
if failures_in_window >= 5:
current_state = 'OPEN'
circuit_state.labels(
service='customer-service',
provider='holysheep'
).set(states[current_state])
print(f"[{time.time():.0f}] Circuit OPENED after {failures_in_window} failures")
time.sleep(0.5) # Simulate recovery wait
else:
# Successful request
latency = random.uniform(0.02, 0.15) # HolySheep AI <50ms typical
ai_request_latency.labels(
service='customer-service',
provider='holysheep',
model=random.choice(models)
).observe(latency)
tokens = random.randint(50, 500)
ai_tokens_consumed.labels(
service='customer-service',
provider='holysheep',
model=models[0],
token_type='total'
).inc(tokens)
if current_state == 'HALF_OPEN':
successes = random.randint(1, 5)
if successes >= 3:
current_state = 'CLOSED'
failures_in_window = 0
circuit_state.labels(
service='customer-service',
provider='holysheep'
).set(states[current_state])
print(f"[{time.time():.0f}] Circuit CLOSED after recovery")
# Update state tracking
circuit_state.labels(
service='customer-service',
provider='holysheep'
).set(states[current_state])
time.sleep(random.uniform(0.1, 1.0))
# Reset failure window after 30 seconds
if time.time() - window_start > 30:
failures_in_window = max(0, failures_in_window - 1)
window_start = time.time()
print(f"\nSimulation complete. Final metrics:")
print(f" - Final circuit state: {current_state}")
print(f" - Total failures recorded: {failures_in_window}")
if __name__ == '__main__':
# Start Prometheus metrics server on port 9090
start_http_server(9090)
print("Prometheus metrics server started on :9090")
print("Metrics available at: http://localhost:9090/metrics")
simulate_production_traffic()
Häufige Fehler und Lösungen
Fehler 1: Timeout konfiguriert, aber Request läuft weiter
Problem: Der Circuit Breaker öffnet, aber HTTP-Requests laufen im Hintergrund weiter und belasten die Infrastruktur.
Lösung: Implementieren Sie explizites Request-Timeout mit Connection Reuse:
# FEHLERHAFT: Request läuft weiter im Hintergrund
async def bad_implementation():
async with httpx.AsyncClient() as client:
response = await client.post(url, json=payload) # 60s+ timeout!
# Circuit öffnet, aber Request läuft noch
KORREKT: Explizites Timeout mit Pool-Limit
async def correct_implementation():
# Separate Timeout-Konfiguration pro Request
async with httpx.AsyncClient(
timeout=httpx.Timeout(10.0, connect=5.0), # 10s total, 5s connect
limits=httpx.Limits(max_connections=100, max_keepalive_connections=20)
) as client:
try:
response = await client.post(url, json=payload)
return response.json()
except httpx.TimeoutException:
ai_circuit_breaker.record_failure()
return fallback_response()
Fehler 2: Rate-Limit wird nicht berücksichtigt
Problem: Bei HTTP 429 (Rate Limit) versucht der Circuit Breaker weiter Anfragen zu senden, was die Situation verschlechtert.
Lösung: Spezielle Behandlung von Rate-Limits mit Retry-After Header:
# FEHLERHAFT: Generische Exception-Handler
def bad_rate_limit_handling():
try:
response = call_api()
except Exception as e:
ai_circuit_breaker.record_failure()
# Ignoriert 429, sendet trotzdem weiter
KORREKT: Rate-Limit-aware handling
async def rate_limit_aware_call(request: HolySheepRequest):
max_attempts = 3
for attempt in range(max_attempts):
try:
response = await breaker.call(request)
return response
except httpx.HTTPStatusError as e:
if e.response.status_code == 429:
# Rate Limit - Retry-After Header beachten
retry_after = int(e.response.headers.get('Retry-After', 60))
# NICHT failure recorden - es ist kein Service-Fehler
# Stattdessen: exponentielles Backoff mit Jitter
wait_time = retry_after + random.uniform(0, 5)
logging.warning(f"Rate limited. Waiting {wait_time:.1f}s")
await asyncio.sleep(wait_time)
else:
# Andere HTTP-Fehler: failure recorden
breaker.record_failure()
raise
except CircuitBreakerOpen as e:
# Circuit offen - warten und erneut versuchen
await asyncio.sleep(e.retry_after)
Fehler 3: Memory Leak durch unbounded Queue
Problem: Retry-Queue wächst unbegrenzt, führt zu OutOfMemoryError.
Lösung: Bounded Queue mit Circuit Breaker Integration:
from queue import Queue, Full
from threading import Semaphore
class BoundedRetryQueue:
def __init__(self, max_size=1000, max_retries=3):
self.queue = Queue(maxsize=max_size)
self.max_retries = max_retries
self.semaphore = Semaphore(max_size)
async def enqueue_with_retry(self, request
Verwandte Ressourcen
Verwandte Artikel