Leseverzögerung im App Engine-Datenspeicher nach put ()

Ich schreibe einen Code für eine Blog- / News-Website. Hauptseite hat 10 neueste Artikel und auch dort ist ein Archivabschnitt mit allen Artikeln sortiert nach Änderungszeit absteigend. Im Archivbereich verwende ich die Paginierung auf der Basis von Cursors und ich Cache-Ergebnisse ab der zweiten Seite, da die Seiten nur geändert werden, wenn der neue Artikel veröffentlicht wird oder existiert aus irgendeinem Grund. Jede Seite hat 10 Artikel. Wenn also ein Benutzer eine Archivseite mit einer gewissen Nummer trifft (nicht die erste), wird der Memcache zuerst auf diese Seitennummer überprüft. Wenn die Seite nicht vorhanden ist, wird memcache auf den Cursor für diese Seite geprüft und dann werden die Ergebnisse aus dem Datenspeicher mit diesem Cursor geholt:

class archivePage: def GET(self, page): if not page: articles = memcache.get('archivePage') if not articles: articles = fetchArticles() memcache.set('archivePage', articles) else: if int(page) == 0 or int(page) == 1: raise web.seeother('/archive') articles = memcache.get('archivePage'+page) if not articles: pageCursor = memcache.get('ArchivePageMapping'+page) if not pageCursor: pageMapping = ArchivePageMapping.query(ArchivePageMapping.page == int(page)).get() pageCursor = pageMapping.cursor memcache.set('ArchivePageMapping'+page, pageCursor) articles = fetchArticles(cursor=Cursor(urlsafe=pageCursor)) memcache.set('archivePage'+page, articles) 

Jedes Mal, wenn ein neuer Artikel erstellt wird oder der Status eines bestehenden Artikels geändert wird (Entwurf / veröffentlicht), aktualisiere ich den Cache für Archivseiten Ergebnisse und Cursor. Ich mache es nach dem Speichern eines Artikels in den Datenspeicher:

 class addArticlePage: def POST(self): formData = web.input() if formData.title and formData.content: article = Article(title=formData.title, content=formData.content, status=int(formData.status)) key = article.put() if int(formData.status) == 1: cacheArchivePages() raise web.seeother('/article/%s' % key.id()) def cacheArchivePages(): articles, cursor, moreArticles = fetchArticlesPage() memcache.set('archivePage', articles) pageNumber=2 while moreArticles: pageMapping = ArchivePageMapping.query(ArchivePageMapping.page == pageNumber).get() if pageMapping: pageMapping.cursor = cursor.urlsafe() else: pageMapping = ArchivePageMapping(page=pageNumber, cursor=cursor.urlsafe()) pageMapping.put() memcache.set('ArchivePageMapping'+str(pageNumber), cursor.urlsafe()) articles, cursor, moreArticles = fetchArticlesPage(cursor=cursor) memcache.set('archivePage'+str(pageNumber), articles) pageNumber+=1 

Und hier kommt das Problem. Manchmal (es gibt kein Gesetz, es passiert zufällig) nach dem Auffrischen des Cache bekomme ich die gleichen Ergebnisse und Cursor für Archivseiten wie vor dem Auffrischen. Zum Beispiel füge ich einen neuen Artikel hinzu. Es wird im Datenspeicher gespeichert und erscheint auf der Titelseite und auf der ersten Seite im Archiv (die erste Seite des Archivs wird nicht zwischengespeichert). Aber andere Archivseiten werden nicht aktualisiert. Ich habe meine Funktion cacheArchivePages () getestet und funktioniert wie erwartet. Könnte es so sein, dass zu wenig Zeit vergangen ist, nachdem ich () ein Update auf den Datenspeicher und bevor ich fetchArticlesPage () in cacheArchivePages () Funktion? Vielleicht ist die Schreib-Transaktion noch nicht abgeschlossen und so bekomme ich alte Ergebnisse? Ich habe versucht, time.sleep () zu benutzen und ein paar Sekunden zu warten, bevor ich CacheArchivePages () anrufe und in diesem Fall war ich nicht in der Lage, dieses Verhalten zu reproduzieren, aber es scheint mir, dass time.sleep () ist keine gute Idee. Jedenfalls muss ich die genaue Ursache für dieses Verhalten wissen und wie man damit umgeht.

One Solution collect form web for “Leseverzögerung im App Engine-Datenspeicher nach put ()”

Sie werden höchstwahrscheinlich von "eventuell konsistenten Abfragen" getroffen. Wenn Sie den HR-Datenspeicher verwenden, können Abfragen etwas alte Daten verwenden, und es dauert eine Weile, bis die Daten von put () für Abfragen sichtbar sind (es gibt keine solche Verzögerung für get () per Schlüssel oder ID). Die Verzögerung ist in der Regel in Sekunden gemessen, aber ich glaube nicht, dass wir eine Obergrenze garantieren – wenn Sie von einer unglücklichen Netzwerkpartition getroffen werden, könnte es Stunden sein, stelle ich mir vor.

Es gibt alle Arten von Teillösungen, von Betrug, wenn der Autor der letzten Schriften die Abfrageergebnisse auf die Verwendung von Ahnenabfragen (die ihren eigenen Anteil an Einschränkungen haben) ansehen. Sie können einfach Ihren Cache eine begrenzte Lebensdauer und aktualisieren Sie es auf lesen statt schreiben.

Viel Glück!

  • Daten werden auf localhost gespeichert, aber nicht auf gae datastore?
  • Was ist der beste Filter, um eine vollständige Name Datenspeicher-Eigenschaft mit nur den Vornamen abzufragen?
  • NDB: Abfrageergebnisse sortieren
  • GAE NDB Datastore neue Funktion: Zugriff auf Datastore-Entitäten von anderen GAE-App
  • Zugriff auf ID-Eigenschaft aus einer Datenspeicher-Entität nicht möglich
  • ORM für Google Cloud-Datenspeicher
  • Dynamisches Laden von Python-Anwendungscode aus der Datenbank unter Google App Engine
  • Wie würde ich eine eingebettete Entität mit wiederholten Eigenschaften mit dem Datenspeicher-Java-Client abrufen
  • Wie konvertiert man eine Zeitzeichenfolge in einem Google AppEngine db.TimeProperty?
  • Teilweise aktualisieren App Engine Entity
  • Wie man GAE-Datenspeicher abfragt, um eine Vorlage zu machen (Newbie-Ebene)
  • Python ist die beste Programmiersprache der Welt.