5

J'ai une liste d'utilisateurs que seuls les administrateurs peuvent voir (= peu de lectures). Cette liste affiche également le nombre d'utilisateurs dans le magasin de données. Parce que la liste pouvait dépasser 1000, ma première pensée était d'éviter un nombre normal() et d'utiliser plutôt un compteur partagé. Cependant, le problème est que les administrateurs ont également accès à divers filtres de recherche (dans l'interface graphique), tels que la visualisation uniquement des utilisateurs masculins/féminins et ainsi de suite. Il est important que le nombre reflète ces filtres, afin qu'ils puissent obtenir le nombre d'utilisateurs féminins, les utilisateurs masculins et une myriade d'autres combinaisons. Pour cette raison, les compteurs fragmentés et les compteurs de concurrence élevée sans partitionnement ne semblent pas être une bonne idée, car je devrais créer un compteur pour chaque combinaison de filtres de recherche. Dois-je simplement créer une boucle de méthodes count(), comme décrit here ou est-ce une très mauvaise pratique? Comment ferais-je autrement? Notez que ce compteur est destiné à une interface d'administration et que le nombre de lectures est très limité. C'est vraiment un cas de quand je voudrais sacrifier des performances de lecture pour la flexibilité et la précision. Bien qu'il devrait être capable de se développer au-delà de 1000, il ne devrait pas dépasser 10 000.Comment créer un compteur flexible avec plus de 1 000 lignes mais peu de lectures dans Google App Engine?

Répondre

2

"Boucle de comptes" est lente, mais ces jours-ci vous pouvez faire un peu mieux avec cursors. Normalement, je recommande de dénormaliser tous les compteurs "filtrés" dont vous avez besoin, mais cela ralentit l'ajout et la suppression des utilisateurs (et probablement les changements démographiques), donc, compte tenu de votre cas d'utilisation avec un très faible volume de lectures, vous pouvez probablement échapper à l'approche "loop of counts" (plus les curseurs ;-).

+0

Merci pour votre réponse! Oui, je suis tenté par cette approche considérant que je vais avoir très peu de lectures et je ne suis même pas sûr que la liste dépassera 1000. Quand vous parlez de curseurs, voulez-vous dire que je devrais utiliser des curseurs pour décider de la position suivante()? – Aneon

2

J'ai essayé deux approches:

1) ma propre tâche qui interroge la banque de données (la requête est une clé de requête descendante) avec une limite fixe d'entités (par exemple 50). Il met ensuite en file d'attente la tâche suivante pour commencer à interroger où elle s'est arrêtée. Chaque tâche met en file d'attente la suivante en lui passant deux paramètres (où elle s'est arrêtée comme un curseur et un total cumulé du nombre d'entités qu'elle a vues).

2) Cette approche est beaucoup plus facile - et c'est d'utiliser la bibliothèque mapreduce fournie par google pour appengine. Il fonctionne totalement dans l'espace utilisateur, il vous suffit donc de télécharger et de construire la bibliothèque et de l'inclure dans votre projet. Fondamentalement, il traitera iterating à travers toutes les entités que vous spécifiez et vous permet d'écrire un gestionnaire pour savoir quoi faire avec chacun (comme l'incrémentation d'un compteur). Voir les détails ici: mapreduce.appspot.com - ils ont même un exemple d'application qui fait exactement ce que vous demandez. Le seul problème avec ceci est que les résultats apparaîtront dans votre navigateur et ne seront pas nécessairement stockés dans la banque de données à moins que vous ne le fassiez vous-même.

+0

La deuxième approche décrite ici, en utilisant un mapreduce pour recalculer, de façon régulière, toutes les statistiques importantes, semble être la meilleure approche. –

+0

Oh, je n'ai jamais entendu parler de MapReduce auparavant, je devrai me pencher là-dessus. Est-ce que cette approche me donnerait une précision complète ou devra-t-elle être mise à jour périodiquement (comme les compteurs de haute simultanéité sans sharding qui utilise la file d'attente de tâches)? Et cela m'oblige-t-il à configurer toutes les combinaisons de filtres possibles que je veux pouvoir compter manuellement? – Aneon

+0

Eh bien, si le nombre d'entités que vous avez change pendant la réduction de la carte, ces entités ne seront pas comptées. La carte réduit essentiellement prend un instantané à un certain moment dans le temps. En ne vous donnera pas un compte en temps réel du nombre d'entités que vous avez à un moment donné.Je l'utilise pour produire des statistiques à la fin de chaque journée. – aloo

Questions connexes