Implementierung von Newsfeed zu GAE - Soll ich Prospective Search verwenden?

8

Ich habe ein Problem, mit dem ich seit einiger Zeit zu kämpfen habe. Ich versuche, eine Nachrichtenfeed-Funktion in meiner App mit GAE-Cloud-Endpunkten und Java zu implementieren. Das gemeinsame Konzept besteht aus Anhängern und Nachfolgern, wo eine Handlung eines Nachfolgers von seinen Anhängern gesehen werden kann. Ein neuer Anhänger sollte auch seine vergangenen Taten sehen, nicht nur seit der Zeit, als er anfing zu folgen.

Ich habe ein paar Versuche mit den folgenden Komponenten gemacht. Jeder Versuch hat gut funktioniert, aber es fehlte etwas:

  1. Bei jeder Benutzeraktion habe ich eine 'log' -Entität in den Datenspeicher mit der Benutzer-ID eingefügt. Als ein Benutzer seinen News-Feed anzeigte, habe ich nur nach den Benutzer-IDs für alle diese Entitäten nach der Follower-Liste des Benutzers gefragt. Alles war in Ordnung, bis mir klar wurde, dass eine 'IN'-Abfrage nicht durchsucht werden kann. Also diese Option war weg.
  2. Bei diesem Versuch, der auch der aktuelle Status der Anwendung ist, verwende ich die Such-API. Bei jeder Benutzeraktion wird keine 'Log' -Einheit mehr in den Datenspeicher gespeichert, sondern ein Dokument in einen Suchindex. Komplexe Abfragen können hier durchsucht werden und die Welt lächelt wieder. Aber ... ich bin mir nicht sicher, ob dies eine kluge Entscheidung ist. Es scheint, dass die Kosten für das Suchen / Hinzufügen / Löschen von Dokumenten neben den dokumentierten täglichen Beschränkungen sind die ganze Sache ein bisschen zu skizzenhaft machen.
  3. Der nächste Versuch sollte die prospektive Such-API sein. Nach dem, was ich in den Dokumenten lese, scheint es die richtige Komponente für diesen Zweck zu sein. Leider ist die Dokumentation sehr schlecht und gibt nur sehr wenige Beispiele. Auch die Rechnungsinformationen sind unklar.

Also ich bitte um den Rat der Stackoverflow-Community. Können Sie mir bitte etwas zu diesem Thema sagen? Und wenn die prospektive Suche die richtige Option ist, können Sie bitte einen klaren Beispiel-Java-Code bereitstellen, der Cloud-Endpunkte verwendet?

BEARBEITEN: Nur um hier die wichtigsten Design-Anforderungen zu betonen - Die Newsfeed-Funktion muss die Möglichkeit haben, sortierte Follower-Aktionen mit einem Cursor abzurufen (um die Abfrage des gesamten Stapels zu vermeiden).

    
AsafK 13.12.2013, 01:39
quelle

2 Antworten

2

Verwenden Sie ein Pull-Aggregat-pro-Follower-Modell: Führen Sie in regelmäßigen Abständen (oder bei Bedarf) alle Folgemaßnahmen einzeln durch und speichern Sie sie anschließend in einer dedizierten Einheit pro Follower. Merken Sie sich den Zeitpunkt der letzten Abfrage, also das nächste Mal, wenn Sie ab diesem Zeitpunkt abfragen (vorausgesetzt, dass Aktionen nicht zu früheren Zeiten hinzugefügt / geändert werden können).

Dies gibt Ihnen die folgenden Funktionen (und Einschränkungen):

  1. Wenn die Abfrage auf Anforderung erfolgt, müssen Sie keine Benutzer abfragen, die inaktiv sind.
  2. Da die Abfrage "nur neu" ist (nur nach neuen Aktionen sucht), würde es nichts kosten, wenn sie null Ergebnisse liefert.
  3. Sie werden nur nacheinander die einzelnen Aktionen pro Follower abfragen. Danach werden alle letzten Aktionen in einer Entität zwischengespeichert und mit einem get in den Speicher geladen. Dies sollte eine erhebliche Kosten- und Zeitersparnis bedeuten.
  4. Sie können Aktionen im Speicher beliebig sortieren / filtern.

Einschränkungen:

  1. Entitäten haben ein Limit von 1 MB, daher gibt es eine maximale Anzahl von Aktionen, die Sie in einer Entität zwischenspeichern können. Sie müssen also entweder das Caching der letzten Aktionen pro Benutzer begrenzen oder das Aktions-Caching auf mehrere Entitäten verteilen.
  2. Sie müssen IN Query über Follower (max. 30) verwenden und parallele Threads verwenden, um eine angemessene Leistung zu erzielen. Dies könnte leicht 3-5 Sekunden bei der Abfrage von über 1000 bis 2000 Follower treffen. Außerdem können Sie problemlos RPC-Limit (dh max. Gleichzeitige API-Aufrufe) pro Instanz erreichen, wenn Sie mehrere Benutzer gleichzeitig bedienen.
Peter Knego 16.12.2013 16:38
quelle
0

Ich hoffe, ich verstehe die Frage richtig - Sie möchten einen News-Feed in Ihre Anwendung implementieren und es den Benutzern ermöglichen, einander zu folgen. Die neuen Follower müssen in der Lage sein, die Benutzeraktionen zu sehen. Ich bin mir sicher, dass es mehrere andere Möglichkeiten gibt, dieses Problem zu lösen, aber ich werde versuchen, Ihnen zu helfen, indem ich eine Lösung anbiete, die JAVA JDO für den Zugriff auf den Datenspeicher verwendet.

Ich würde zuerst die Entity-Beziehungen in JDO wie folgt entwerfen:

%Vor%

Hier sind einfache JDO-Klassen:

Benutzerklasse:

%Vor%

Aktionsklasse:

%Vor%

Die Action-Klasse verwendet eine Date-Eigenschaft. Weitere Informationen finden Sie in der Dokumentation für die entsprechenden Datentypen im Datenspeicher. Wenn eine Aktion erstellt wird, wird ein Date-Objekt zugewiesen und initialisiert, sodass es das Objekt darstellt Zeitpunkt, zu dem es zugewiesen wurde, gemessen auf die nächste Millisekunde .

In meinem obigen Beispiel habe ich die Entitäten mit ihren Schlüsseln verknüpft, stattdessen könnten Sie sie wie folgt mit ihren Klassen verknüpfen:

%Vor%

Die Beziehung in meinem Beispiel ist eine von einer nicht bekannten Eins-zu-Viele-Beziehung, vielleicht sollte sie Eins-zu-Viele sein. Weitere Informationen erhalten Sie hier , damit Sie einen Blick darauf werfen und vielleicht entscheiden können, welches für Sie am besten ist Lösung.

Sobald die Beziehungen definiert wurden, können Sie Ihre Endpunktklassen um die JDO-Modellklassen herum erstellen . Dies wird grundlegende API-Methoden erstellen. Möglicherweise möchten Sie die Methoden der Endpunktklasse Ihren Anforderungen anpassen, z. B. die Art ändern, in der eine Aktion erstellt wird. Ein grundlegendes Beispiel wäre, den Schlüssel wie folgt aus dem Titel der Aktion zu erstellen (ActionEnpoint.java):

%Vor%

Wenn Sie möchten, können Sie Ihrer UserEndpoint-Klasse eine Methode hinzufügen, um den Datenspeicher abzufragen und alle zu diesem Benutzer und jedem Datum gehörenden Aktionen mithilfe der Datenspeicherabfrageobjekte .

Sie müssen Ihrer UserEndpoint-Klasse eine Methode hinzufügen, mit der Sie diesem Benutzer eine Aktion hinzufügen können. Hier ein einfaches Beispiel:

%Vor%

Wenn alle oben genannten Punkte erfüllt sind, können Sie die Liste der Aktionen pro Benutzer abrufen, indem Sie die getUser-Methode in Ihrer UserEndpoint-Klasse aufrufen, die ein User-Objekt zurückgibt. Sie können dann [ReturnedUserObject] .getActions () aufrufen. Ein neuer Follower kann nun alle "Follower" -Aktionen sehen, indem er einfach die api-Methode aufruft, um das "Follower" -Objekt zu erhalten und seine / ihre Aktionen zu erhalten. Sie können dann die Aktionen einfach nach Datum sortieren oder wie Sie es sich auch vorstellen.

Ich hoffe, ich habe Ihre Frage richtig verstanden, ich war mir bezüglich der ersten Komponente, die Sie erwähnten, nicht sicher, aber es schien, als hätten Sie Ihre Beziehungen durcheinander gebracht. Ich hoffe, diese Lösung weist Sie zumindest in die richtige Richtung:).

Wenn Sie zusätzliche Hilfe oder Klärung benötigen, oder meine Antwort war völlig unpassend zu dem, was Sie gesucht haben, dann lassen Sie es mich wissen.

Mit freundlichen Grüßen, Miki

    
M1kstur 15.12.2013 11:35
quelle

Tags und Links