Architecture et urbanisation des systémes d'information
Quest-ce que le multi-tenant?
Publ fe 19 janvier 2017
Quest-ce que le multi-tenant ?
Définissons d’abord le terme tenant en frangais et, qui correspond au mot « Locataire », Done, on peut traduire le
multi-tenant par le terme multi-locataire.
Le multi-tenant est un modele darchitecture logicielle qui permet & partir d'une seule instance d’application de servir de multiples clients oi,
chaque client est appelé locataire (tenant)
Ce type d'architecture doit offrir la possibilité de personnaliser certaines parties de application, comme la personnalisation des interfaces et les
regles de gestion sans pour autant modifier le code de application.
Pourquoi cette tendance des applications multi-tenant ?
architecture multi-tenant est la réponse conceptuelle pour les exigences des modéles Saas (software as a service ou logiciel en tant que service)
ui apporte les avantages suivants par rapport & un modéle classique
e383 &
EEE] c=)
eeas
Single-tenant Multi-tenant
Quelle est la différence entre une architecture single-tenant vs multi-tenant ?
Le tableau suivant identifie les points de différence entre les deux types d'architecture au niveau applicatif et au
niveau des données.
Single-tenant Multi-tenant
Application Séparé Partagé
(Mais qui peut tourner sur des environnements d'exécution
différents)
Base de Séparé Séparé
données Bases de données Meme base Meme base,
séparées mais des méme schémaschémas. mais séparé par
séparés une colonne
ID_LOCATAIRE
pour chaque table
Différence single-tenant vs multi-tenant
Comment développer une application multi-tenante?
Pour qu'une application soit conforme a une architecture mult-tenante, elle devrait garantir ces trois
caractéristiques:
1. Isolation des données
2, Personalisation des fonctionnalités
3. Isolation des environnements d'exécution
Isolation des données
Etant donné que le modéle se base sur un partage d'une seule instance applicative et une séparation des
données, tout I'enjeu est de trouver la bonne démarche pour tisolation des données de chaque tenant.
Pour ce faire, il y a 3 approches
Bases de données distinctes
Le stockage des données des locataires dans des bases de données distinctes constitue 'approche la plus
simple pour isoler les données.
Avantage inconvénient
1 Faciliter l'extension du modéle de données: 4. CoAts plus élevés pour le maintien de
de application pour des besoins spécifique & un Téquipement et de la sauvegarde des données
client. des locataires
2, Niveau de sécurité élevé : empéche tout
locataire d'accéder accidentellement ou
malicieusement aux données des autres locataires
3. Restauration plus facile des données d'un
locataire en cas de panneBase de données partagée, schémas séparés
Le principe est de héberger plusieurs locataires dans la méme base de données, chaque locataire ayant son
propre ensemble de tables qui sont regroupées dans un schéma créé spécifiquement pour le locataire.
Lorsqu'un client s'abonne au service, le sous-systéme de provisionnement crée un ensemble discret de tables
pour le locataire et l'associe au schéma propre du locataire
application peut ensuite créer et accéder aux tables dans le schéma du locataire en utilisant la convention
Avantage
1. Facile a mettre en ceuvre.
2. Permet l'extension du modéle de données
pour des besoins spécifiques & un client.
Base de données partagée, Schéma partagé
inconvénient
1, Niveau de sécurité : moyen, puisque le
systéme n’est pas complétement isolé, puisque il
se base sur une séparation logique des objets de
la base de données.
2, Restauration de données compliqué a
réaliser : pour restaurer les données d'un seul
client, l'administrateur de la base de données doit
restaurer la base de données sur un serveur
temporaire, puis importer les tables du client dans
le serveur de production, tache compliquée et
potentiellement longue.
Cette troisiéme approche consiste a utiliser la méme base de données et le méme schéma. L principe c'est
qu'une table dans la base peut contenir des enregistrements de plusieurs locataires et, stockés dans n‘importe
quel ordre.Une colonne ID par locataire est créée dans chaque table (Exemple ID_LOCATAIRE) qui permet d'associer
chaque enregistrement a son locataire,
Avantage
1. Trés facile mettre en ceuvre,
2. Permet extension du modéle de données
pour des besoins spécifiques a un client.
Personalisation fonctionnelle
inconvénient
1. Le niveau de sécurité est moyen, puisque le
systéme n’est pas complétement isolé, étant
donné qu’on a juste une séparation logique des
objets de la base de données
2. Demande un effort supplémentaire au
niveau de développement pour assurer une
étanchéité entre les enregistrements de chaque
locataire.
3. Risque d'augmenter tes bugs
(chevauchement des enregistrements)
4. Coit de tests plus élevé,
5. _ Lhébergement de tous les enregistrements
dans une méme table entraine généralement une
lenteur d'accés et donc une baisse de
performance.
6, _ Restauration de la base trés délicate avec
suppression et insertion des lignes.
Avec les applications classiques non partagées on a un environnement d'exécution dédié pour chaque client,
Toute personalisation requise pour un client peut étre effectuée dans le code client déployé sur cet
environnement, Mais une application multi-tenante ne peut pas suivre le méme principe depuis un seul
environnement d'exécution. Par conséquent, une application multi-locataire doit étre congue en prenant en
compte la possibilité de personnalisation des fonctionnalités.
Le mode de personalisation peut étre :Au niveau des processus métiers : Par exemple un client peut définir son processus d'achat différemment
qu'un autre client (en introduisant d'autres phases de validation dans le parcours)
Au niveau des fonctionnalités : Par exemple, une fonction de paiement peut varier selon les clients, certains
peuvent demander un envoi de mail alors que d'autres exigent un envoi par sms
Au niveau de l’offre des licences : Le produit posséde plusieurs licences qui définissent les fonctionnalités
activées pour le client
Implémentation technique du multi-tenant
Tout lenjeu technique pour garantir un fonctionnement multi-tenant est d'assurer qu'une entité donnée, qui
représente une classe de mapping a une table de base de donnée est bien partagée entre plusieurs locataires
d'une application.
Avec les environnements java on a deux solutions envisageables
1, Utilisation de l'API Java Persistence (JPA) pour EclipseLink avec la version 2.5
A Stratégie par table partagé c’est-a-dire allocation des lignes par locataire avec I'annotation
@Multitenant (SINGLE_TABLE)
Le type multi-tenant SINGLE_TABLE spécifie que la table peut inclure des lignes pour plusieurs locataires.
Laceés aux lignes spécifiques aux locataires est réservé a l'aide de colonnes discriminantes.
@Entity
@Table(nam
EMP")
@Multitenant(SINGLE_TABLE)
@TenantDiscriminatorColumn(name = "TENANT_ID”,
contextProperty = « employee-tenant.id »)
model.Employee »>
»EMP »/> ...
A, Stratégie au niveau c’est-a-dire allocation des tables par locataire avec l'annotation @Multitenant
(TABLE_PER_TENANT) Spécifie que la table ou les tables d'une entité sont des tables spécifiques a un
locataire. acces a ces tables est limité au locataire spécifié.
B. Toutes les opérations de lecture, d'insertion, de mise a jour et de suppression du locataire s'appliquent
uniquement aux tables du locataire.
c,@Entity
@Table(nam:
EMP") @Table (nom = « EMP »)
@Multitenant(TABLE_PER_TENANT) @Multitenant (TABLE_PER_TENANT)
@TenantTableDiscriminator(SCHEMA) @TenantTableDiscriminator (SCHEMA)
public class Employee { Public class Employe {
yy
.. Entity>
A, Stratégie au niveau de la base de donnée avec I'annotation @Multitenant(VPD) Pour utiliser la
mubkidistribution EclipseLink VPD, vous devez d'abord configurer VPD dans la base de données, puis
spécifier le multi-tenant sur lentité
Le type multi-tenant VPD (Virtual Private Database) spécifie que la base de données gére le filtrage de locataire
‘sur toutes les requétes SELECT, UPDATE et DELETE. Pour utiliser ce type, la plate-forme utilisée avec I'unité de
persistance doit prendre en charge VPD.
@Entity@Muttitenant(VPD)@TenantDiscriminatorColumn(name = « USER_ID », contextProperty =
«tenant.id »)@Cacheable(false) public class Task implements Serializable (
> _