2009-06-08 3 views
2

Was ist der beste Weg, Server Push für mehr als eine Sache zu implementieren.Wie Server Push für mehr Werte auf einmal implementieren?

Sagen wir, ich möchte nur den Benutzerstatus aktualisieren, so dass ich regelmäßig den Server für Status in 1000ms abfragen und die Seite aktualisieren kann. Der andere Weg, den ich finden kann ist, dass der Server wie 30 Sekunden wartet, während es prüft, ob es irgendwelche Änderungen gab und wenn man gefunden wird, Push-Antwort zurück zum Client, die Seite aktualisieren und dann eine weitere Abfrage machen.

Aber wie würde ich dies implementieren, um für 10 Dinge auf der Website zu überprüfen? Zum Beispiel, wenn ich Stackoverflow mag Frage Stimmen zu aktualisieren, wenn jemand Stimme, aber der einzige Weg, wie dies zu tun, die ich von

ist denken kann

fragen Server für Stimmen für jede Frage -> Server antwortet mit Stimmen jeder Frage auf der Seite

aber wie kann ich herausfinden, welche Frage Stimmen geändert haben? Ich könnte alle aktuellen Stimmen senden und dann Server die Werte vergleichen und nur mit denen, die sich geändert haben, antworten, aber ich denke, dass es sehr uneffektiv wäre, dies zu tun, während man nach 30 Werten sucht.

Ein Beispiel für alle wäre Facebook, wo fast alles durch Server Push aktualisiert wird, aber wie kann Server herausfinden, was sich geändert hat und was nicht?

Alles was ich gefunden habe (einschließlich meines Buches "Ajax Patterns") erklärt nur, wie man nach einem Wert fragt, aber ich habe nichts gefunden, wie man für viele Werte gleichzeitig abfragt (wie mehr als 10).

Antwort

2

Wenn Sie bereit sind, Sitzungen zu verwenden, besteht der einfachste Weg darin, eine ID für die serielle Anfrage zu erhalten und den Server über die neuesten Informationen zu informieren, die während der Sitzung an den Client gesendet wurden. Dann fragt der Client, ob es neuere Daten gibt als beim letzten Auffrischen.

z. B .: Sagen wir, der Client sendet eine AJAX-Anforderung # 5001, nachdem sich nichts geändert hat, der Server antwortet möglicherweise mit 'false'. Dann postet jemand eine Nachricht, oder es gibt eine Änderung irgendeiner Art, und so sendet der Server in der Anfrage # 5002 eine Liste von geänderten Elementen (was auch immer diese sind). Dann würde es in der Anfrage # 5003 erneut falsch antworten, weil sich seit der Anfrage # 5002 nichts geändert hat.

Eine JSON-Client/Server-Architektur wäre dafür perfekt. Es ermöglicht eine einfache Serialisierung von Objekthierarchien/-karten. Ich bevorzuge jQuery für den Client in Javascript, und die Serverseite ist trivial auszuspucken.

+0

aber wie weiß der Server, dass sich etwas geändert hat? Der einzige Weg, an den ich denken kann, ist, alle Änderungen zu protokollieren und dann all jene zu beantworten, die der Client nicht hat ... wie wenn der Client # 5000 hat, dann zwei andere Leute "Kommentar hinzufügen", also seine # 5002 und wann Der erste Client fragt nach Neuigkeiten, der Server muss alle Änderungen seit # 5000 erhalten, aber ist das nicht effektiv? –

+0

Ah ja, es gibt einen Unterschied zwischen einer globalen Versionsnummer und was ich vorschlagen soll. Eine globale Versionsnummer wird vom Server beibehalten und erhöht, wenn sich etwas (irgendetwas) ändert. Ich denke, das ist ein bisschen chaotisch, da Sie keine Datenmengen haben könnten. In der Sitzung des Benutzers auf dem Server, ID speichert den Zeitstempel der letzten Anfrage nach dem Server und seine ID-Nummer, wie vom Client zur Verfügung gestellt. Solange der Zeitstempel des letzten Updates irgendwo auf dem Server gespeichert ist (sagen wir mal den Zeitstempel der neuen Nachricht), können Sie leicht von einer eingehenden Anfrage aus sehen, was sich geändert hat. – gubby

0

Ich würde vorschlagen, Ihre Daten mit Revisionsnummern auf der Serverseite zu markieren, damit der Client weiß, welche Revision der Daten es hat; Erstellen Sie eine zusammengesetzte Abfrage, wobei der Client eine Reihe von Revisionen senden kann, und der Server kann auf diese Revisionsliste mit allen aktualisierten Revisionen antworten, die er für sie haben könnte. Auf diese Weise erstellt der Client nur eine Serverabfrage, um zu sehen, ob es Aktualisierungen gibt; Sie gruppieren nur alle Daten, an denen der Client interessiert ist, in eine Abfrage. Diese Methode hat auch die Stärke, dem Kunden zu erlauben, die Menge von Daten zu ändern, an der er interessiert ist; Wenn Ihre Implementierung serverseitig flexibel genug ist, können Sie dieselbe Implementierung für alle Ihre dynamischen Datenanforderungen verwenden.