web-dev-qa-db-fra.com

Multi-local ou multi-instance?

J'essaie de construire un Web SaaS Solution, et j'ai frappé une route où je ne suis pas sûr d'utiliser plusieurs locaux ou multi-instances. Je vais essayer de décrire ce que je suis Essayer de réaliser, et chaque approche des avantages et des inconvénients (mon avis, selon ce que j'ai lu). Veuillez inclure vos suggestions au cas où j'ai manqué quelque chose d'une approche sur l'autre.

L'application que j'essaie de construire est, comme je l'ai mentionnée, a SaaS solution où les entreprises peuvent créer leurs comptes et que chaque compte/entreprise a ses propres utilisateurs, clients, produits, services. ..etc. Chaque utilisateur; qui est un employé de la société; liée à un compte/société n'aura accès qu'à ses clients, produits et services de sa société. Les entreprises pourraient avoir un nombre illimité de clients, produits et services, ainsi que chaque entreprise devrait avoir son propre centre de données.

Pour cela, j'ai décidé de créer une base de données partagée (sauvegarder toutes les informations d'identification des utilisateurs à des fins de connexion) et plusieurs bases de données Schéma partagée (base de données par compte/entreprise). Fondamentalement, multi-location .

Ensuite, quelqu'un a suggéré d'utiliser multi-instance à la place, où chaque entreprise aura sa propre instance de l'application (code, bibliothèques, base de données, cadres ... etc) totalement séparé des autres entreprises. Cela semble mieux car je n'ai pas à prendre soin d'une couche supplémentaire où j'ai besoin de vous assurer que les utilisateurs de chaque locataire ont accès uniquement aux données de leur entreprise. Je pense qu'il est bon de mentionner que je dépend du docker Pour atteindre cette approche (je ne l'ai jamais utilisée auparavant), mais je pense que cela manque de fonctionnalités ( Plus sur ceux plus tard), j'aurai besoin à l'avenir (au moins je ne les ai pas trouvés avec un peu de recherche).

Cependant, chaque approche vient avec les avantages et les inconvénients, donc je ne pouvais donc pas prendre une décision avec laquelle une approche à suivre. Voici une liste, mais nue avec moi alors que je manque les connaissances en eux, donc il pourrait y avoir quelque chose dont je ne suis pas au courant, ni une solution à un problème que je n'ai pas trouvé sur le Web: [Chaque approche a une liste ordonnée dont j'ai suivi une comparaison une par une]

Multi-location :

  1. Hôte/Hôte partagée, code partagé et base de données multiples.
  2. C'est plus facile Pour prolonger la fonctionnalité du code et corriger les bugs (code partagé).
  3. C'est plus difficile Pour étendre le matériel (pourrait utiliser un service cloud) ou déplacer la base de données du locataire individuel vers un autre système sans modifier le code.
  4. Plus important encore, comme je l'ai déjà mentionné, j'ai besoin d'ajouter une couche supplémentaire au système pour vous assurer que l'utilisateur appartient réellement à sa société et n'accédant à aucune information d'une autre société.

Multi Instance :

  1. Hôtes/Hôtes/Hôtes/Différents partagés ou non, Code par instance et Base de données par exemple.
  2. C'est plus difficile Pour étendre la fonctionnalité ou corriger les bugs (je ne suis pas sûr s'il ya un moyen de le faire dans Docker où vous pouvez ajouter des fonctionnalités/fonctionnalités à une instance ou à un conteneur Docker et de déployer aux autres).
  3. C'est plus facile Pour déplacer toute l'instance sur un autre hôte/matériel.
  4. Comme l'instance, je n'ai pas besoin de prendre soin de cette couche car chaque instance aura sa propre base de données.

Tous les avantages et les inconvénients sont redondants au cas où je veux faire n'importe quoi manuellement (comme créant une instance pour chaque locataire manuellement), et c'est pourquoi je doute de la solution Docker, à moins que le moyen de résoudre ce problème, ce qui est peut-être le principal raison de la question. J'apprécierais que si vous répondiez à la question avec des références aux solutions et pourquoi pensez-vous que cette approche est meilleure que l'autre.

En cas d'aide (peut-être?), Nous utilisons Laravel comme le cadre principal de l'arrière-plan (tout de repos).

11
Asher

Je me demande exactement la même question pour le moment.

Je me penche vers la solution de location unique à plusieurs instances, mais je n'ai pas encore pris de décision définitive. Permettez-moi de partager certaines de mes pensées:

L'avantage historique principal de l'architecture multi-locataires est une meilleure utilisation des ressources d'infrastructure, par Mutualisation (OS unique, base de données unique, couche d'application unique) et mieux occupant ladite Ressources (quand un utilisateur est absent, un autre peut utiliser la même ressource).

C'est aussi grandement simplifie le cycle de vie du logiciel: Vous déployez de nouvelles versions à votre instance, tous les clients sont mis à jour en même temps.

Il semble toutefois que les progrès récents de la technologie des clouds rendent la première classe d'avantages largement disponibles dans une architecture multi-instance (instance par client) (je pense spécifiquement d'une plate-forme comme Jelastic ici, mais je suis sûr qu'il y en a d'autres fournir les mêmes fonctionnalités):

  • PAA basé sur des conteneurs
  • Provisionnement et mise à l'échelle automatique des conteneurs (conteneurs élastiques)

Donc, la gestion du matériel et de la plate-forme n'est plus la préoccupation du fournisseur de logiciels. Les ressources sont mutualisées beaucoup plus efficacement qu'auparavant à l'infrastructure et aux niveaux de plaform.

Il y aura encore une surcharge pour plusieurs instances (certaines applications et middleware seront courantes au lieu d'une seule fois), mais beaucoup plus bas que lors de l'utilisation d'une machine séparée (virtuelle) par instance. La base de données pourrait être partagée de toute façon (un schéma par exemple, plusieurs schémas par serveur DB)

Aussi :

  • L'automatisation de la création de nouvelles instances est possible via Paas API
  • L'automatisation du déploiement de nouvelles versions est possible via PAAS API, avec zéro temps d'arrêt (prend du travail à mettre en place)
  • La mise à l'échelle est toujours dehors, jamais en hausse. Nous n'avons pas à vous soucier d'énormes ensembles de données au niveau de l'instance.

Bien sûr, nous aurions besoin d'une sorte de service central qui gère tout cela automatiquement (par exemple la création d'instance lorsqu'un nouvel utilisateur crée un compte). Cela gérerait également les problèmes de paiement et de licence, interaction entre les instances, etc. Ce service central pourrait être assez complexe et difficile à développer, mais la bonne chose est que nous n'avons pas à la mettre en œuvre (maintenant que nous n'avons pas beaucoup Ressource) alors que le multi-locataire devra être cuit à l'application depuis le début.

Ce qui m'amène aux derniers avantages du développement d'un locataire unique pour un projet de démarrage très précoce (pré-invention):

  • La même version (ou presque la même) version de l'application peut être déployée sur place soit en tant que conteneur d'appareils virtuels ou de docker ou même sur une machine gérée par le client (certaines entreprises sont toujours réticentes au cloud et il peut aider un démarrage au stade précoce de ne pas pousser d'importants adoptants précoces)
  • plus rapide pour obtenir un produit avec des ressources limitées (la couche d'application et le schéma de base de données est assez complexe), peut obtenir un produit unique de locataire unique unique (MVP) d'abord (MVP) pour les premiers adoptants et à Montrez la valeur commerciale de l'application aux investisseurs potentiels et ajoutez toute l'automatisation du nuage plus tard sur
  • Peut être considéré comme un argument de vente pour les clients inquiets de la sécurité des données: Les données sont mieux encapsulées car chaque client a son propre schéma ou même une base de données. Beaucoup moins de risque de "déversement"

NB: Je pense évidemment ici d'une application commerciale où les clients seraient des entreprises (chacune avec plusieurs utilisateurs individuels) et non des individus. Il n'aurait aucun sens d'exécuter une instance séparée d'une application pour chaque utilisateur individuel (ou le ferait-il?)

8
Pierre Henry

Soutenir les deux options est également possible (un pool de locataires sur plusieurs instances).

Je privilégie la cause multi-instance de l'isolement naturel. L'instance de chaque client s'exécute dans ses propres processus et ses données sont isolées dans sa propre base de données. Vous pouvez mettre à niveau des instances à de nouvelles versions par client/par exemple lorsque vous le souhaitez.

Les systèmes basés sur les locataires sont dotés d'un risque de sécurité des informations. Considérons juste à quel point il est facile d'oublier une clause "où télentide = x". La principale raison d'utiliser un système capable de locataire serait une performance, les processus sont lourds, en partageant un processus, vous pouvez potentiellement obtenir plus d'une machine. Cela était plus vrai que je pense dans un monde 32 bits, alors il est aujourd'hui sur 64 machines de bits qui ont beaucoup plus de RAM.

Un système multi-instance aurait peut-être peut-être un peu plus d'outillage pour créer et configurer l'environnement, telles que des bases de données et des instances d'application Web. On peut affirmer que vous devez avoir ce scripté de toute façon également pour vos déploiements d'instance. Faire cela a d'autres avantages aussi comme la capacité de mettre en place des environnements de développement et de test

Je quitterais les capacités du locataire jusqu'à ce que vous puissiez en faire un cas (Coût de l'ingénierie vs de l'argent enregistré sur une infrastructure (matérielle) via le partage de processus).

4
Joppe