2009-04-01 7 views
1

Je suis en train d'écrire une application Twitter dans Google App Engine. Il accepte les commandes en tant que messages directs, j'ai donc configuré un service cronjob tiers pour appeler un gestionnaire qui traite les agents de gestion à intervalles réguliers. J'ai un modèle 'Info' qui n'a qu'une seule entrée, il stocke des données communes qui sont utilisées dans de nombreux endroits de l'application (dans ce cas, l'heure à laquelle les messages ont été traités récemment). Le schéma général de mon gestionnaire est comme ceci:Incompatibilité de la base de données Google App Engine

class Info(db.Model): 
    msg_polled = db.DateTimeProperty(auto_now_add = True) 
    .... More Properties .... 

    @classmethod 
    def get_info(cls): 
     info = cls.all().get() 
     if not info: 
      info = cls() 
      info.put() 
     return info 
--------------------------------------------------------- 
info = Info.get_info() 
msgs = api.GetDirectMessages(since = info.msg_polled) 
if not msgs: 
    return 
logging.info('Processing Messages since %s ' % str(info.msg_polled)) 
for msg in msgs: 

    ...process commands... 

    logging.info('Processed Message :- @%s : %s' % (msg.sender_screen_name, msg.text)) 

info.msg_polled = datetime.datetime.now() 
info.put() 

Mais parfois je reçois des journaux comme ceci:

I 03-30 07:50AM 10.973 
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT 
I 03-30 07:50AM 11.122 
Processed Message :- @foo : Foo_Bar 
------------------------------------------------------- 
I 03-30 07:46AM 08.014 
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT 
I 03-30 07:46AM 08.130 
Processed Message :- @foo : Foo_Bar 

Ici, il semble que les informations ne s'engage à la base de données. Le message est traité plusieurs fois, parfois jusqu'à 10 fois avant que la valeur msg_polled ne change. Mais je ne reçois aucune exception Datastore. Cela n'arrive qu'une fois de temps en temps.

Toute aide est appréciée.

+0

Vous ne montrez pas dans votre échantillon comment vous récupérez des informations à l'origine. Pouvez-vous inclure cela? –

+0

En outre, le deuxième ensemble d'entrées de journal est daté _avant_ le premier ensemble - était-ce intentionnel? –

+0

Désolé, je vais inclure cela aussi .. et oui, les journaux sont dans l'ordre chronologique inverse .. – z33m

Répondre

0

Le magasin de données Google AppEngine utilise BigTable sous les couvertures, qui est un système de base de données distribuée. Pour cette raison, les mises à jour peuvent ne pas être immédiatement visibles puisque les nouvelles données n'ont pas encore atteint toutes les tables distribuées (Amazon appelle cette "cohérence éventuelle" dans leur SimpleDB). Vous devriez aller bien après quelques minutes.

+0

Mais les docs n'ont aucune mention d'une telle latence .. Alors, va réduire la fréquence du cronjob résoudre le problème? – z33m

+0

Je sais, j'ai cherché des liens pour soutenir mon histoire, mais je pourrais en trouver. Je suis sûr que je l'ai lu quelque part, cependant. Réduire la fréquence pourrait aider, en effet. Je vous suggère de faire un essai et de voir ce qui se passe. Faites le moi savoir! – Rik

+0

Le cronjob est actuellement en cours d'exécution une fois toutes les 4min .. vous pouvez le voir dans les horodatages du journal .. ne pensez-vous que 4min est un peu trop long pour ce genre de retard, même les retards de cohérence 'SimpleDB' sont dans l'ordre secondes non? – z33m

0

est ici une bonne documentation sur la cohérence dans GAE datastore:

https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore

La conclusion:

cohérence dans le temps est un élément essentiel des bases de données non relationnelles qui permet aux développeurs de trouver un optimal équilibre entre l'évolutivité, la performance et la cohérence. Il est important de comprendre comment gérer l'équilibre entre la cohérence éventuelle et forte pour concevoir un modèle de données optimal pour votre application. Dans Google Cloud Datastore, l'utilisation de groupes d'entités et de requêtes ancêtres est le meilleur moyen de garantir une cohérence forte sur un périmètre d'entités. Si votre application ne peut pas incorporer des groupes d'entités en raison des limitations décrites précédemment, vous pouvez envisager d'autres options, telles que l'utilisation de requêtes à clé uniquement ou Memcache. Pour les applications volumineuses, appliquez les meilleures pratiques, telles que l'utilisation d'identifiants dispersés et l'indexation réduite pour réduire le temps nécessaire à la cohérence. Il peut également être important de combiner Google Cloud Datastore avec BigQuery pour répondre aux exigences métier des requêtes complexes et réduire au maximum l'utilisation des index Google Cloud Datastore.

Questions connexes