Question

Je développe un logiciel à l'aide du moteur d'applications Google.

J'ai quelques considérations sur la conception optimale du problème suivant: Je dois créer et sauvegarder des instantanés de certaines entités à intervalles réguliers.

dans le monde de la base de données relationnelle classique, je créerais des travaux de base de données dans lesquels seraient insérés de nouveaux enregistrements de synthèse.

Par exemple, un travail insère un enregistrement pour chaque utilisateur actif contenant son score actuel sous "userrank". table, disons, toutes les heures.

J'aimerais savoir quelle est la meilleure méthode pour y parvenir dans Google App Engine. Je sais qu’il existe un service Cron, mais permet-il d’exécuter des travaux qui inséreront / mettront à jour des milliers d’enregistrements?

Était-ce utile?

La solution

Avez-vous envisagé d'utiliser une API distante ? De cette façon, vous pouvez obtenir un shell dans votre magasin de données et éviter les délais d'attente. La classe Mapper illustrée dans ce lien est très utile et je l’utilise avec succès pour effectuer des opérations de traitement par lots sur ~ 1500 objets.

Cela dit, cron devrait également fonctionner correctement. Le temps de chaque requête individuelle est limité, vous ne pouvez donc pas les parcourir toutes en même temps, mais vous pouvez utiliser la redirection pour parcourir en boucle autant d'utilisateurs que vous le souhaitez, en traitant un utilisateur à la fois. Il devrait y avoir un exemple de ceci dans la documentation quelque part si vous avez besoin d'aide avec cette approche.

Autres conseils

Je pense que vous constaterez que la capture instantanée de l'état de chaque utilisateur toutes les heures n'est pas une solution qui s'adapte correctement quelle que soit votre infrastructure. Un environnement plus ordinaire dissimulera cela en vous laissant effectuer des tâches plus longues, mais vous atteindrez toujours le point où il n'est pas pratique de prendre un instantané des données de chaque utilisateur, toutes les heures.

Ma suggestion serait la suivante: ajoutez un champ "dernier instantané" et sous-classez la fonction put () de votre modèle (en supposant que vous utilisez Python; la même chose est possible en Java, mais je ne connais pas la syntaxe ), de sorte que chaque fois que vous mettez à jour un enregistrement, il vérifie si plus d'une heure s'est écoulée depuis le dernier instantané et, le cas échéant, crée et enregistre un enregistrement d'instantané.

Afin d'empêcher les mises à jour simultanées de créer deux instantanés identiques, vous souhaiterez attribuer aux instantanés un nom de clé dérivé de l'heure à laquelle l'instantané a été pris. Ainsi, si deux mises à jour simultanées tentent d’écrire un instantané, l’une écrasera l’autre de manière inoffensive.

Pour obtenir l’instantané pour une heure donnée, il vous suffit de rechercher le plus ancien instantané plus récent que la période demandée. De plus, comme les enregistrements inactifs ne sont pas instantanés, vous économisez également beaucoup d'espace.

J'utiliserais une combinaison de tâches Cron et d'une méthode d'extraction d'URL en boucle détaillée ici: http: // stage.vambenepe.com/archives/549 . De cette façon, vous pouvez récupérer vos délais et commencer une autre requête.

Pour résumer l'article, le travail cron appelle votre processus initial, vous interceptez l'erreur de délai d'attente et appelez à nouveau le processus, masqué sous la forme d'une deuxième URL. Vous devez faire un ping entre deux URL pour empêcher le moteur d'applications de penser que vous êtes dans une boucle accidentelle. Vous devez également faire attention à ne pas faire une boucle infinie. Assurez-vous qu'il existe un état final pour votre boucle de mise à jour, car cela vous ferait dépasser vos quotas assez rapidement si elle ne se terminait jamais.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top