J'ai créé quelque chose sur Google App Engine qui sert de backend pour une application iPhone. Dans l'application, il y a des interactions qui sont poussées vers les réseaux sociaux via leurs API. Ainsi, le flux de travail typique est comme ceci:Google App Engine - comment gérez-vous une exception DatastoreTimeoutException?
- utilisateur utilise l'application iPhone pour faire "quelque chose"
- App App Engine est alerté via HTTP
- App Engine avertit réseau social que l'utilisateur a fait "quelque chose". Si l'utilisateur devait vérifier son profil sur ce réseau, son activité via l'application serait affichée. Donc, en ce qui concerne l'utilisateur, ce qu'ils ont probablement fait a fonctionné.
- App Engine doit effectuer une certaine persistance par lui-même, mais lorsqu'il essaie, une exception DatastoreTimeException est levée. Et maintenant les données sont dans un état funky.
Alors, quelle est une bonne façon de gérer cela? De par la nature du problème, j'aimerais l'intégrer dans une «transaction», mais il n'y a aucun moyen de réduire ce qui a été envoyé au réseau social. Donc, je pense plus à la façon dont vous gérez une DatastoreTimeException? Devrais-je simplement l'emballer dans un bloc d'essai et lui donner un autre coup? Est-ce une meilleure idée de montrer une erreur à l'utilisateur, puis quand il réessaye, "passez" l'interaction du réseau social pour qu'il ne soit pas expulsé deux fois? Y at-il une autre idée à laquelle je ne pense pas ici?
En pratique, réessayer est souvent un succès; vous obtiendrez périodiquement des délais d'attente de banque de données, même pour les petites opérations. – geoffspear
C'est ce que je veux dire - si cela a échoué parce que le magasin de données a piqué, puis réessayer est génial. Si cela a échoué parce que vos entités sont devenues trop grandes, alors réessayer ne fera que s'amortir pour toujours. En supposant que c'est un problème, la durée détermine si vous pouvez réessayer dans une simple boucle (avant que votre requête expire aussi), ou si vous avez besoin d'une tâche (car cela prendra plus d'une requête pour résoudre l'état funky)). Mais je n'ai pas d'expérience de cela sur le moteur de l'application. –
L'objet a quelques propriétés - une chaîne, une longue, quelques dates et quelques entiers. Est-ce que cela pourrait être considéré comme "trop grand" ou est-il sûr de parier que c'était un pépin (c'est la seule fois que je l'ai vu). – bpapa