Suche geeignetes asynchrones Datenübertragungsprotokoll

X

xoom4

Hi

Ich suche ein geeignetes Datenübertragungsprotokoll oder Übertragungstechnik mit der ich grosse Rohdaten von einem Server zu einem Client asynchron übertragen kann. Zu beginn dachte ich mir an sowas wie ein FTP, wo die Rohdaten auf dem Server als Datei vorliegen. Doch weil der Server die Rohdaten nicht als Datei bereitstellt, sondern selbst von einem weiteren Server herunterläd, bräuchte ich eine alternative zur FTP Lösung.

Der Server fungiert also wie ein Proxy, wobei die Rohdaten von diesem Proxy über ein Datenlistener asynchron vom eigentlichen Ursprungsserver heruntergeladen werden. Die Rohdaten werden also in einzelne Stücke beim Proxy über eine Methode empfangen, dass sieht etwa so aus:

Code:
void incomePartialData(String dataPart) {

  // Hier würden die Daten an den Client weiter asynchron übertragen.

}

Der Client sollte auch in der lage sein, denn asynchronzen Datenfluss abzubrechen.
 
Eine asynchrone Verbindung zeichnet sich dadurch aus das der eigentlich passive Teil *meistens der Server* zu irgend einem Punkt willkürlich selbst und unabhängig eine Übertragung beginnt die der Client erkennen und verarbeiten kann. Dafür gibt es zwei möglichkeiten :

1) aktive Server-Software : es besteht eine aktiv/aktiv Verbindung zwischen Client und Server in der beide Seiten völlig unabhängig von ein andere arbeiten und darauf vorbereitet sind jeder Zeit eine Nachricht vom jeweils anderen zu erhalten

2) Polling : dabei wird eine aktiv/passiv Verbindung hergestellt und die Server-Software passiv oder nur semi-aktiv implementiert. Der Client fragt dann in regelmäßigen Abständen ob neue Daten vorhanden sind.

Da du ja eine Art Proxy hast muss man sich also nun überlegen wie der Datenfluss ohne diesen ablaufen würde und wie man in diesen den Proxy transparent einfügt. Dabei gibt es wieder verschiedene Möglichkeiten :

1) aktiv/aktiv/aktiv - hierbei sind alle 3 Teilnehmer aktiv implementiert , also das jeder für sich selbst arbeitet , jeder Zeit Nachrichten senden kann und gleichzeitig zu "fast" jedem Zeitpunkt der Verbindung bereit ist Daten vom jeweiligen Partner zu empfangen. Diese Vorgehensweise ermöglicht eine aktive Kontrolle über den Proxy und dessen Verbindung zum Ziel-Server da der Proxy dem Client aktiv Status-Meldungen machen kann für die der Client natürlich implementiert werden muss.

2) aktiv/aktiv/passiv - auch eine relativ häufig anzutreffende Variante : Client und Proxy sind aktiv implementiert um untereinander größtemögliche Kontrolle zu haben. Das Ziel ist jedoch passiv und wartet auf polling vom Proxy. Der Client muss aber trotzdem auf spontan eingehende Nachrichten vom aktiven Proxy reagieren können. Zusätzlich kann der Client das Polling des Proxies kontrollieren.

3) aktiv/passiv/aktiv - eine eher seltene Form und so bestimmt auch die schwierigste umzusetzende. Bei dieser Variante sind Client und Ziel-Server darauf ausgelegt das der jeweils andere spontan eine Nachricht schicken kann während sie selbst dabei sind eine zu versenden welche nicht im Zusammenhang zu dem steht was gerade empfangen wird. Das Problem ist der Proxy : dieser reagiert zwar auf Steuer-Commands vom Client , macht aber sonst selbst nichts alleine. Das heißt man muss vom Client regelmäßig pollen um den Proxy zu fragen ob neue Nachrichten vom eigentlichen Ziel-Server eingetroffen sind. Zusätzlich muss der Proxy so gestaltet werden das dieser eventuelle vom Ziel-Server kommende Nachrichten so lange im Speicher hält bis der Client diese mit dem nächsten Poll abholt.

4) aktiv/passiv/passiv - das wohl einfachste : in dieser Variante steht der Proxy absolut transparent in der Verbindung. Normalerweise wird er lediglich so konstruiert das er die Poll's vom Client dierekt an den Ziel-Server weiterleitet und im gegenzug die Antworten dierekt zurück zum Client *natürlich kann hier immer noch ein Filter eingebaut werden was dann aber schon wieder zu einem aktiv/semi-aktiv/passiv werden würde*.

Eine Variante in der der Client eine passive Rolle bekommt gibt es im praktischen Anwendungsfeld nicht da immer darauf gewartet wird was der User macht und dies in der Regel sofort verarbeitet wird. Natürlich gibt es auch einiges was einen passiven Client besitzt *ganz krasses Beispiel : ein BotNet*, aber es hat auf Grund der Seltenheit kaum eine bedeutung.

Jetzt musst du dir also überlegen nach welchem Schema deine Verbindung abläuft , wie das ganze ohne den Proxy aussehen würde und wie transparent du ihn integrieren willst.


Hoffe ich konnte dir damit erstmal in so weit helfen das du jetzt weist wo nach genau du suchst.
 
Vielen Dank für deine ausführliche Antwort. Also ich glaube es wird die aktive/passiv/passiv Technik sein. Ich erweitere mal die beschreibung wie das ganze bzw. bereits Teile davon implementiert sind. Das ganze handelt sich um den Empfang von Währungskursdaten, historische und im Anschluss die Realtime Daten.

Der Proxy ist eine Java/Scala (gemischte) integrierte Anwendung die auf einer Handelsplattform läuft. Der Proxy hat direkten zugriff auf den eigentlichen Server mittels API innerhalb der Handelsplattform und kann auf historische Daten leicht zugreifen. Das geschiet durch den Aufruf einer simplen Methode innerhalb der Handelsplattform, bspw. getHistoryData. Die historischen Daten werden dann heruntergeladen und geraten während des streaming wie oben beschrieben in einzelne Teile an eine Methode die ich im ersten Post incomePartialData genannt habe. Die API sowie Server sind bereits vom Hersteller gegeben und Proxy sowie Server haben stehts eine aktive Verbidung. Weil durch das Login in die Handelsplattform die Verbindung zum Server immer konstant offen bleibt (das managed die Handelsplattform zum Glück alles selbst :)).
Der Proxy muss aber noch geschrieben werden weil er eigentlich als Handelsstrategie auf der Handelsplattform läuft (Workaround sozusagen). Jedenfalls würde ich den Proxy und den Server zum passiven Teil zählen. Weil erst durch die Anfrage vom Proxy zum Server, der Proxy eine historische Datenanfrage zum Server mittels der Methode getHistoryData starten würde. Wenn die übertragung beendet ist, wartet der Server, bis der Proxy wieder eine historische Datenanfrage sendet. Sonst geschieht eigentlich nichts.

Der Client ist ausserhalb der Handelsplattform und startet die historische Datenanfrage zum Proxy nur dann, wenn der User es wünscht. Also ähnliches Verfahren wie zwischen Proxy und Server. Nur mit dem unterschied, dass zwischen Client und Proxy die Verbindung nicht offen sein muss, sondern bei jeder Anfrage der Client eine neu anmeldung/verbindung zum Proxy vornehmen kann. Doch zwischen Client und Proxy fehlt mir noch eine geeignete Technik für die asynchrone Datenübetragung mit der möglichkeit, dass das streaming zwischen Client und Proxy abgebrochen werden kann. Achja, der Client sollte auch in der lage sein, mehrfache Anfragen an den Proxy zu stellen und diese parallel zu verarbeiten.

Was die Realtime Daten angeht, dass wurde bereits implementiert mit dem FIX Protokoll. Das in Intervalen schön die realtime Kursdaten vom Proxy an den Client sendet (QuickFIX API). Leider ist das FIX Protokoll ausschliesslich für realtime Kursdaten gedacht und nicht für historische Daten weshalb dieses Protokoll mal weg fällt für mein jetziges Problem.

Hast du vieleicht ein Rat welches Protokoll oder API mir den asynchronen Empfang von historischen Daten zwischen Client und Proxy ermöglicht? Vieleicht irgendwas im Spring Framework, oder eine ähnliches Protokoll wie das FTP nur mit dem unterschied das statt Dateien einfach Streams übertragen werden? Ich kann mich noch erinnern das Bsp. das Qt Framework für C++ eine nette asynchrones FTP API hat. Ich hab auch was über Apache MINA gelesen, aber das ist glaub ich für die entwicklung neuer Netzwerk Protokolle. Doch soweit will ich nicht gehen und gleich das Rad neu erfinden ;)
 
Zurück