Beste Spring Batch-Skalierungsstrategie

8

Wir haben einfache Batch-Prozesse, die gut funktionieren. Vor kurzem haben wir neue Anforderungen, um neue Batch-Prozesse zu implementieren, um Berichte zu generieren. Wir haben verschiedene Datenquellen zu lesen, um diese Berichte vorzubereiten. Insbesondere haben wir möglicherweise eine Ansicht für jeden Bericht.

Nun wollen wir diesen Prozess so skalieren, dass er skaliert und so früh wie möglich fertiggestellt werden kann.

Ich bin vertraut mit Multithread-Schritt, aber nicht sicher über andere Strategie (Remote-Chunking und Partitionierungsschritt) und welche zu verwenden wann.

In unserem Fall ist die Verarbeitung + Schreiben in Datei mehr Ressourcenanreiz als Lesen.

In solchen Fällen ist der Ansatz am besten geeignet.

Oder wenn wir herausfinden, dass das Lesen von Daten aus db der gleiche Anreiz ist wie das Schreiben + Verarbeiten in Datei, dann ist die beste Option, diesen Prozess zu verbessern / zu skalieren.

    
user509755 17.03.2015, 19:04
quelle

1 Antwort

21

TLDR;

Basierend auf Ihrer Beschreibung denke ich, dass Sie Multi-Threaded Step mit Synchronized Reader ausprobieren könnten, da Sie erwähnen, dass die Verarbeitung und das Schreiben der teurere Teil Ihres Schrittes sind.

Da Ihr Leser jedoch eine Datenbank ist, würde es meiner Meinung nach sehr nützlich sein, einen partitionierten Schritt zu konfigurieren und zu arbeiten. Es braucht ein bisschen mehr Arbeit, um sich einzurichten, wird aber auf lange Sicht besser skalieren.

Schritt mit mehreren Threads

Verwenden Sie für:

  • Einen einzelnen Schritt beschleunigen
  • Wenn der Lastausgleich vom Leser (d. h. JMS oder AMQP)
  • gehandhabt werden kann
  • Bei Verwendung eines benutzerdefinierten Lesers, der die zu lesenden Daten manuell partitioniert

Nicht verwenden für:

  • Stateful item Leser

Bei Multi-Thread-Schritten wird die chunk-orientierte Verarbeitung verwendet bis zum Frühlingsbatch. Wenn Sie einen Schritt mit mehreren Threads bearbeiten, kann Spring Batch einen gesamten Chunk in seinem eigenen Thread ausführen. Beachten Sie, dass dies bedeutet, dass der gesamte Lese-Prozess-Schreib-Zyklus für Ihre Datenblöcke parallel erfolgt. Dies bedeutet, dass keine Garantie für die Verarbeitung Ihrer Daten besteht. Beachten Sie auch, dass dies nicht mit statusbehafteten ItemReaders funktioniert (JdbcCursorItemReader und JdbcPagingItemReader sind beide stateful).

Multi-Thread-Schritt mit synchronisiertem Reader

Verwenden Sie für:

  • Beschleunigung der Verarbeitung und des Schreibens für einen einzelnen Schritt
  • Wenn das Lesen statusbehaftet ist

Nicht verwenden für:

  • Schneller lesen

Es gibt einen Weg um die Beschränkung zu vermeiden, Multi-Thread-Schritte mit Stateful Item Readern zu verwenden. Sie können synchronize ihre read() -Methode verwenden. Dies führt im Wesentlichen dazu, dass die Lesevorgänge seriell erfolgen (immer noch keine Garantie für die Reihenfolge), aber die Verarbeitung und das Schreiben parallel ausgeführt werden können. Dies kann eine gute Option sein, wenn das Lesen nicht der Engpass ist, sondern das Verarbeiten oder Schreiben.

Partitionierung

Verwenden Sie für:

  • Einen einzelnen Schritt beschleunigen
  • Wenn das Lesen statusbehaftet ist
  • Wenn Eingabedaten partitioniert werden können

Nicht verwenden für:

  • Wenn Eingabedaten nicht partitioniert werden können

Die Partitionierung eines Schritts verhält sich etwas anders als ein Schritt mit mehreren Threads. Mit einem partitionierten Schritt haben Sie tatsächlich unterschiedliche StepExecutions . Jede StepExecution arbeitet auf einer eigenen Partition der Daten. Auf diese Weise hat der Leser keine Probleme beim Lesen der gleichen Daten, da jeder Leser nur eine bestimmte Scheibe der Daten betrachtet. Diese Methode ist extrem leistungsfähig, aber auch komplizierter als ein Multi-Thread-Schritt.

Remote-Chunking

Verwenden Sie für:

  • Beschleunigung der Verarbeitung und des Schreibens für einen einzelnen Schritt
  • Stateful Leser

Nicht verwenden für:

  • Schneller lesen

Remote-Chunking ist eine sehr fortgeschrittene Spring Batch-Nutzung. Es erfordert eine Form von dauerhafter Middleware zum Senden und Empfangen von Nachrichten (d. H. JMS oder AMQP). Beim Remote-Chunking ist das Lesen immer noch single-threaded. Wenn jedoch ein Chunk gelesen wird, wird er zur Verarbeitung an eine andere JVM gesendet. In der Praxis ist dies sehr ähnlich wie ein Multi-Thread-Schritt funktioniert, Remote Chunking kann jedoch mehr als einen Prozess im Gegensatz zu mehr als einem Thread verwenden. Dies bedeutet, dass Remote-Chunking es Ihnen ermöglicht, horizontal Ihre Anwendung zu skalieren, im Gegensatz zu vertikal zu skalieren. (TBH Ich denke, wenn Sie darüber nachdenken, Remote-Chunking zu implementieren, sollten Sie einen Blick auf etwas wie Hadoop werfen.)

Paralleler Schritt

Verwenden Sie für:

  • Beschleunigung der gesamten Jobausführung
  • Wenn es unabhängige Schritte gibt, die nicht aufeinander angewiesen sind

Nicht verwenden für:

  • Beschleunigung der Ausführung von Schritten
  • Abhängige Schritte

Parallele Schritte sind nützlich, wenn Sie einen oder mehrere Schritte haben, die unabhängig voneinander ausgeführt werden können. Spring Batch ermöglicht die parallele Ausführung von Schritten in separaten Threads.

    
FGreg 17.03.2015, 19:54
quelle