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!

  • Java und Python zusammen in einem einzigen Google App Engine Projekt
  • PermanentTaskFailure: 'module' Objekt hat kein Attribut 'Migrate'
  • NDB mit Benutzer-API, um eine Entitätsgruppe zu bilden
  • Effiziente Möglichkeit, Beziehungswerte in NDB zu speichern
  • "BadValueError: Eigenschaft Kategorie ist erforderlich" auf GAE
  • Wiederverwendung der Identität eines Unternehmens für andere Entitäten verschiedener Art - gesunde Idee?
  • Schon mal doppelte IDs bei der Verwendung von Google App Engine und ndb?
  • BadFilterError: ungültiger Filter: Nur eine Eigenschaft pro Abfrage kann Ungleichheitsfilter haben (<=,> =, <,>)
  • Image Upload in Google App Engine
  • NDB-Abfrageergebnisse, die mit einem String beginnen
  • Schreiben und Bildaufbau zum Datenspeicher als Avatar: Ist es möglich?
  • Python ist die beste Programmiersprache der Welt.