0

J'ai implémenté deux points de terminaison HTTP côté serveur qui 1) stocke certaines données et 2) les traite. La méthode 1) appelle la méthode 2) à App Engine Tasks car ce sont des tâches qui prennent du temps et que je ne veux pas que le client attende. Le processus est illustré dans le diagramme de séquence ci-dessous.Ce comportement étrange peut-il être expliqué par la cohérence éventuelle sur le magasin de données App Engine?

Maintenant, de temps en temps, j'expérience que la tâche de traitement (appelé processSomething dans le diagramme de séquence ci-dessous) ne peut pas trouver les données lors d'une tentative de processus - illustré avec le throw WtfException() jaune ci-dessous. Cela peut-il être expliqué par le Cohérence éventuelle modèle described here?

Le document dit une forte cohérence pour les lectures mais cohérence éventuelle pour les écritures. Je ne suis pas sûr de ce que cela signifie exactement lié à cette affaire. Toute clarification est appréciée.

enter image description here

modifier: Je me rends compte que je pose une question booléenne ici, mais je suppose que je suis à la recherche d'une réponse soutenue avec une documentation sur ce qui est en cohérence dans le temps général et plus particulièrement sur Google datastore

modifier 2: sur demande ici des détails sur les opérations de lecture/écriture réelle:

L'opération d'écriture:

entityManager.persist(hand); 
entityManager.close() 

J'utilise JPA pour la persistance des données. L'objet 'main' est reçu du client et n'est pas précédemment stocké dans la base de données, de sorte qu'une nouvelle clé Id sera affectée.

L'opération de lecture:

SELECT p FROM Hand p WHERE p.GameId = :gid AND p.RoundNo = :rno 

Ni GameId ni RoundNo est la clé primaire. GameId est une "clé étrangère" bien que le Datastore soit inconscient de cela par la conception.

+1

si vous chargez (id) par clé, je pense que vous devriez obtenir l'entité mise à jour. From doc "Comme Datastore obtient et les requêtes ancêtres appliquent toutes les modifications en attente avant l'exécution, ces opérations voient toujours une vue cohérente de toutes les transactions réussies précédentes.Cela signifie qu'une opération get (recherchant une entité mise à jour par sa clé) est garanti de voir le dernière version de cette entité. " – marcadian

Répondre

2

Il serait utile que vous montriez code réel, montrant comment vous enregistrez l'entité et la façon dont vous le récupérer, mais en supposant que id est un ID datastore réelle, une partie d'une clé, et que votre load est un get en utilisant l'identifiant et pas un query sur une autre propriété puis la cohérence éventuelle n'est pas votre problème.

(La documentation sur ce point est further down the page you linked.)

+0

J'ai mis à jour la question avec des détails sur le code d'interaction db. Comme vous pouvez le voir, vos deux suppositions sont fausses, mais je suppose que l'on peut en déduire que la réponse principale est ** oui ** à ma question: Cohérence éventuelle * peut * être le problème ici. Se mettre d'accord? – Nilzor

+0

Oui, c'est définitivement un candidat. – Greg

Questions connexes