2010-10-26 13 views
1

J'utilise Map Reduce avec MongoDB. Scénario simplifié: il y a des utilisateurs, des objets et des choses. Les articles incluent n'importe quel nombre de choses. Chaque utilisateur peut évaluer les choses. La réduction de carte est utilisée pour calculer la note globale pour chaque utilisateur sur chaque article. C'est une formule complexe qui utilise les cotes pour chaque élément de l'élément et l'heure de la journée - ce n'est pas quelque chose sur lequel vous pouvez indexer et donc map-reduce est une approche idéale pour le calculer. La question est la suivante: avoir calculé les résultats à l'aide de Map Réduire les stratégies utilisées par les utilisateurs pour maintenir ces collections de résultats par utilisateur dans leurs bases de données NOSQL?Stratégies pour conserver la carte Réduire les résultats pour les requêtes suivantes

1) Sur demande avec effacement automatique: Gardez-les autour pendant un certain temps, puis supprimez-les; les régénérer au besoin lorsque l'utilisateur fait une nouvelle demande?

2) Sur demande, ne jamais supprimer: les conserver indéfiniment. Lorsque l'utilisateur fait une demande et que la collection a dépassé sa date d'expiration, régénérez-la.

3) Programmé: Processus régulier en cours pour mettre à jour toutes les collections de résultats pour tous les utilisateurs?

4) Autre?

Répondre

1

La meilleure stratégie dépend de la nature de votre travail de réduction de mappage.

Si vous utilisez un appel de réduction de carte séparé pour chaque utilisateur individuel, j'irais avec la première ou la deuxième stratégie. L'avantage de la deuxième stratégie par rapport à la première stratégie est que vous avez toujours un résultat prêt. Ainsi, lorsque l'utilisateur fait une demande et que le résultat est périmé, vous pouvez toujours présenter l'ancien résultat à l'utilisateur, tout en exécutant une nouvelle map-reduce en arrière-plan pour générer un nouveau résultat pour les prochaines requêtes. Cela présente les avantages suivants:

  • L'utilisateur ne doit pas attendre que la réduction de la carte soit terminée, ce qui est important si la réduction de la carte peut prendre un certain temps. L'exception est bien sûr le tout premier appel map-reduce; à ce stade, il n'y a pas de vieux résultat disponible.
  • Vous exécutez automatiquement map-reduce uniquement pour les utilisateurs actifs, ce qui réduit la charge sur la base de données.

Si vous utilisez un unique, l'application à l'échelle cartographique réduire appel à tous les utilisateurs, la troisième stratégie est la meilleure approche. Vous pouvez facilement y parvenir en spécifiant un output collection. Les avantages de cette approche:

  • Vous pouvez facilement contrôler la fraîcheur du résultat. Si vous avez besoin de plus de résultats à jour ou si vous devez réduire la charge sur la base de données, il vous suffit d'ajuster la planification.
  • Votre code d'application n'est pas responsable de la gestion des appels map-reduce, ce qui simplifie votre application.

Si un utilisateur ne peut voir ses propres notes, je partirais avec stratégie à un ou deux, ou inclure un horodatage lastActivity dans les profils utilisateur et exécuter une application à l'échelle programmé carte-réduire l'emploi sur l'actif sous-ensemble des utilisateurs (stratégie 3). Si un utilisateur peut voir les notes d'un autre utilisateur, j'irais aussi avec la stratégie 3, car cela réduit considérablement la complexité de l'application.