Sébastien Rigaux

Veille technologique

← Tous les liens

Multi-tenancy

Architecture permettant à plusieurs clients de partager une application avec isolation de leurs données.

Logo en forme de cube composé de blocs gris, avec un bloc orange au centre.

Finbuckle.MultiTenant fournit à ASP.NET Core les briques de résolution des tenants, de configuration par tenant et d’isolation des données. Le démarrage combine une stratégie basée sur le host, un store alimenté par la configuration et le middleware UseMultiTenant().

Le middleware doit précéder ceux qui dépendent du tenant, comme l’authentification et l’autorisation. La bibliothèque propose aussi des intégrations pour les options, l’authentification et l’isolation des données avec Entity Framework Core.

Bannière « Multi-Tenant .NET, Part 4: Moving Day », avec des cartons de déménagement, un emblème de guilde et un portrait illustré.

Ce volet explique comment déplacer un tenant d’une base partagée vers une base dédiée sans arrêter l’application ni perturber les autres tenants. Le catalogue pilote le basculement, tandis que le même modèle EF Core et son filtre restent en place dans les deux modes.

La migration s’appuie sur une copie initiale, un passage temporaire en lecture seule, une copie delta et une vérification avant le cutover. Le runbook attend l’expiration du cache avant de rouvrir les écritures : les instances qui conservent encore l’ancienne connexion ne peuvent ainsi pas écrire dans la base partagée après le basculement.

BarretRepéré via C# Digest

Une main manipule des câbles réseau colorés devant des équipements installés en rack.

Avec une base par tenant, EF Core n’a plus besoin de filtre global, de colonne TenantId ni de clé de cache de modèle spécifique : le choix du tenant passe par une chaîne de connexion résolue depuis une base catalogue.

Cette isolation simplifie le modèle, mais déplace la complexité vers l’exploitation : chaque migration doit s’appliquer à toutes les bases. L’article détaille aussi le rôle de IDesignTimeDbContextFactory pour permettre à dotnet ef de créer le contexte sans requête ni tenant actif.

BarretRepéré via C# Digest

Visuel intitulé « Multi-Tenant .NET, Part 2 — Shared Database with Schema Separation » : un panneau « House for Rent », un emblème circulaire avec deux épées et un portrait illustré.

Cette partie 2/4 montre comment isoler les données de chaque tenant dans son propre schéma SQL Server, sans filtre global ni colonne TenantId obligatoire. Le modèle EF Core retrouve ainsi une clé primaire simple, tandis que la frontière d’isolation est portée par la structure de la base.

Le changement central tient au cache du modèle : OnModelCreating ne s’exécute qu’une fois par modèle. Il faut intégrer le schéma à la clé via IModelCacheKeyFactory, faute de quoi EF Core peut réutiliser celui du premier tenant. L’article détaille aussi le provisionnement et les migrations par schéma, ainsi que la validation stricte des noms de schéma interpolés dans le SQL.

BarretRepéré via C# Digest

Bannière sur fond d’immeubles résidentiels, titrée « Multi-Tenant .NET, Part 1 — Shared Database with Partitions », avec un emblème d’épées croisées et un portrait illustré.

Cette première partie présente une architecture multi-tenant .NET à schéma partagé : EF Core filtre les lectures par tenant et SQL Server partitionne physiquement les lignes pour accélérer l’accès aux données. Le point essentiel : le partitionnement n’est pas une frontière de sécurité ; l’isolation repose sur le filtre global EF Core.

L’article détaille aussi la résolution du tenant par requête, l’attribution de son identifiant aux nouvelles lignes et l’ajout des partitions aux migrations avec du SQL brut. La clé primaire doit inclure GuildId, contrainte imposée par SQL Server pour partitionner un index unique.

BarretRepéré via C# Digest