Globale Queue

  • Themenstarter Themenstarter SV10
  • Beginndatum Beginndatum
S

SV10

Hallo zusammen,

Ich benötigte ein paar Denkanstöße zu folgender Planung: Ich hätte gern eine globale Queue bei denen diverse Rechner Aufgaben hinzufügen können, diese werden von diversen Servern, die regelmässige die Queue auf Inhalt abfragen, bearbeitet. Die Codebasis ist für alle die Gleiche (also es muss kein Code nachgeladen werden (RMI daher unnötigt?)) Dies alles findet nicht über das Internet sondern in einem abgeschirmten Netzwerk statt.

Würde mich über ein paar Vorschläge freuen wie ich es lösen könnte, besonders Buzzwords zum Nachgoogeln wären klasse!

Vielen Dank dafür im Voraus!

P.S.: Wer sich hier nun an Cloud- Konzepte von Windows Azure mit ihren Worker erinnert fühlt, ja danach ist die Idee angelehnt ;-)
 
Was ich fast vergessen hätte, ein Callback sollte möglich sein damit der User auch informiert wird wann seine Aufgabe abgearbeitet wurde.
 
Wenn ich dich richtig verstanden habe, willst du Aufgaben in einen Netz an Computer verteilen.
Ich würde es so in etwa lösen:

Ein Server, der die Aufgaben verwaltet, und die arbeitenden Clients. Die Clients melden sich beim Start über Socket beim Server an, und bekommen eine zufällige ID zugewiesen. Jeder angemeldete Client bekommt am Server auch noch ne ArrayList, in das du die Befehle speicherst. Die Befehle könnten z. B. in einem String in einen Objekt stehen, in eine List darin kommen eventuelle Parameter.
Die Clienten fragen dann einfach den Server nach neuen Befehlen, der Server sendet nacheinander alles aus der List serialisiert an den Client, und entfernt es anschließend daraus. (bzw. es wird bereits vorher die Liste durch eine neue ersetzt, und danach über die Referenz der alten Liste ausgelesen. Damit muss nicht immer entfernt werden, was warscheinlich bei vielen Befehlen recht langsam werden kann, da ja alles nachrückt.

Auf den Clients wird dabei einfach gespeichert, wann eine Aufgabe begonnen/-endet wurde, nach dem der Server weiß, welcher Client die Aufgabe abgearbeitet hat, kann dieser danach gefragt werden.


Ich habe vor, demnächst so ähnlich ein Cluster zu realisieren, wobei ich mir selbst nicht sicher bin, dass es einer der besten Wege ist.
 
Zuletzt bearbeitet:
Schau dir mal JMS an und mögliche Implementierungen, wie OpenMQ(benutzen wir), HornetQ(hört sich vielversprechend an), etc.. Von ActiveMQ würde ich nach meiner Erfahrung eher abraten, nach dem 3. Patch der lib und sonst instabiles Verhalten hatten wir keine Lust mehr.

Wichtig ist beim Benutzen sich auf den JMS Standard zurück zu ziehen und nicht spezielle Implementierungsabhängige Dinge zu benutzen.
 
Zuletzt bearbeitet:
Danke für die Antworten - natürlich hab ich parallel weiter gesucht und kam dann auch auf die JMS Schiene, die genau meine Anforderungen (soweit ich es bisher verstanden habe) abdeckt. Nun geht es mal an das Testen der möglichen JMS-Provider, ich lass hierbei deine Erfahrungswerte mit einfließen (ich persönlich hätte ja nach der Auflistung von http://de.wikipedia.org/wiki/Java_Message_Service#JMS-Provider in Richtung Apache, aufgrund der guten Erfahrung auf anderen Gebieten, tendiert). Nun versuche ich es mal mit deinen beiden Tipps, je nachdem wer die ersten Schritte besser dokumentiert hat.

Ich halt euch dann mal auf dem Laufenden wie es so klappt. Falls jemand noch andere Erfahrungswerte auf dem Gebiet hat, bitte hier posten, wäre klasse!
 
Hallo,

die möglichen Aufgaben / Tasks die abgearbeitet werden sollen sind allen bekannt?
Werden nur noch Task-Ids mit Parameterisierung herumgeschickt, oder soll auch
komplett neuer Code transferierbar und ausführbar sein?

Welche Art von Clients hast du denn? Web-Client / Rich/Fat-Client?

Gruß Tom
 
Hallo Tom,

ich werde die Fragen mal inline beantworten:

>> die möglichen Aufgaben / Tasks die abgearbeitet werden sollen sind allen bekannt?

Ja, es soll nur eine begrenzte Anzahl von Tasks möglich sein (Größenordnung 3-8). Die Abarbeitung soll dann jedem Worker bekannt sein

>> Werden nur noch Task-Ids mit Parameterisierung herumgeschickt, oder soll auch komplett neuer Code transferierbar und ausführbar sein?

Nein, es sollen nur reine Task-Ids mit den Parametern in die Queue hinzugefügt werden, anhand dieser sollen die Worker über ihre Aufgaben im klaren sein.

>> Welche Art von Clients hast du denn? Web-Client / Rich/Fat-Client?

Voraussichtlich Rich-Clients.


Um noch ein bisschen auszuholen erzähle ich mal noch ein paar Details zu meiner Überlegung, also eine Hauptaufgabe der Anwendung ist es eine Datei, welche aus einem SVN ähnlichem System kommt, lokal auf die Platte zu ziehen, per API einer anderen Anwendung diese einzulesen und in ein neues Format zu konvertieren. Jedoch dauert dieser Prozess sehr lange (besonders ist auch die Anzahl dieser Dateien sehr groß) und es ist sehr prozessorlastig.

So wäre es generell möglich auch alles auf dem Client ablaufen zu lassen, jedoch ist dieser sehr lang dann unter Volllast. Und aus den Verteilten Systemen & Cloud Comp. Vorlesung kam ich dann auf die Idee dass dies sich schön parallelisieren kann (d.h. Pfad zur Datei übergeben -> Datei auf Platte ziehen -> einlesen -> anderes Format exportieren -> zurückschreiben -> rückmelden dass dies beendet ist), besonders ist es mir auch ziemlich egal in welcher Reihenfolge vorgegangen wird. Also eigentlich ein super Use-Case für VR und einer "globalen" Queue.
 
Hallo zusammen,

wie versprochen etwas Rückmeldung:

Leider hat sich Map / Reduce & Hadoop disqualifiziert, da für den prod. Einsatz rein Linux empfohlen wird (siehe http://hadoop.apache.org/common/docs/current/quickstart.html#Supported+Platforms ). Zwar hätte ich hier ausreichend Linux Server zur Verfügung aber leider ist die API der verwendenten Anwendungen rein auf die Windows Welt ausgelegt und lässt sich nicht portieren (bzw. nicht ohne weiteres, und da wir sehr viel mit dem Support zusammenarbeiten werden die Jungs mir sicher nicht mehr helfen wenn ich ihnen erzähle dass es unter Linux läuft). Aber generell halte ich das Thema auf dem Focus, da schon die ersten Schritte ( http://hadoop.apache.org/common/docs/current/mapred_tutorial.html#Overview ) sich vielversprechend anhören (und allein mal eine rechnerlastige Anwendung über 200 Server verteilt rennen zu lassen wäre ein Riesending für das Ego).

Besser passt HornetQ, die Message Oriented Middleware lässt sich einfach installieren und die ersten Schritte sind sehr simple (zu empfehlen: http://java.dzone.com/articles/hornetq-getting-started ). Nun hab ich mir erstmal die JMS API Dokumentation geladen um mich daran zu halten und im Notfall noch von HornetQ wegswitchen zu können. Na mal schauen was die Tage noch so bringen bei meinen ersten Schritten im Thema MOM.


Gruß Sascha
 
Zurück