2010-09-06 8 views
9

Angenommen, ich habe 2 Server.Die beste Methode zum Erstellen einer REST-API für lang andauernde Aufgaben?

Der erste ist ein Dienst, der einige Berechnungen bereitstellt, die lange Zeit (Minuten bis Stunden) dauern können.

Der zweite Server verwendet diesen Dienst, um Daten zu berechnen.

Ich versuche, eine REST-API für den ersten Server und so weit so gut zu entwerfen. Aber ich würde gern eine Meinung dazu hören, wie man Benachrichtigungen modelliert, wenn die langwierige Aufgabe beendet ist.

ich als 2 Ansätze bisher:

  1. Polling - der zweite Server wird immer mal fragen und dann über das Ergebnis.
  2. Rückruf - Zweiter Server wird ein URI einrichten, damit der erste nach dem Beenden anrufen kann. Aber das riecht ein bisschen in REST API.

Was denken Sie?

Antwort

4

Zusätzlich zu dem, was ich already answered in this similar question habe, würde ich vorschlagen, das Atom Publishing Protocol für die Benachrichtigung (Sie könnten auf Ihrem zweiten Server veröffentlichen).

+0

Wäre es von Natur aus falsch, den Callback-Ansatz zu verwenden? Ich habe ein sehr ähnliches Problem (außer meinem Dienst kann alles zwischen 2 und 500 Sekunden zu reagieren) und die Verwendung eines Rückrufs scheint viel einfacher als das Abfragen – Johan

+0

Eine kurze Erklärung und ein Link zu einer Erklärung des Atom Publishing Protocol würde diese Antwort erheblich verbessern . – Geerten

1

Wenn Sie Python verwenden, können Sie die Vorteile von RabbitMQ und Sellerie nutzen. Mit Sellery können Sie ein Element in einer Warteschlange erstellen und dann die Ausführung dessen anhalten, was Sie gerade ausführen (z. B. Django), sodass Sie die Ausgabe des Warteschlangenprozessors konsumieren können, sobald dieser verfügbar ist. Keine Abfrage oder Rückrufe erforderlich.

+0

Sofern Sie Sellerie nicht verstehen (d. H. Sie sind der Autor), würde ich einfach Rabbit MQ + Pika direkt verwenden und sparen Sie eine Ladung Schmerzen (verschwinden Ausnahmen, Verkettung einfach nicht funktioniert, seltsame Kompatibilitätsprobleme mit Gevent usw.). Sie könnten es funktionieren lassen, aber wenn Sie etwas aus der Ferne tun, versteckt komplexe Sellerie Sie vor einer Menge von echten Arbeitsimplementierungsdetails, die Sie benötigen könnten. – pip

7

Für Ihre Situation würde ich Polling wählen. Wenn der zweite Server die anfängliche Anforderung zum Erstellen des Jobs auf dem ersten Server ausführt, sollte eine Antwort mit der URL der endgültigen Statusseite angezeigt werden. Der zweite Server fragt diese URL dann alle 5-15 Minuten ab, um den Status des Jobs zu überprüfen. Wenn der erste Server diese URL als RSS- oder Atom-Feed verwendet, können Benutzer ihre RSS-Reader auch auf dieselbe URL verweisen und selbst herausfinden, ob der Job erledigt ist. Es ist ein echter Gewinn, wenn sowohl Menschen als auch Maschinen Informationen aus einer einzigen Quelle erhalten können.