Ich würde sagen, dass es nicht gut mit dem REST-Architekturstil fliegt (hauptsächlich, weil REST es auf statusfreie Client-Server-Interaktionen einschränkt). Das Internet ist jedoch reich an Lösungen, die lange Abfragen durchführen, und es funktioniert mehr oder weniger, obwohl es nicht im Sinne des Internets ist.
Zunächst eine Anmerkung zur Architektur: Das Implementieren von Pub/Sub innerhalb von REST bedeutet lediglich, dass der Herausgeber Elemente zu einer Liste hinzufügt, die dann für die Abonnenten verfügbar gemacht wird. Abonnenten fragen die Liste ab. Es gibt Möglichkeiten, dies herzustellen, um einmal und nur einmal zu gewährleisten, während die Nachrichtenreihenfolge und (eine Form der) garantierten Zustellung beibehalten wird, wenn auch asynchron. Es skaliert wirklich gut und ist wirklich belastbar.
Mein erster Ratschlag wäre, es optional zu machen, so dass Clients, die nicht lange Abfragen durchführen können (oder nicht wollen), dies tun können. Ich würde sogar so weit gehen zu sagen, dass, wenn ein generischer Client (wie Google) der Standard wäre nicht lange Abfrage durchführen, und dass der Server die lange Polling in einem speziellen gemeinsamen Verständnis zwischen Ihrem Client und der Server. Dieses gemeinsame Verständnis könnte ein benutzerdefinierter Medientyp oder eine benutzerdefinierte Link-Beziehung oder sogar ein benutzerdefinierter HTTP-Header sein, von dem generische Clients nichts wissen würden. Clients, die Ihre lange Umfrage unterstützen, werden auf codiert. Entdecken Sie die Funktionen der langen Abfrage, und rufen Sie sie bei Bedarf auf, wenn die lange Abfrage fehlschlägt (z. B. ein Intermediär blockiert sie irgendwie).
Und anstatt dies über HTTP zu tun, würde ich empfehlen, einen Nicht-HTTP-Socket dafür zu verwenden, um nicht die Absichten von HTTP zu verletzen und effektiv HTTP als Transportprotokoll zu verwenden. Siehe Kometd.
Mein anderer Ratschlag wäre, die Frage zu stellen, wie "Echtzeit" Ihre Kunden sein müssen. Wenn eine Latenzzeit von wenigen Sekunden akzeptabel ist, können Sie aufgrund der Cache-Fähigkeit, dies mit regelmäßigen Abfragen zu beheben, selbst bei sehr vielen Clients sehr viel mit dem normalen Polling tun.
Danke für die detaillierte Antwort. Das einzige Problem, das ich damit habe, ist, dass pub/sub von Natur aus asynchron ist und jede Art von Abfragen den Punkt vermisst, an dem Ereignisse asynchron verschoben, nicht gezogen werden sollen. Die Antwort muss in Echtzeit erfolgen, da wir ein Popup-Fenster öffnen müssen, sobald eine Nebenstelle aufgehoben wird, um einen eingehenden Anruf anzunehmen. Bei einer ausgelasteten Installation können Ereignisse jede Sekunde oder sogar schneller sein. Ich vermute, dass der Server ein Token oder einen Zeitstempel zurückgibt, die in der nächsten Anfrage verwendet werden können, um sicherzustellen, dass keine Ereignisse verpasst werden. –
Ja. Denken Sie daran, dass Twitter die cursorbasierte Paginierung verwendet: http://apiwiki.twitter.com/Twitter-REST-API-Method:-friends%C2%A0ids - next_cursor und previous_cursor könnten als Links zu den nächsten/vorherigen Seiten betrachtet werden. Diese Seiten funktionieren auch dann, wenn sich die Liste darunter ändert.Indexbasierte Paginierung funktioniert nicht für Listen, die sich stark ändern. – mogsie