Engineering Design und Analyse
Design von Multi-Tenant-Anwendungen auf Azure für SaaS-Anbieter
Table of Contents
Der Aufbau eines erfolgreichen SaaS-Produkts auf Azure bedeutet, vom ersten Tag an für mehrere Kunden zu entwerfen. Multitenancy ist nicht nur eine Funktion – es ist die architektonische Grundlage, die bestimmt, wie Sie Ihre Anwendung skalieren, sichern und monetarisieren. Azure bietet ein reichhaltiges Ökosystem von Diensten, das Ihnen hilft, Isolation, Elastizität und Kostenkontrollen zu implementieren, aber die richtige Architektur hängt von den Anforderungen Ihrer Mandanten, Ihrer Datensensitivität und Ihrer Betriebskapazität ab. Dieser Artikel geht durch die Kernkonzepte, Designprinzipien, Datenisolationsstrategien, Azure-Services, Implementierungsmuster und Betriebsbest Practices für die Erstellung von SaaS-Anwendungen mit mehreren Mandanten auf Azure.
Multi-Tenancy in SaaS verstehen
Multitenancy ist eine Softwarearchitektur, bei der eine einzelne Instanz der Anwendung mehrere Mandanten (Kunden, Organisationen oder Benutzergruppen) bedient. Jeder Mandant erlebt die Anwendung, als ob sie für sie bestimmt wäre, aber die zugrunde liegende Infrastruktur, Berechnung und Speicherung werden gemeinsam genutzt. Dieser Ansatz reduziert die Kosten pro Kunde, vereinfacht die Wartung (eine Codebasis, eine Bereitstellung) und ermöglicht schnelle Feature-Rollouts. Die entscheidende Herausforderung besteht darin, die strikte Datenisolierung und mandantenspezifische Konfiguration in einer gemeinsamen Umgebung beizubehalten.
Azure SaaS-Anbieter stehen in der Regel vor drei Entscheidungen: dem Grad der Isolation, dem Rechenmodell (PaaS vs. IaaS vs. Container) und der Speicherarchitektur. Das frühzeitige Verständnis dieser Kompromisse verhindert eine kostspielige Re-Architektur später.
Grundlegende Designprinzipien für Multi-Tenant-Anwendungen auf Azure
Ein effektives Multi-Tenant-Design auf Azure basiert auf vier Säulen: Isolation, Skalierbarkeit, Sicherheit und Kostenmanagement. Jedes Prinzip beeinflusst Ihre Wahl der Azure-Dienste und Bereitstellungsmuster.
Isolation
Daten und Konfiguration dürfen niemals zwischen Mandanten auslaufen. Isolation kann logisch sein (Mandanten-IDs auf Zeilenebene in einer freigegebenen Datenbank) oder physisch (separate Datenbanken, Storage-Accounts oder sogar separate Abonnements). Azure SQL-Datenbank und Azure Cosmos DB unterstützen beide Ansätze mit Zeilensicherheitsrichtlinien auf Mandantenebene und Schlüsseln auf Containerebene. Auf der Compute-Seite können Azure App Service-Pläne geteilt werden, aber Sie müssen den Mandanten-Scoping in Ihrem Anwendungscode durchsetzen. Für eine strengere Isolation sollten Sie Azure Kubernetes Service (AKS) mit mandantenspezifischen Namespaces oder sogar dedizierten Knotenpools in Betracht ziehen.
Skalierbarkeit
Mehrmandanten-Workloads erleben unvorhersehbare Spikes, da einige Mandanten schnell wachsen, während andere stabil bleiben. Azures automatische Skalierungsfunktionen - wie App Service-Scale-Out-Regeln, AKS Cluster-Autoscaler und Azure SQL Database elastische Pools - ermöglichen es Ihnen, Wachstum ohne manuelle Eingriffe zu absorbieren. Designen Sie Ihre Anwendung zustandslos und entladen Sie Sitzungszustand in Azure Cache für Redis oder Cosmos DB. Verwenden Sie Azure Load Balancer oder Azure Front Door, um den Datenverkehr über skalierte Instanzen zu verteilen.
Sicherheit
Jeder Mandant muss von jedem anderen Mandanten isoliert werden und die Mandanten-Authentifizierung muss solide sein. Verwenden Sie Azure Active Directory (Azure AD) mit mandantenspezifischen B2C- oder B2B-Funktionen für die Identitätsföderation. Für die Service-zu-Service-Kommunikation verlassen Sie sich auf verwaltete Identitäten und Azure Key Vault, um Hardcoding-Geheimnisse zu vermeiden. Implementieren Sie die Mandanten-bewusste Autorisierung am API-Gateway - Azure API Management kann die Token-Validierung und Ratenbegrenzung pro Mandant erzwingen. Protokollierung und Auditierung sollten den Mandantenkontext erfassen, ohne sensible Daten über Grenzen hinweg offenzulegen.
Kostenmanagement
Gemeinsame Infrastruktur reduziert die Kosten pro Mieter, aber eine unoptimierte Nutzung kann Geld verschwenden. Verwenden Sie Azure Cost Management, um Ressourcen nach Mandanten zu markieren und Ausgaben zu verfolgen. Kombinieren Sie reservierte Instanzen mit automatischer Skalierung, um die Basislast kostengünstig zu bewältigen und Premium-Instanzen für Spikes zu skalieren. Elastische Datenbankpools ermöglichen es Ihnen, Ressourcen zwischen den Mandanten zu bündeln und nur für die gesamte DTU / vCore-Nutzung zu bezahlen, anstatt einzeln für Peaks zu sorgen. Immer bewerten, ob eine gemeinsame oder dedizierte Ressourcenstrategie mit Ihrem Preismodell übereinstimmt (z. B. pro Sitzplatz vs. verbrauchsbasiert).
Strategien zur Datenisolierung
Die Auswahl der Speicherung von Mandantendaten ist die konsequenteste architektonische Entscheidung. Azure unterstützt mehrere Modelle mit jeweils unterschiedlichen Kompromissen in Bezug auf Isolation, Verwaltbarkeit und Kosten.
Einzeldatenbank, gemeinsames Schema
In diesem Modell werden alle Mandanten in einer Datenbank mit einer Mandantenkennung in jeder Tabelle gespeichert. Es ist am einfachsten zu verwalten (ein Backup, ein Verbindungsstring) und das kostengünstigste für kleine Mandanten. Die Isolation ist jedoch rein logisch: Ein Fehler im Mandantenfiltercode könnte die Daten eines anderen Mandanten aussetzen. Die Indexierungs- und Abfrageleistung kann sich verschlechtern, wenn die Anzahl der Mandanten wächst und Schemaänderungen sich gleichzeitig auf jeden Mandanten auswirken. Dieses Muster funktioniert am besten, wenn Mandanten klein und zahlreich sind und ähnliche Datenmuster gemeinsam nutzen. Azure SQL-Datenbank-Zeilenebene-Sicherheit (RLS) erzwingt die Mandantenisolierung auf Datenbank-Engine-Ebene, wodurch das Risiko von Codierfehlern verringert wird.
Separate Datenbanken (Datenbank pro Mieter)
Jeder Mandant erhält seine eigene Datenbank (und optional einen eigenen Server oder einen elastischen Pool). Dies bietet die stärkste Isolation – physische Datentrennung – und erleichtert die Compliance (z. B. DSGVO-Datenresidenz). Backups, Wiederherstellung und Performance-Tuning können pro Mandant durchgeführt werden. Die Kompromisse sind die operative Komplexität (Hunderte oder Tausende von Datenbanken zu verwalten) und höhere Ressourcenkosten. Azure Elastic-Datenbankpools helfen, Kosten zu verwalten, indem kleine Mandanten in gemeinsamen Kapazitätspools zusammengefasst werden, während große Mandanten in dedizierten Pools platziert werden können. Die elastische Abfrage und datenbankübergreifende Abfragen der Azure SQL-Datenbank ermöglichen bei Bedarf ein inhaberübergreifendes Reporting.
Hybridanflüge
Viele SaaS-Anbieter verfolgen eine gestufte Strategie: kostenlose oder Test-Mandanten teilen sich eine gemeinsame Datenbank, während Premium-Mandanten dedizierte Datenbanken erhalten. Alternativ können einige Daten (z. B. öffentliche Kataloge, Referenzdaten) gemeinsam genutzt werden, während private Daten isoliert werden. Die Sharding- und Föderationsfunktionen der Azure SQL-Datenbank unterstützen Hybridmodelle. Zum Beispiel können Sie eine einzelne gemeinsame Datenbank für die Authentifizierung und Mandantenmetadaten verwenden und dann die Transaktionsdaten jedes Mandanten in seine eigene Shard- oder Datenbank leiten. Azure Cosmos DB unterstützt auch die Hybridisolierung mit Partitionsschlüsseln, die logischen Mandanten zugeordnet werden können, kombiniert mit separaten Containern für Mandanten, die stärkere Grenzen benötigen.
Azure Services für Multi-Tenancy nutzen
Über die Datenspeicherung hinaus bietet Azure eine vollständige Plattform zur Operationalisierung von SaaS mit mehreren Mandanten.
Compute und Hosting
Azure App Service ist der Einstiegspunkt für viele SaaS-Anbieter. Er unterstützt automatische Skalierung, slotbasierte Bereitstellungen und integrierte Authentifizierung. Für mehr Kontrolle über die Laufzeitumgebung ermöglicht Azure Kubernetes Service (AKS) die Isolierung von Mandanten über Namespaces, Netzwerkrichtlinien und Ressourcenkontingente. AKS integriert sich auch in Azure AD für rollenbasierte Zugriffskontrolle. Für serverlose Architekturen können Azure Functions Mandanten bewusst sein, indem Eingabebindungen und mandantenspezifische Speicherkonten verwendet werden.
Speicherung und Datenbank
Wir haben bereits über Azure SQL Database und Cosmos DB gesprochen. Für Blob- oder Dateispeicher unterstützt Azure Blob Storage die Mandantenisolation auf Containerebene. Sie können Mandanten-spezifische SAS-Token generieren und Zugriffsrichtlinien mit Azure RBAC erzwingen. Azure Storage-Konto pro Mandant ist auch eine Option für hohe Isolation, erhöht aber den Verwaltungsaufwand. Azure Cache für Redis kann pro Mandant mit separaten Datenbanken oder Schlüsselpräfixen partitioniert werden.
Identitäts- und Zugriffsmanagement
Azure AD B2C (Business-to-Consumer) ist für SaaS mit externen Mandanten konzipiert. Es unterstützt benutzerdefinierte Richtlinien, Social Identity Provider und Multi-Faktor-Authentifizierung pro Mandant. Für Enterprise SaaS, bei dem Mandanten Organisationen sind, ermöglicht Azure AD B2B (Business-to-Business) Benutzern, sich mit den Anmeldeinformationen ihrer eigenen Organisation anzumelden. Beide integrieren sich in Azure API Management, um die Token-Validierung zu erzwingen. Verwenden Sie verwaltete Identitäten für Azure-Ressourcen, um zu vermeiden, dass Anmeldeinformationen in Ihrem Code gespeichert werden.
Sicherheit und Geheimnisse
Azure Key Vault speichert Mandanten-spezifische Geheimnisse, Verbindungszeichenfolgen und Zertifikate. Sie können ausgewählten Diensten oder Entwicklern mithilfe von Vault-Zugriffsrichtlinien und RBAC Zugriff gewähren. Für Verschlüsselung im Ruhezustand unterstützt Azure SQL Database Transparent Data Encryption (TDE) mit kundenverwalteten Schlüsseln, die in Key Vault gespeichert sind - Schlüssel können bei Bedarf permanent sein. Azure Policy und Azure Blueprints helfen, die Mandanten-Compliance-Anforderungen (z. B. Geo-Einschränkungen, zulässige Ressourcentypen) skaliert durchzusetzen.
Überwachung und Beobachtbarkeit
Azure Monitor und Application Insights sind für die Fehlersuche mit mehreren Mandanten unerlässlich. Markieren Sie alle Telemetrie mit einer Mandanten-ID – entweder in benutzerdefinierten Eigenschaften oder über einen Anreicherungsprozessor. Erstellen Sie Alarmregeln, die bei Überschreitung von Schwellenwerten pro Mandant auslösen (z. B. Datenbank-CPU > 80% für einen bestimmten Mandanten). Verwenden Sie Azure Log Analytics und KQL, um die Mandanten-spezifische Leistung ohne Datenlecks zu untersuchen. Verwenden Sie Azure Managed Grafana für Dashboards, die nach Mandantenrolle unterteilt sind.
Umsetzung von Mehrparteienmustern
Sie haben mehrere Architekturmuster zur Auswahl, die von vollständig geteilt bis hin zu vollständig dediziert reichen. Das richtige Muster hängt von der Größe Ihrer Mieter, den Compliance-Anforderungen und Ihrer DevOps-Reife ab.
Shared Everything (Single Application Instance, Shared Database)
Alle Mandanten teilen sich denselben Anwendungscode, dieselben Rechenressourcen und dieselbe Datenbank. Isolation ist rein logisch oder RLS-erzwungen. Dieses Muster maximiert die Ressourcenauslastung und vereinfacht die Bereitstellung. Es ist ideal für SaaS-Mandanten mit hohem Volumen und geringer Komplexität. Das Hauptrisiko besteht darin, dass ein lauter Nachbar-Mandant die Leistung für andere beeinträchtigen kann. Mit Azure SQL-Datenbank-Ressourcengrenzen und Drosselung auf Anwendungsebene verringern.
Gemeinsame Datenbank, separate Schemata
Tenants teilen sich eine einzelne Datenbank, haben aber separate Schemas (z. B. tenant 123.orders anstelle einer tenant id-Spalte). Dies bietet eine bessere logische Isolation und ermöglicht Backups pro Schema (obwohl Azure SQL-Datenbank nicht nativ ein Backup auf Schemaebene unterstützt - Sie würden die gesamte Datenbank sichern). Die Wartung ist schwieriger, da Schemamigrationen über alle Mandantenschemas hinweg angewendet werden müssen, oft über Skripte. Dieses Muster wird heute selten verwendet, da die Sicherheit auf Zeilenebene eine ähnliche Isolation mit weniger Overhead bietet.
Separate Datenbanken (Datenbank pro Mieter)
Jeder Mandant hat seine eigene Datenbank und möglicherweise einen eigenen elastischen Pool oder Server. Dieses Muster bietet die stärkste Isolation, die größte Flexibilität für die Mandanten-spezifische Konfiguration und die einfachste Compliance (einen Mandanten einfach durch Löschen der Datenbank entfernen). Der Nachteil ist der Verwaltungsaufwand – Sie müssen Bereitstellungs-, Sicherungs- und Migrationsaktionen für viele Datenbanken skriptieren. Azure Elastic Jobs, Azure Automation und Azure CLI können helfen. Für Tausende von Mandanten ist eine Sharded-Datenbank pro Mandant üblich.
Hybrid- und Pool-Modelle
Viele ausgereifte SaaS-Anbieter kombinieren Muster. Verwenden Sie beispielsweise eine gemeinsame Datenbank für Mandantenmetadaten, Konfigurations- und Auditprotokolle und dedizierte Datenbanken für Mandanten oberhalb einer bestimmten Umsatzschwelle. Oder Pools kleiner Mandanten in elastischen Pools und Platzieren großer Mandanten in dedizierten Pools. Das Sharding der Azure SQL-Datenbank (über Elastic-Datenbanktools) unterstützt diesen Ansatz, indem Abfragen an die richtige Shard basierend auf einem Mandantenschlüssel weitergeleitet werden.
Best Practices für Multi-Tenant Azure SaaS-Anwendungen
Über das ursprüngliche Design hinaus führt der laufende Betrieb zu einem SaaS-Angebot mit mehreren Kunden oder unterbricht diese Praktiken, um Zuverlässigkeit, Sicherheit und Kosteneffizienz zu gewährleisten.
- Design für Skalierbarkeit von Anfang an. Verwenden Sie Azures eingebaute automatische Skalierung für App Service, AKS und Datenbanken. Testen Sie mit simuliertem Mandantenwachstum, um sicherzustellen, dass Ihre Skalierungslogik funktioniert. Verwenden Sie Azure Front Door oder Traffic Manager für die globale Lastverteilung.
- Priorisieren Sie die Mandantenisolierung in jeder Schicht. Ihre Authentifizierung, Autorisierung, Datenzugriff und Protokollierung müssen alle einen expliziten Mandantenkontext enthalten. Verlassen Sie sich niemals ausschließlich auf Code-Level-Prüfungen - erzwingen Sie die Isolation über die Sicherheit auf Datenbankzeilenebene, Azure RBAC oder API-Richtlinien. Auditieren Sie regelmäßig mit Penetrationstests.
- Überwachen und optimieren Sie kontinuierlich. Verwenden Sie Azure Monitor, um die Leistung, Kosten und Fehlerraten pro Tenant zu verfolgen. Richten Sie eine Warnung auf anomales Verhalten ein, das auf einen lauten Nachbarn oder ein Sicherheitsproblem hinweisen könnte. Verwenden Sie Application Insights, um Anfragen über Ihr Multi-Tenant-Backend zu verfolgen.
- Automatisieren Sie das Mandantenlebenszyklusmanagement. Stellen Sie neuen Mandanten ARM-Vorlagen, Bicep oder Terraform zur Verfügung. Automatisieren Sie die Erstellung von Datenbanken, die Einrichtung von Identitäten und die Erstdatenauswertung. Dekommissionieren Sie Mandanten sauber – archivieren Sie Daten, widerrufen Sie den Zugriff und entfernen Sie Ressourcen, um unnötige Kosten zu vermeiden.
- Planen Sie Datensicherung und -wiederherstellung. Sichern Sie bei freigegebenen Datenbankmodellen die gesamte Datenbank und stellen Sie sicher, dass die Wiederherstellung zum Zeitpunkt für alle Mandanten funktioniert. Implementieren Sie bei Datenbanken mit einem einzelnen Mandanten automatisierte Sicherungsrichtlinien (Azure SQL-Datenbank macht dies automatisch mit Aufbewahrungsrichtlinien). Testen Sie die Wiederherstellung der Daten eines einzelnen Mandanten, um die Isolation zu validieren.
- Implementieren Sie die Kostenverfolgung pro Mandant. Markieren Sie alle Azure-Ressourcen mit einer Mandanten-ID. Verwenden Sie Azure Cost Management, um Kostenberichte pro Mandant zu erstellen. Ziehen Sie in Betracht, Mandanten basierend auf dem tatsächlichen Verbrauch (CPU, Speicher, Datenübertragung) zu laden, um die Kosten an den Einnahmen auszurichten.
- Sicheren Sie sich die CI/CD-Pipeline. Verwenden Sie separate Bereitstellungsplätze oder AKS-Namespaces für die Staging. Führen Sie Integrationstests aus, die mehrere Mandanten simulieren. Legen Sie niemals Mandantendaten in Protokollen oder Testausgaben frei. Verwenden Sie Azure DevOps oder GitHub-Aktionen mit verwalteter Identität für die sichere Bereitstellung.
Schlussfolgerung
Die richtige Architektur gleicht Isolation, Skalierbarkeit, Sicherheit und Kosten basierend auf Ihrem spezifischen Mandantenprofil und Geschäftsmodell aus. Azures umfangreiches Serviceportfolio – von App Service und Azure SQL Database bis Azure AD B2C und Key Vault – bietet die Bausteine, um jedes Muster zu implementieren, von vollständig geteilt bis vollständig dediziert. Durch die Befolgung der in diesem Artikel beschriebenen Prinzipien und Best Practices können SaaS-Anbieter zuverlässige, sichere und kostengünstige Multi-Tenant-Lösungen liefern, die mit ihren Kunden wachsen.