Frage

Ich arbeite an einer Web-Anwendung, die Aufgaben zu einem Master / Worker System trägt vor, die Aufgaben zu einem einer Reihe von Arbeitern Instanzen Betriebe aus. Die Arbeitswarteschlange Master wird als separater Prozess (auf einer separaten Maschine insgesamt) und Aufgaben werden über HTTP / REST-Anfragen an den Master übermittelt. Sobald Aufgaben der Arbeitswarteschlange gestellt werden, Client-Anwendungen können eine andere HTTP-Anfrage einreichen, um Statusinformationen über Aufgaben zu erhalten.

Für meine Web-Anwendung, würde ich es wie eine Art von Fortschrittsbalken Ansicht zu schaffen, die dem Benutzer einen Hinweis darauf, wie weit entlang Aufgabenverarbeitung gibt gekommen. Der offensichtliche Weg, dies zu realisieren wäre ein AJAX Fortschritt Meter-Widget, das in regelmäßigen Abständen fragt die Arbeitswarteschlange für den Status über die Aufgaben, die eingereicht wurden. Meine Frage ist, gibt es einen besseren Weg, dies ohne die häufige Abfrage zu erreichen?

Ich habe die Client-Web-Anwendung einen Server-Socket öffnen betrachtet, auf das sie für Mitteilungen der Arbeit Master hören können. Eine weitere ähnliche Gedanken hatte ich habe, ist für die Statusmeldungen XMPP oder ein ähnliches Protokoll zu verwenden. (Natürlich ist das Master / Arbeiter-System müßte aktualisiert werden, Benachrichtigungen oder so zur Verfügung zu stellen, aber ich besitze den Code für die damit alle notwendigen Updates selbst machen.)

Alle Gedanken über den besten Weg, um ein Benachrichtigungssystem, wie dies einzurichten? Ist der zusätzliche Aufwand lohnt sich, oder ist die einfache Abfrage Lösung der Weg zu gehen?

War es hilfreich?

Lösung

Ich denke, es hängt von einigen Faktoren ab

  • Wie genau das Feedback sein kann (1 Prozent, 5 Prozent, 50 Prozent)
    genaues Feedback macht es wert, eine Art von Fortschrittsbalken und Kometen Stil Push verfolgen. Wenn man nur sagen kann „Busy ... Moment ... es fast geschafft ... getan“, dann eine einfache Ajax „sind wir schon da“ Umfrage sicherlich einfacher Code ist.
  • Wie aktuell die Fertigmeldung vom Kunden gesehen werden
  • Wie lange jede Aufgabe übernimmt (1 Sekunde, 10 Sekunden, 10 Minuten)
    1 Sekunde macht es etwas strittig. 10 Sekunden ist es wert. 10 Minuten bedeutet, du bist besser dran den Benutzer darauf hindeutet, geht für eine Kaffeepause: -)
  • Wie viele gleichzeitige Anfragen dort wird
    Sofern Sie einen „speziellen“ Server haben, neigen dazu, Live-Push-Stil Systeme Verbindungen zu essen und Sie werden ziemlich schnell ausgereizt werden. Mit mehr webservers in eine Phantasie Fortschrittsbalken werfen könnte das Budget verletzt.

Ich habe einige Beispiel-Code auf bekam 871.184 , das zeigt eine Hand gerollt " immer umrahmen " das scheint gut zu erarbeiten. Das Projekt entwickelte ich das für nicht gehämmert, dass alle obwohl hart, die Operationen ein paar Sekunden dauern, und wir können ziemlich genau Prozent geben. Der Code verwendet asp.net und Jquery, aber die allgemeinen Techniken werden mit einem beliebigen Server und JavaScript-Framework arbeiten.

Bearbeiten Wie John weist darauf hin, Statusberichte wahrscheinlich nicht die Aufgabe des RESTful-Service ist. Aber es gibt nichts, das sagt man nicht einen Iframe auf dem Client öffnen können, die auf dem Server, Umfragen, den Dienst zu einer Seite Haken. Die Theorie sagt der Server und der Dienst wird zumindest einander näher sein: -)

Andere Tipps

Polling

Der Client hält Abfrage den Server den Status der Antwort zu erhalten.

Pros

  • wirklich RESTful zu sein, bedeutet zwischenspeicherbar und skalierbar.

Cons

  • Nicht das beste Ansprechverhalten, wenn Sie nicht wollen, Ihren Server zu viel abzufragen.

Persistent Verbindung

Der Server schließt nicht seine HTTP-Verbindung mit dem Client, bis die Reaktion abgeschlossen ist. Der Server kann Zwischenstand über diese Verbindung über HTTP Multiparts senden.

Comet ist der bekannteste Rahmen dieses Verhalten zu implementieren.

Pros

  • Best Ansprechbarkeit, fast in Echtzeit-Benachrichtigungen vom Server.

Cons

  • Verbindungsgrenze wird auf einem Web-Server beschränkt, um eine Verbindung zu lange offen Macht zu halten, bestenfalls den Server geladen werden, im schlimmsten Fall, den Server zu Denial-of-Service-Attacken öffnen.

Client als Server

Machen Sie den Server Post-Status-Updates und die Antwort an den Client, als ob es eine andere RESTful Anwendung waren.

Pros

  • Beste aus jeder Welt, werden keine Ressourcen für die Antwort warten vergeuden, entweder auf dem Server oder auf der Client-Seite.

Cons

  • Sie benötigen einen vollständigen HTTP-Server und Web-Applikations-Stack auf dem Client
  • Firewalls und Router mit ihrem Standard „keine eingehenden Verbindungen überhaupt“ in der Quere kommen.

Fühlen Sie sich frei zu bearbeiten Sie Ihre Gedanken oder eine neue Methode hinzuzufügen!

Meine Meinung ist, mit der Abfrage Lösung zu halten, aber Sie könnten in diesem Wikipedia-Artikel über HTTP interessiert sein Drücken Technologien.

REST hängt von HTTP, die ein Request / Response-Protokoll ist. Ich glaube nicht, dass Sie einen reinen HTTP-Server Aufruf mit Status bekommen sind den Client zurück.

Außerdem Status-Reporting ist nicht die Aufgabe des Dienstes. Es liegt an den Kunden zu entscheiden, wann oder ob es will Status berichtet.

Schauen Sie in Comet . Sie machen eine einzige Anforderung an den Server und die Server-Blöcke und hält die Verbindung offen, bis eine Aktualisierung des Status auftritt. Sobald dies die Antwort geschieht gesendet und engagiert. Der Browser empfängt diese Antwort, behandelt sie und sofort wieder Anfragen die gleiche URL. Der Effekt ist, dass die Ereignisse an den Browser gedrückt wird. Es gibt Vor-und Nachteile, und es könnte nicht für alle Anwendungsfälle geeignet sein, aber die meisten rechtzeitige Status-Updates zur Verfügung stellen würde.

Sie können auch Selbstauffrischung iframe verwenden, aber Ajax-Aufruf ist viel besser. Ich glaube nicht, gibt es eine andere Art und Weise.

PS: Wenn Sie eine Steckdose von Client öffnen würden, das würde nicht viel ändern - PHP-Browser die Seite als noch „Laden“ zeigen würde, was nicht sehr benutzerfreundlich. (Vorausgesetzt, Sie würden schieben oder Flush Puffer andere Dinge, bevor sie angezeigt haben)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top