Intégration de la banque de données Google App Engine et de l'API de recherche

Intégration de la banque de données Google App Engine et de l'API de recherche

Il semble qu'il existe de nombreuses situations dans lesquelles vous souhaitez stocker des données dans le magasin de données et les enregistrer dans l'index de l'API de recherche. Cependant, si vous ne faites pas attention aux transactions, il est possible que même s'il est stocké dans le magasin de données, il ne soit pas enregistré dans l'index de l'API de recherche (ci-après, l'index signifie l'index de l'API de recherche). Je vais finir.

Par conséquent, considérons une méthode d'enregistrement des données dans le magasin de données et l'index (presque) en même temps.

  1. Comment utiliser _post_put_hook (la cohérence n'est pas garantie)
  2. Utilisation simple de @ ndb.transacational (cohérence garantie)
  3. Comment utiliser Task Queue (cohérence garantie)
  4. Conclusion

** 1 méthode n'est pas recommandée **. Cependant, il existe quelques exemples d'utilisation de la méthode 1 (une a été soumise comme réponse dans Stack Overflow, et Ferris 2.2 utilise la méthode 1), je la présente donc pour le moment.

1. Comment utiliser _post_put_hook

** Non recommandé ** sauf si vous avez une raison spécifique.

class User(ndb.Model):
    name = ndb.StringProperty()
    
    def _post_put_hook(self, future):
        result = future.get_result()

#Register dans l'index de l'API de recherche ...

post_put_hook est appelé après que l'utilisateur a été placé. Si put échoue, une erreur sera envoyée dans la partie future.get_result (), elle ne sera donc pas enregistrée dans Index. Cependant, il est possible que l'enregistrement de l'utilisateur échoue même si l'enregistrement de l'utilisateur est réussi.

En d'autres termes, cette méthode ne garantit pas la cohérence de la banque de données et de l'index. Si la cohérence ne doit pas être garantie, c'est bien, mais sinon, elle doit être évitée.

2. Comment utiliser simplement @ ndb.transacational

user = User(name='Yohei')

@ndb.transactional
def put():
    user.put()
    doc = search.Document(
        doc_id = person.key.urlsafe(),
        fields=[
            search.TextField(name='name', value=user.name),
        ],)
    index.put(doc)
    
put()

Cela garantit la cohérence. Cependant, vous devez être prudent dans les exemples suivants.

user = User(name='Yohei')

@ndb.transactional
def put():
    user.put()
    doc = search.Document(
        doc_id = person.key.urlsafe(),
        fields=[
            search.TextField(name='name', value=user.name),
        ],)
    index.put(doc)
    # do something
    ...
    
put()

Si une erreur se produit dans la partie faire quelque chose ici, il se peut qu'elle ne soit pas enregistrée dans le magasin de données, mais elle peut être enregistrée dans l'index.

3. Comment utiliser la file d'attente des tâches

** La file d'attente de tâches peut être traitée de manière transactionnelle. [^ 2-1] ** Par conséquent, si vous ajoutez la tâche «Enregistrer l'API de recherche dans l'index» dans la file d'attente des tâches, vous pouvez garantir la cohérence.

user = User(name='Yohei')
user2 = User(name='Yohei2')

@ndb.transactional(xg=True)
def put():
    user.put()
    user2.put()
    taskqueue.add(
        url='/put_to_index',
        params={
            'key': user.key.urlsafe(),
            'name': user.name},
        transactional=True,)
    taskqueue.add(
        url='/put_to_index',
        params={
            'key': user2.key.urlsafe(),
            'name': user2.name},
        transactional=True,)
    # do something
    ...
    
put()

Cela garantit la cohérence, même si faire quelque chose provoque une erreur. Comme dans l'exemple, il est possible de s'inscrire à deux index en même temps. Veuillez noter que vous ne pouvez empiler que jusqu'à 5 files d'attente de tâches transactionnelles. Il doit être évité dans les situations où il y a plusieurs écritures en même temps.

4. Conclusion

Utilisez 2 ou 3 méthodes. Utilisez correctement selon la situation.

Recommended Posts

Intégration de la banque de données Google App Engine et de l'API de recherche
Tweet (API 1.1) avec Google App Engine pour Python
(Débutant) Utilisation de base du magasin de données de Google App Engine
Développement Google AppEngine avec Docker
Prise en charge de Java 1 1 par Google App Engine
Utilisez ndb.tasklet avec Google App Engine
Jeton d'accès à l'API Google et jeton d'actualisation
Google App Engine webapp.RequestHandler ne peut pas obtenir de paramètres lors de la réception de put and delete
[Python] Exécutez Flask sur Google App Engine
[Google App Engine] Objets utilisateur (traduction en japonais)
Utiliser des modules externes avec Google App Engine
Je ne peux plus déployer avec le moteur d'application Google
Collection d'images à l'aide de l'API Google Custom Search
Afficher l'API Google Maps avec Rails et affichage des broches
Le SDK / Go Google App Engine (version Linux) et Python installés avec Linuxbrew sont incompatibles
Divers mémorandums lors de l'utilisation du sdk de l'API de messagerie LINE avec Python (2.7.9) + Google App Engine
Déployer l'application Django sur Google App Engine (Python3)
Procédure de construction de l'environnement de développement Google App Engine / Python (fin 2014)
Exploration avec Python et Twitter API 1 - Fonction de recherche simple
Enregistrement facile des livres avec l'API et Rails de Google Livres
Premiers pas avec Google App Engine pour Python et PHP
Comment utiliser Django avec Google App Engine / Python
Procédure de transcription vocale à l'aide de Python et de l'API Google Cloud Speech
Version d'exécution de l'environnement standard Google App Engine / Python