2016-06-24 18 views
2

Ich habe einen Stapeljob, von dem erwartet wird, dass er etwa 1k-Tasks gleichzeitig verarbeitet. Und jede Aufgabe dauert durchschnittlich etwa 12 - 16 Minuten.Entwurfsansätze für die Stapelverarbeitung paralleler Tasks

In der aktuellen Implementierung werden alle Aufgaben in eine blockierende Warteschlange geschoben. Es gibt einen Thread, der eine Aufgabe aus dieser Warteschlange aufruft und verarbeitet. Für die Aufgabe verwenden wir den Java-Executor-Dienst für die gleichzeitige Ausführung und sobald alle seine Unteraufgaben verarbeitet sind, markieren wir diese Aufgabe als abgeschlossen und lesen eine andere Aufgabe aus der Warteschlange. Wir können die Verarbeitungszeit der Aufgabe nicht optimieren, da sie die native Bibliothek aufruft und nicht weiß, was sie intern tut.

Mit der aktuellen Implementierung sind wir in der Lage, rund 300 Aufgaben in mehr als 24 Stunden zu bearbeiten.

Ich bin auf der Suche nach einer geeigneten Plattform oder einem Framework, das helfen könnte, die Verarbeitungszeit zu reduzieren.

Ich bin mit Java 1.7, OSGi und Apache Karaf als Container

PS: Die Aufgabe hier ist Abbau bestimmter Bilder von 500 MB bis hin - 4 GB in kleine Stücke und in JPEG-Format

Speicherung
+0

Haben Sie an einem Punkt 100% CPU-Last oder HDD-Last? – Jeroen

+0

ja beide CPU und Netzwerk (da wir aus dem Netzwerk verarbeiten) zeigen 100% Auslastung – Sandeep

+0

über die vollen 24 Stunden? Wenn ja, würde ich annehmen, dass die native lib einfach so lange dauert. –

Antwort

2

Für horizontale Skalierung würde ich ein Messaging-System verwenden. Stellen Sie einfach alle Aufgaben in eine JMS-Warteschlange. Starten Sie dann Karaf auf einem Cluster von Maschinen und lassen Sie jeden in der Warteschlange zuhören. JMS wird dann automatisch die Prozesse round robin einspeisen. Also wird die Last verteilt.