2010-08-22 1 views
9

J'ai une application où l'entité principale est un Story et les utilisateurs peuvent voter pour chaque histoire. Chaque vote incrémente un vote_count pour l'histoire.Comment trier par un compteur lors de l'utilisation de compteurs fragmentés

Je suis préoccupé par les conflits d'écriture sur l'histoire, donc je prévois d'utiliser un sharded counter pour chaque histoire pour suivre les votes.

Maintenant ma question: comment pourrais-je obtenir une liste d'histoires classées par nombre de votes? Par exemple: montrez les 50 histoires les plus populaires.

Ma pensée initiale est d'avoir une tâche exécutée périodiquement qui lit les valeurs de compteur et met à jour une propriété sur l'histoire réelle. Il serait bon que les résultats de la requête par vote soient légèrement dépassés.

Répondre

2

Il semblerait que vous fassiez un peu d'optimisation prématurée. Je passerais les compteurs fragmentés jusqu'à ce qu'il devienne évident que vous en avez besoin. Si vous êtes sûr que vous le ferez, alors par tous les moyens, commencez avec eux. En ce qui concerne l'exécution d'une tâche périodique et la mise en cache des résultats dans une propriété pour chaque article, cela peut être une autre optimisation prématurée.

Je n'ai aucune expérience directe avec google app engine alors j'espère que quelqu'un qui le fera aura quelques informations à partager.

+1

Optimisation prématurée: Je suis d'accord qu'il est probablement trop cher pour une nouvelle application sans conflit d'écriture démontré, mais considérez ceci comme une question d'apprentissage et supposons que l'application recevra 10 écrit/seconde aux compteurs. – cope360

+0

C'est une question intéressante. Je n'avais jamais entendu parler des compteurs remplacés auparavant, alors j'ai hâte d'avoir plus de réponses. –

+0

J'ai ajouté un lien à la question si vous voulez vérifier comment ils fonctionnent. – cope360

1

L'ajout périodique de données peut être une bonne stratégie pour contrer la dispersion des compteurs.

Vous pouvez également essayer d'autres stratégies de comptage sans tessons, comme cela a été décrit par ailleurs:

http://blog.notdot.net/2010/04/High-concurrency-counters-without-sharding

(il vous gardez votre compteur dans memcache et à intervalles réguliers à débusquer la valeur accumulée au datastore)

Dans quelle mesure votre application est-elle critique pour de légères erreurs de comptage?

Questions connexes