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.
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.
Verwenden Sie für:
Nicht verwenden für:
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).
Verwenden Sie für:
Nicht verwenden für:
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.
Verwenden Sie für:
Nicht verwenden für:
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.
Verwenden Sie für:
Nicht verwenden für:
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.)
Verwenden Sie für:
Nicht verwenden für:
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.
Tags und Links spring parallel-processing spring-batch scalability