2

Pour toutes mes données dans le magasin de données GAE, j'ai un modèle pour garder la trace des compteurs/nombre total d'enregistrements (puisque nous ne pouvons pas utiliser les requêtes SUM traditionnelles). Je veux connaître le moyen le plus efficace d'incrémenter ces valeurs globales chaque fois que j'insère/supprime un enregistrement. C'est ce que je suis en train de faire:Compteurs Google App Engine

counter = DBCounter.all().fetch(1) 
dbc = DBCounter(totalTopics=counter[0].totalTopics+1) 
dbc.put() 

Mais cela me semble plutôt négligé. Des pensées sur une meilleure façon de faire cela?

Répondre

4

Si vous avez besoin de garder l'évolutivité en comptant, vous devriez regarder dans l'article de Joe Gregorio sur sharding counters et implementation de DocSavage de l'idée.

L'excellent blog de AppEngineFan contient également des informations sur les compteurs évolutifs non fragmentés, voir this one qui utilise les files d'attente de tâches et pointe vers l'article précédent sur l'utilisation des tâches cron à la place.

5

Il y a quelques problèmes avec votre approche:

  • Il peut sous-dénombrement puisque vous ne pas utiliser une transaction pour mettre à jour atomiquement le compteur.
  • Il est inefficace:
    • Contention peut devenir un problème si vous avez besoin de mettre à jour ce compteur fréquemment. Puisque vous n'avez qu'un seul compteur, il ne sera pas bien à l'échelle. Les entités de banque de données ne peuvent être écrites qu'à une vitesse d'au plus 5 fois par seconde.
    • Vous écrivez deux fois dans le magasin de données chaque fois que vous insérez un enregistrement. Si vous finissez par utiliser des transactions pour résoudre le problème ci-dessus, vous effectuez deux allers-retours vers le magasin de données chaque fois que vous insérez l'enregistrement (une fois pour insérer et une fois pour mettre à jour le compteur). Vous pourriez être en mesure d'utiliser une approche qui évite cet aller-retour supplémentaire dans le magasin de données.

Voici quelques approches alternatives (du moins précises [et plus rapide] pour le plus précis [et plus lent]):

  • Si vous avez seulement besoin d'un compte approximatif du nombre d'entités type particulier dans le magasin de données, alors vous pouvez utiliser le Stats API. Les comptes que vous récupérez ne sont cependant pas constamment mis à jour.
  • Si vous avez besoin de plus de granularité, mais que vous êtes d'accord avec une petite possibilité de sous-comptage occasionnel, vous pouvez utiliser un compteur amélioré memcache. Il y a plusieurs bonnes implémentations discutées dans this question. En particulier, voir le code dans les commentaires dans this recipe. Si vous voulez vraiment éviter le sous-comptage, alors vous devriez envisager un sharded datastore counter. Cela permettra d'éliminer le problème de conflit d'en haut.
+0

Excellents conseils. Merci beaucoup. – GivP