2017-01-19 3 views
0

Actuellement, notre système n'est pas entièrement normalisé, et nous utilisons meteor-publish-composite pour obtenir les données normalisées dans mongodb. Certains modèles ont très peu de dépendances, mais d'autres ont des tableaux d'objets (c'est-à-dire des sous-documents) avec peu de clés étrangères auxquelles nous souscrivons lorsque nous récupérons chaque modèle.Est-il acceptable d'utiliser Meteor publish composite pour des dizaines d'abonnements?

Un exemple serait un Post contenant une liste de sous-documents Comment, où chaque commentaire a un champ userId. Ma question est, alors que je sais qu'il serait plus rapide d'utiliser des hooks de collection et de mettre à jour la collection avec la dénormalisation des données, comment Meteor gère-t-il plusieurs abonnements sur la même collection?

Une centaine d'abonnements sur la même collection affecte (significativement) la vitesse de l'application? Qu'en est-il de mille?

Répondre

1

Ceci peut ne pas complètement répondre à votre question, cependant après avoir passé d'innombrables heures à régler la performance d'une grande application de météore, j'ai pensé partager certaines des choses que j'ai apprises. Dans Meteor, lorsque vous définissez une publication, vous configurez une requête réactive qui continue de transmettre des données aux clients abonnés lorsque les modifications apportées aux données mongo sous-jacentes entraînent une modification du résultat de la requête. En d'autres termes, il configure une requête qui transmettra continuellement les données aux clients lorsque les données sont insérées, mises à jour ou supprimées. Le mécanisme par lequel il le fait est en créant un observer sur la requête. Lorsqu'un observer est initialisé (par exemple, lorsque la publication est souscrite à), il interroge mongodb pour l'envoi de l'ensemble de données initial, puis utilise l'oplog pour détecter les changements à venir. Heureusement, meteor est capable de réutiliser un observateur existant pour un nouvel abonnement si la requête concerne la même collection, les mêmes sélecteurs et les mêmes options. Cela signifie que vous pouvez créer des centaines d'abonnements pour de nombreuses publications différentes, mais si vous utilisez la même collection et utilisez les mêmes sélecteurs de requête, vous n'avez en réalité que 1 observe en cours de lecture. Pour plus de détails, je recommande fortement de lire this article de kadira.io (à partir de laquelle j'ai acquis l'information que j'ai utilisée dans cette réponse). En plus de cela, Meteor est également capable de gérer plusieurs publications en publiant le même document, et quand cela se produit, les documents seront fusionnés en un seul. Voir this pour plus de détails. Enfin, grâce au composant MergeBox de Meteor, les données envoyées sur le réseau de toutes vos abonnements seront minimisées en gardant une trace des données modifiées par rapport à celles déjà présentes sur le client. Par conséquent, dans votre exemple spécifique, il semble que vous exécuterez plusieurs abonnements différents sur la même requête (puisque vous essayez simplement de dénormaliser vos données) et l'ensemble de données. En raison de toutes les optimisations que j'ai décrites ci-dessus, je suppose que vous ne serez pas en proie à des problèmes de performance en adoptant cette approche.

J'ai fait des choses similaires dans l'une de mes applications et je n'ai jamais eu de problème.