[PYTHON] Integration von Google App Engine-Datenspeicher und Such-API

Integration von Google App Engine-Datenspeicher und Such-API

Es scheint, dass es einige Situationen gibt, in denen Sie Daten im Datenspeicher speichern und im Index der Such-API registrieren möchten. Wenn Sie jedoch bei Transaktionen nicht vorsichtig sind, ist es möglich, dass sie, obwohl sie im Datenspeicher gespeichert sind, nicht im Such-API-Index registriert sind (im Folgenden bedeutet Index den Such-API-Index). Ich werde am Ende.

Betrachten wir daher eine Methode zum (fast) gleichzeitigen Registrieren von Daten im Datenspeicher und im Index.

  1. Verwendung von _post_put_hook (Konsistenz kann nicht garantiert werden)
  2. Einfache Verwendung von @ ndb.transacational (Konsistenz garantiert)
  3. Verwendung der Task-Warteschlange (Konsistenz garantiert)
  4. Fazit

** 1 Methode wird nicht empfohlen **. Es gibt jedoch einige Beispiele für die Verwendung von Methode 1 (eines wurde als Antwort in Stack Overflow eingereicht, und Ferris 2.2 verwendet Methode 1), daher stelle ich es vorerst vor.

1. Verwendung von _post_put_hook

** Nicht empfohlen **, es sei denn, Sie haben einen bestimmten Grund.

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

Im Such-API-Index registrieren

        ...

post_put_hook wird aufgerufen, nachdem User gesetzt wurde. Wenn put fehlschlägt, wird im Teil future.get_result () ein Fehler gesendet, sodass er nicht im Index registriert wird. Es besteht jedoch die Möglichkeit, dass die Registrierung des Benutzers fehlschlägt, obwohl die Registrierung des Benutzers erfolgreich ist.

Mit anderen Worten, diese Methode garantiert nicht die Konsistenz von Datenspeicher und Index. Wenn die Konsistenz nicht garantiert werden muss, ist dies in Ordnung. Wenn nicht, sollte dies vermieden werden.

2. Wie man einfach @ ndb.transacational benutzt

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()

Dies garantiert Konsistenz. In den folgenden Beispielen müssen Sie jedoch vorsichtig sein.

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()

Wenn hier ein Fehler im Teil "etwas tun" auftritt, wird er möglicherweise nicht im Datenspeicher registriert, aber möglicherweise im Index.

3. Verwendung der Task-Warteschlange

** Task Queue kann transaktional verarbeitet werden. [^ 2-1] ** Wenn Sie daher die Aufgabe "Such-API zum Index registrieren" in der Aufgabenwarteschlange hinzufügen, können Sie die Konsistenz garantieren.

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()

Dies garantiert Konsistenz, auch wenn etwas einen Fehler verursacht. Wie im Beispiel ist es möglich, sich gleichzeitig in zwei Indizes zu registrieren. Bitte beachten Sie, dass Sie nur bis zu 5 Transaktions-Task-Warteschlangen stapeln können. Dies sollte in Situationen vermieden werden, in denen viele Schreibvorgänge gleichzeitig ausgeführt werden.

4. Fazit

Verwenden Sie 2 oder 3 Methoden. Je nach Situation richtig verwenden.

Recommended Posts

Integration von Google App Engine-Datenspeicher und Such-API
Tweet (API 1.1) mit Google App Engine für Python
(Anfänger) Grundlegende Verwendung des Datenspeichers von Google App Engine
Google AppEngine-Entwicklung mit Docker
Java 1 1-Unterstützung von Google App Engine
Verwenden Sie ndb.tasklet mit Google App Engine
Google API-Zugriffstoken und Aktualisierungstoken
Google App Engine webapp.RequestHandler kann beim Empfang von put und delete keine Parameter abrufen
[Python] Führen Sie Flask in Google App Engine aus
[Google App Engine] Benutzerobjekte (japanische Übersetzung)
Verwenden Sie externe Module mit Google App Engine
Ich kann nicht mehr mit der Google App Engine bereitstellen
Bildersammlung mit der benutzerdefinierten Such-API von Google
Zeigen Sie die Google Maps-API mit Rails und Pin-Anzeige an
Das mit Linuxbrew installierte Google App Engine SDK / Go (Linux-Version) und Python sind nicht kompatibel
Verschiedene Memoranden bei Verwendung von SDK der LINE Messaging API mit Python (2.7.9) + Google App Engine
Stellen Sie die Django-Anwendung in Google App Engine (Python3) bereit.
Konstruktionsverfahren für die Google App Engine / Python-Entwicklungsumgebung (Ende 2014)
Crawlen mit Python und Twitter API 1-Einfache Suchfunktion
Einfache Buchregistrierung mit Google Books API und Rails
Erste Schritte mit Google App Engine für Python und PHP
Verwendung von Django mit Google App Engine / Python
Sprachtranskriptionsverfahren mit Python und Google Cloud Speech API
Laufzeitversion der Google App Engine / Python-Standardumgebung