Die Idee in 30 Sekunden
Multi-Tenant ist ein Architekturansatz, bei dem ein Agent-System viele Kunden bedient, aber jeder Tenant (ein einzelner Kunde) isoliert ist.
Isolation darf nicht nur in den Daten existieren. Sie wird in der ganzen Kette gebraucht:
- Runtime-Kontext;
- Memory und Cache;
- Tool-Zugriffe;
- Budget-Limits und Rate Limits;
- Audit und Trace.
Wann man es braucht: wenn ein Service fĂŒr viele Kunden, Teams oder Workspaces auf gemeinsamer Infrastruktur lĂ€uft.
Ein LLM sollte den Tenant-Kontext nicht selbst festlegen. Tenant muss ĂŒber Auth oder Routing bestimmt werden, und das System muss ihn in jedem Schritt erzwingen.
Problem
Ohne klare multi-tenant Isolation funktioniert das System zwar, aber Risiken werden schnell kritisch.
LLM-Agenten erhöhen das Risiko von cross-tenant Leaks, weil eine Anfrage Memory lesen, Tools aufrufen und Daten in mehrere Systeme schreiben kann.
Typische AusfÀlle:
- Kontext eines Tenants landet in der Antwort eines anderen;
- ein Tool Call lÀuft mit fremden credentials;
- Memory oder Cache werden zwischen Kunden vermischt;
- ein Tenant verbraucht das gesamte gemeinsame Budget (noisy neighbor);
- Audit kann nicht belegen, wer eine Aktion initiiert hat.
In Production bedeutet das Datenlecks, SicherheitsvorfÀlle und schwierige Compliance.
Lösung
Multi-Tenant als explizite Isolationsgrenze (tenant boundary) zwischen Agent Runtime und allen ZustĂ€nden/Aktionen des Systems hinzufĂŒgen.
Diese Grenze definiert:
- wie der Tenant identifiziert wird;
- welche Ressourcen diesem Tenant verfĂŒgbar sind;
- welche Limits spezifisch auf diesen Tenant angewendet werden;
- wie Tenant-Kontext in Logs und Traces erfasst wird.
Analogie: wie BankschlieĂfĂ€cher.
Das GebĂ€ude ist eins, aber Zugriff auf jedes Fach hat nur der EigentĂŒmer.
Multi-Tenant ermöglicht genauso eine gemeinsame Plattform ohne Vermischung von Zugriff und Daten.
Wie Multi-Tenant funktioniert
Multi-Tenant ist eine gesteuerte Schicht zwischen eingehender Anfrage und AktionsausfĂŒhrung, die jeden Run per tenant_id erzwungen isoliert.
Ăberblick ĂŒber den kompletten Flow: Identify â Isolate â Authorize â Execute â Audit
Identify
Das System bestimmt den Tenant ĂŒber Auth-Token, Org-Mapping oder Routing-Regeln.
Isolate
Runtime, Memory, Cache und Budget-Kontext werden an eine konkrete tenant_id gebunden.
Authorize
Die Policy-Schicht prĂŒft Role, tenant scopes, Allowlist und per-tenant Limits.
Execute
Tool Calls laufen nur mit tenant-scoped credentials und Ressourcen dieses Tenants.
Audit
Jeder kritische Schritt wird mit tenant_id, actor_id, reason_code, outcome geloggt.
Dieser Zyklus erlaubt, einen Service auf viele Kunden zu skalieren, ohne cross-tenant Vermischung.
Im Code sieht es so aus
class MultiTenantArchitecture:
def __init__(self, auth, runtime, policy, tools, memory, budgets, audit):
self.auth = auth
self.runtime = runtime
self.policy = policy
self.tools = tools
self.memory = memory
self.budgets = budgets
self.audit = audit
def run(self, request, auth_token):
identity = self.auth.resolve(auth_token) or {}
tenant_id = identity.get("tenant_id")
actor_id = identity.get("actor_id")
if not tenant_id:
return {"ok": False, "reason_code": "tenant_missing"}
if not self.budgets.allowed(tenant_id=tenant_id):
return {"ok": False, "reason_code": "tenant_budget_exceeded"}
# Der gesamte Kontext ist strikt an den Tenant gebunden.
state = self.runtime.start(request=request, tenant_id=tenant_id)
memory_items = self.memory.retrieve(tenant_id=tenant_id, query=request["text"], top_k=4)
action = self.runtime.decide(state=state, memory_items=memory_items)
gate = self.policy.authorize(
tenant_id=tenant_id,
actor_id=actor_id,
action=action,
)
if not gate["ok"]:
self.audit.log(
tenant_id=tenant_id,
actor_id=actor_id,
action=action.get("name"),
outcome="denied",
reason_code=gate.get("reason_code", "policy_denied"),
)
return {"ok": False, "reason_code": gate.get("reason_code", "policy_denied")}
result = self.tools.execute(
action=action,
tenant_id=tenant_id,
scopes=gate.get("scopes", []),
)
self.audit.log(
tenant_id=tenant_id,
actor_id=actor_id,
action=action.get("name"),
outcome="executed",
reason_code=result.get("reason_code", "ok"),
)
return result
So sieht es wĂ€hrend der AusfĂŒhrung aus
Anfrage: "Aktualisiere den Status von Bestellung #918 und sende dem Kunden eine BestÀtigung"
Step 1
Auth + Routing: bestimmt tenant_id = tenant_acme
Multi-Tenant Boundary: setzt Tenant-Kontext und per-tenant Limits
Step 2
Agent Runtime: bildet action
Policy: prĂŒft role + tenant scopes + allowlist
Tool Execution: fĂŒhrt die Aktion nur mit credentials von tenant_acme aus
Step 3
Audit: speichert tenant_id, actor_id, action, outcome, reason_code
Runtime: liefert Ergebnis ohne Vermischung mit anderen Kunden zurĂŒck
Multi-Tenant Ă€ndert die Agent-Logik nicht. Es macht sie vorhersagbar und sicher fĂŒr eine Multi-Kunden-Umgebung.
Wann es passt und wann nicht
Multi-Tenant wird dort benötigt, wo ein System viele Kunden oder Teams mit unterschiedlichen Zugriffsrechten bedient.
Passt
| Situation | Warum Multi-Tenant passt | |
|---|---|---|
| â | Ein Agent-Service bedient viele Kunden | Tenant boundary verhindert cross-tenant Leaks von Daten und Zugriffsrechten. |
| â | FĂŒr unterschiedliche Tenants sind unterschiedliche Budgets, Quoten und policy rules nötig | Per-tenant Limits schĂŒtzen das System vor dem noisy-neighbor Effekt. |
| â | Audit ist fĂŒr Sicherheit und Compliance erforderlich | Logs und Trace erfassen Aktionen mit klarer Tenant-Zuordnung. |
Passt nicht
| Situation | Warum Multi-Tenant nicht passt | |
|---|---|---|
| â | Das System bedient nur einen Kunden ohne SkalierungsplĂ€ne | Volle multi-tenant UmhĂŒllung kann am Anfang unnötige KomplexitĂ€t sein. |
| â | Daten und Zugriffe sind bereits physisch durch separate Installationen isoliert | Dann reicht oft eine single-tenant Architektur pro Installation. |
In einem einfachen single-tenant Szenario reicht manchmal ein Basiskontext:
result = runtime.run(request=request, tenant_id="default")
Typische Probleme und AusfÀlle
| Problem | Was passiert | Wie man es verhindert |
|---|---|---|
| Credential bleed | Ein Tool Call nutzt SchlĂŒssel eines anderen Tenants | Tenant-scoped credentials + Verbot globaler Clients |
| Cache / memory bleed | Cache oder Memory liefert Daten eines anderen Tenants zurĂŒck | Namespace Key mit tenant_id, Store-Isolation und Leak-TestfĂ€lle |
| Noisy neighbor | Ein Tenant verbraucht das gemeinsame Budget und degradiert den Service fĂŒr andere | Per-tenant budgets, rate limits, Quoten und PrioritĂ€ten |
| Tenant-Kontext-Spoofing | Das System akzeptiert tenant_id aus Prompt oder Payload ohne Auth-PrĂŒfung | Tenant wird nur ĂŒber Auth/Routing bestimmt, nicht aus dem Request-Text des Modells |
| UnvollstÀndiges Audit | Es ist nicht belegbar, welcher Tenant eine riskante Aktion initiiert hat | Pflichtfelder im Audit: tenant_id, actor_id, action, reason_code, outcome |
| Wiederholte Write-Operationen | Retry dupliziert einen Write oder eine Belastung innerhalb des Tenants | Idempotency Keys und Deduplizierung fĂŒr Mutation-Aktionen |
Die meisten multi-tenant VorfĂ€lle entstehen nicht im Modell, sondern an einer schwachen Grenze zwischen Kontext und AusfĂŒhrung.
Wie es mit anderen Patterns zusammenspielt
Multi-Tenant ist eine querschnittliche Architektur-Schicht, die Sicherheit und StabilitÀt des gesamten Systems verstÀrkt.
- Agent Runtime â Runtime fĂŒhrt Schritte aus, und Multi-Tenant setzt Tenant-Kontext-Grenzen in jedem Schritt.
- Tool Execution Layer â jeder
tool_callmuss mit tenant-scoped Zugriffsrechten laufen. - Memory Layer â Memory und Cache mĂŒssen nach
tenant_idisoliert sein. - Policy Boundaries â policy rules werden unter BerĂŒcksichtigung von tenant, role und scopes angewendet.
- Orchestration Topologies â in multi-agent Flows muss Tenant-Kontext ĂŒber alle Branches weitergegeben werden.
- Hybrid Workflow Agent â workflow-Commits mĂŒssen innerhalb der Ressourcen des jeweiligen Tenants bleiben.
- Human-in-the-Loop Architecture â auch Approval-Schritte brauchen tenant-gebundenes Audit und Zugriffsrechte.
- Containerizing Agents â Container liefern eine stabile Umgebung, aber Tenant-Isolation wird spezifisch durch die Multi-Tenant-Grenze sichergestellt.
Anders gesagt:
- Multi-Tenant definiert wessen Aktion das ist und wessen Kontext das ist
- Andere Architektur-Schichten definieren wie diese Aktion ausgefĂŒhrt wird
Kurz gesagt
Multi-Tenant:
- isoliert Daten, Zugriffe und State zwischen Kunden
- wendet per-tenant Budget-Limits und Rate Limits an
- bindet tool calls erzwungen an tenant-scoped credentials
- macht Audit transparent ĂŒber tenant_id + reason_code
FAQ
Q: Reicht es, einfach tenant_id zur Anfrage hinzuzufĂŒgen?
A: Nein. tenant_id muss durch Runtime, Policy, Tools, Memory, Cache und Audit erzwungen werden.
Q: Wo passieren cross-tenant Leaks am hÀufigsten?
A: Am hĂ€ufigsten in Caches, Memory und globalen Clients fĂŒr externe APIs.
Q: Wie migriert man sicher von single-tenant zu multi-tenant?
A: Mit tenant_id in Auth/Routing starten, dann Memory/Cache/Tools isolieren, per-tenant Limits und Audit hinzufĂŒgen und erst dann Daten schrittweise migrieren.
Q: Was ist zuerst wichtiger: per-tenant Budgets oder per-tenant Policy?
A: Beides ist wichtig. Policy schĂŒtzt Zugriffe, Budgets schĂŒtzen vor noisy-neighbor und Kostenexplosion.
Was als Naechstes
Multi-Tenant-Architektur beginnt mit Isolation, endet aber nicht dort. Als Naechstes schau, wie Stabilitaet unter realer Last gehalten wird:
- Memory Layer - wie tenant-scoped Memory ohne Leaks zwischen Kunden aufgebaut wird.
- Containerizing Agents - wie reproduzierbare Ausfuehrung pro Tenant sichergestellt wird.
- Policy Boundaries - wie Berechtigungen, Rollen und riskante Aktionen getrennt werden.
- Production Stack - wie daraus ein gesteuertes Production-Modell wird.