Wenn Sie zum ersten Mal mit KI-APIs arbeiten, haben Sie sich vielleicht gefragt: "Wie schaffen es große Plattformen, dass tausende Nutzer gleichzeitig Anfragen stellen können, ohne dass jemand den Service lahmlegt?" Die Antwort liegt in zwei wichtigen Konzepten: Mandantentrennung (Isolation) und Faire Terminplanung (Fair Scheduling).

In diesem Leitfaden erkläre ich Ihnen Schritt für Schritt, wie diese Mechanismen funktionieren — ohne komplizierte Fachbegriffe, mit praxisnahen Beispielen und Code, den Sie direkt ausprobieren können.

Warum brauchen wir Trennung und Verteilung?

Stellen Sie sich einen Restaurantküche vor: Wenn ein hungriger Gast die gesamte Küche für sich beansprucht, warten alle anderen hungrig. Genauso funktioniert eine KI-API: Ohne Regeln könnte ein Nutzer mit Millionen von Anfragen alle anderen blockieren.

Das Grundproblem: Ressourcen teilen sich

Ein KI-Server hat begrenzte Kapazitäten:

Was passiert ohne Regeln?

Ohne Isolation und Scheduling passiert folgendes Chaos:

Die zwei Säulen: Isolation und Scheduling

Säule 1: Mandantentrennung (Tenant Isolation)

Jeder Nutzer oder jede Gruppe erhält einen "virtuellen Container" — als wäre Ihre Küche in separate Kochstationen aufgeteilt. Jede Station hat ihre eigenen Ressourcen und kann die anderen nicht beeinflussen.

Praktisches Beispiel: Angenommen, Sie betreiben eine SaaS-Plattform mit 3 Kunden:

Ohne Trennung würde Kunde C die gesamte Kapazität beanspruchen. Mit Trennung erhält jeder Kunde garantierte Ressourcen, unabhängig von der Nutzung anderer.

Säule 2: Faire Terminplanung (Fair Scheduling)

Scheduling bestimmt die Reihenfolge und Geschwindigkeit, in der Anfragen bearbeitet werden. Es gibt verschiedene Strategien:

Technische Umsetzung: Ein einfaches Gateway-Beispiel

Lassen Sie uns ein einfaches Multi-Tenant-Gateway in Python bauen, das diese Konzepte demonstriert. Sie können diesen Code kopieren und auf Ihrem Computer ausführen.

Voraussetzungen für das Tutorial

Bevor wir beginnen, brauchen Sie:

Schritt 1: Das Grundgerüst unseres Gateways

Unser Gateway braucht drei Hauptkomponenten:

# multi_tenant_gateway.py
import time
import threading
from collections import defaultdict
from dataclasses import dataclass, field
from typing import Dict, Optional
import hashlib

@dataclass
class TenantConfig:
    """Konfiguration für jeden Mandanten (Mieter)"""
    tenant_id: str
    max_requests_per_minute: int = 60
    max_concurrent_requests: int = 5
    priority: int = 1  # 1=niedrig, 5=hoch
    rate_limit_burst: int = 10

@dataclass
class TenantState:
    """Aktueller Zustand eines Mandanten"""
    requests_this_minute: int = 0
    active_requests: int = 0
    last_request_time: float = field(default_factory=time.time)
    waiting_queue: list = field(default_factory=list)

class MultiTenantGateway:
    """
    Unser Multi-Tenant Gateway mit Isolation und Fair Scheduling.
    Jeder Mandant bekommt seine eigene 'Sandbox' mit garantierten Ressourcen.
    """
    
    def __init__(self):
        self.tenants: Dict[str, TenantConfig] = {}
        self.tenant_states: Dict[str, TenantState] = {}
        self.locks: Dict[str, threading.Lock] = defaultdict(threading.Lock)
        self.global_lock = threading.Lock()
        
        # Statistiken für Monitoring
        self.stats = defaultdict(lambda: {
            "total_requests": 0,
            "blocked_requests": 0,
            "avg_latency_ms": 0
        })
    
    def register_tenant(self, tenant_id: str, config: Optional[TenantConfig] = None):
        """Registriert einen neuen Mandanten mit Standard- oder Custom-Konfiguration"""
        if config is None:
            config = TenantConfig(tenant_id=tenant_id)
        
        self.tenants[tenant_id] = config
        self.tenant_states[tenant_id] = TenantState()
        print(f"✓ Mandant '{tenant_id}' registriert mit {config.max_requests_per_minute} RPM")
    
    def check_rate_limit(self, tenant_id: str) -> tuple[bool, str]:
        """Prüft ob Anfrage erlaubt ist (Rate Limiting)"""
        if tenant_id not in self.tenants:
            return False, "Mandant nicht registriert"