2014-08-28 2 views
2

Je recherche un bon moyen d'implémenter plusieurs bases de données pour le support multi-locataires en utilisant node.js + mongoose et mongodb.Mongoose créer une connexion pour le support multi-tenancy dans node.js

J'ai découvert que mongoose supporte une méthode appelée createConnection() et je me demande quelle est la meilleure pratique pour l'utiliser. En fait, je stocke toutes ces connexions dans un tableau, séparées par le locataire. Ce serait comme:

var connections = [ 
    { tenant: 'TenantA', connection: mongoose.createConnection('tenant-a') }, 
    { tenant: 'TenantB', connection: mongoose.createConnection('tenant-b') } 
]; 

Disons que l'utilisateur envoie le locataire, il sera connecté par les en-têtes de demande, et je reçois dans un middleware très tôt express.

app.use(function (req, res, next) { 
    req.mongoConnection = connections.find({tenant: req.get('tenant')}); 
}); 

La question est, est-il OK pour enregistrer les connexions statique ou un meilleur mouvement serait créer cette connexion chaque fois qu'une demande est faite?

Modifier 09/09/2014 - Plus d'informations sur les exigences logicielles

Au début, nous allons avoir environ 3 locataires, mais notre plan est d'augmenter ce nombre à 40 en un an ou deux. Il y a plus d'opérations de lecture que d'écriture, c'est un gros système de données avec apprentissage automatique. Ce n'est pas un logiciel freemium. Les bases de données sont assez grandes parce que la quantité de données historiques, mais ce n'est pas un problème de déplacer des données très anciennes vers un autre emplacement (nous avons déjà pensé à cela). Nous prévoyons de l'effacer plus tard si nous manquons de ressources disponibles sur notre machine de base de données, nous pourrions également séparer certains locataires dans différentes machines. Ce qui m'intrigue le plus, c'est que certaines personnes disent que ce n'est pas une bonne idée d'avoir des collections préfixées pour le multitenancy, mais les raisons sont très courtes.

https://docs.compose.io/use-cases/multi-tenant.html

http://themongodba.wordpress.com/2014/04/20/building-fast-scalable-multi-tenant-apps-with-mongodb/

+0

Il est coûteux de créer et de détruire des connexions tout le temps - utilisez-vous l'authentification dans la base de données? Ou seulement dans votre application? Chaque locataire est-il dans une instance distincte, "db", séparé "collection" ou ...? c'est-à-dire, comment les connexions diffèrent-elles? –

+0

Hé, merci de répondre. L'authentification se passe au niveau de l'application mais elle vérifie une collection mongo (utilisateurs). L'idée est d'avoir un db pour chaque locataire (après quelques recherches sur le web, les gens disent d'éviter la collecte de préfixes mais ils ne disent pas pourquoi ...). Nous ne savons pas encore comment les locataires différeront les uns des autres, peut-être un peu plus tard, mais j'aimerais que cela soit préparé comme des index différents. –

Répondre

6

Je ne recommanderais pas créer manuellement et gérer ces connexions distinctes. Je ne connais pas les détails de vos exigences multi-locataires (nombre de locataires, taille des bases de données, nombre de transactions attendues, etc.), mais je pense qu'il serait préférable d'aller avec quelque chose comme Mongoose's useDb function. Ensuite, Mongoose peut gérer tous les détails du pool de connexions.

mise à jour

La première direction j'explorer consiste à configurer chaque locataire d'un processus de noeud séparé. L'exécution de vos locataires dans des processus de nœuds distincts présente certains avantages intéressants. Cela a du sens du point de vue de la sécurité (mémoire isolée) et du point de vue de la stabilité (un crash de processus locataire n'affecte pas les autres).

En supposant que vous basez la location sur l'URL, vous devez configurer un serveur proxy devant les serveurs locataires réels. Son travail consisterait à examiner l'URL et l'itinéraire vers le bon processus en fonction de ces informations. Ceci est une configuration très simple node http proxy. Chaque instance de locataire pourrait être exactement la même base de code, mais lancée avec une config différente (qui leur indique quelle chaîne de connexion mongo utiliser). Cela signifie que vous êtes en mesure de concevoir votre application réelle comme si elle n'était pas multi-locataire. Chaque processus ne connaît qu'une seule base de données mongo et il n'y a pas de logique multi-locataire nécessaire. Il vous permet également de diviser facilement le trafic plus tard en fonction de la charge. Si vous avez besoin de séparer les locataires pour des raisons de performance, vous pouvez le faire de manière transparente au niveau du proxy.Le DNS peut tous rester le même, et vous pouvez simplement déplacer le serveur que les instances sont dans les coulisses. Vous pouvez même faire en sorte que le proxy équilibre les demandes d'un locataire entre plusieurs serveurs.

+0

J'ai édité la question pour fournir plus de détails sur les exigences. En ce qui concerne la fonction useDb, j'ai pensé qu'il pourrait être dangereux lorsqu'une requête est toujours en cours d'exécution lorsqu'une requête concurrente parvient au serveur et modifie la base de données. S'il reste une opération pour la première demande, il peut apporter des modifications au mauvais locataire. Est-ce correct ? THX! –

+1

useDb renvoie un autre objet de base de données à utiliser. Il ne changera pas l'objet de base de données existant, donc aucune opération de vol ne sera appliquée à la mauvaise base de données. –

+0

La charge sera-t-elle assez constante d'un locataire à l'autre, ou pensez-vous que certains locataires auront des besoins d'utilisation/de données significativement plus élevés? –

Questions connexes