2015-06-11 10 views
5

Ich kann den Unterschied zwischen Multi-Threading und Partitionierung in Spring Batch nicht verstehen. Die Implementierung ist natürlich anders: Bei der Partitionierung müssen Sie die Partitionen vorbereiten und dann verarbeiten. Ich möchte wissen, was der Unterschied ist und welcher effizienter ist, wenn der Flaschenhals der Artikelprozessor ist.Spring batch diffrence zwischen Multithreading vs Partitionierung

Antwort

8

TL; DR;
Kein Ansatz soll helfen, wenn sich der Engpass im Prozessor befindet. Sie werden einige Vorteile sehen, wenn mehrere Elemente gleichzeitig durch einen Prozessor laufen. Beide Optionen zeigen jedoch ihre Vorteile, wenn sie in Prozessen verwendet werden, die E/A-gebunden sind. Die /AsyncItemWriter kann eine bessere Option sein.

Überblick über Spring Batch Skalierbarkeit
Es gibt fünf Optionen für das Skalieren Spring Batch Jobs:

  1. Multithreaded Schritt
  2. Parallel Schritte
  3. Partitionierung
  4. Fern
  5. AsyncItemProcessor Chunking/AsyncItemWriter

Jeder hat seine Vor- und Nachteile. Lassen Sie uns durch jeden zu Fuß:

Multithreaded Schritt
A multithreaded Schritt nimmt einen einzigen Schritt und führt jeden Chunk innerhalb dieser Schritt in einem separaten Thread. Dies bedeutet, dass dieselben Instanzen jeder Stapelkomponente (Leser, Schreiber usw.) über die Threads hinweg gemeinsam genutzt werden. Dies kann die Leistung erhöhen, indem in den meisten Fällen eine gewisse Parallelität zum Schritt auf Kosten der Neustartfähigkeit hinzugefügt wird. Sie opfern die Neustartfähigkeit, da in den meisten Fällen die Fähigkeit zum Neustart auf dem Status basiert, der im Reader/Writer/etc verwaltet wird. Wenn mehrere Threads diesen Zustand aktualisieren, wird er für den Neustart ungültig und nutzlos. Aus diesem Grund müssen Sie den Speicherstatus für einzelne Komponenten normalerweise deaktivieren und das neu startbare Flag im Auftrag auf false setzen.

parallele Schritte
parallele Schritte werden über eine Split erreicht. Sie können mehrere unabhängige Schritte parallel über Threads ausführen. Dies beeinträchtigt nicht die Neustartfähigkeit, trägt jedoch nicht dazu bei, die Leistung eines einzelnen Schritts oder einer Geschäftslogik zu verbessern.

Partitioning
Partitioning ist das Teilen von Daten, im Voraus, in kleinere Stücke (die als Partitionen bezeichnet) durch eine Master-Stufe und dann mit Slaves arbeiten unabhängig an den Trennwänden. In Spring Batch ist sowohl der Master als auch jeder Slave ein unabhängiger Schritt, sodass Sie die Vorteile der Parallelität in einem einzigen Schritt nutzen können, ohne dass die Neustartfähigkeit beeinträchtigt wird. Die Partitionierung bietet auch die Möglichkeit, über eine einzelne JVM hinaus zu skalieren, da die Slaves nicht lokal sein müssen (Sie können verschiedene Kommunikationsmechanismen verwenden, um mit entfernten Slaves zu kommunizieren).

Ein wichtiger Hinweis zur Partitionierung ist, dass die einzige Kommunikation zwischen dem Master und dem Slave eine Beschreibung der Daten und nicht die Daten selbst ist.Zum Beispiel kann der Master Slave1 anweisen, die Datensätze 1-100 zu verarbeiten, Slave2, um die Datensätze 101-200 usw. zu verarbeiten. Der Master sendet nicht die tatsächlichen Daten, sondern nur die Informationen, die der Slave benötigt, um die Daten zu erhalten, die er verarbeiten soll . Aus diesem Grund müssen die Daten für die Slave-Prozesse lokal sein und der Master kann sich überall befinden.

Remote-
Fernbedienung Chunking Chunking können Sie den Prozess und optional die Schreiblogik über JVMs maßstäblich. In diesem Anwendungsfall liest der Master die Daten und sendet sie dann über die Leitung an die Slaves, wo sie verarbeitet werden, und wird dann entweder lokal an den Slave geschrieben oder an den Master zurückgegeben, um lokal an den Master zu schreiben.

Der wichtige Unterschied zwischen Partitionierung und Fern Chunking ist, dass anstelle einer Beschreibung über den Draht gehen, Fern Chunking die eigentlichen Daten über den Draht sendet. Statt eines einzelnen Pakets, das Prozessdatensätze 1-100 sagt, sendet Remote Chunking die tatsächlichen Datensätze 1-100. Dies kann große Auswirkungen auf das E/A-Profil eines Schritts haben, aber wenn der Prozessor einen Engpass hat, kann dies nützlich sein.

AsyncItemProcessor/AsyncItemWriter
Die letzte Option für Spring Batch Prozesse Skalierung ist die AsyncItemProcessor/AsycnItemWriter Kombination. In diesem Fall umschließt die Ihre ItemProcessor-Implementierung und führt den Aufruf Ihrer Implementierung in einem separaten Thread aus. Die gibt dann eine Future zurück, die an die AsyncItemWriter übergeben wird, wo es ausgepackt und an die Delegat ItemWriter Implementierung übergeben wird.

Aufgrund der Art, wie Daten fließen durch diese Option, bestimmte Zuhörer Szenarien nicht unterstützt werden (da wir das Ergebnis des ItemProcessor Anrufs nicht wissen, bis in den ItemWriter), aber insgesamt kann es ein nützliches Werkzeug zur Verfügung stellt für parallelisieren nur die ItemProcessor Logik in einer einzigen JVM, ohne die Neustartfähigkeit zu opfern.

+0

Danke für Sie beantworten, das war sehr aufschlussreich. Leider gibt es im Projekt, in dem ich arbeite, nur eingeschränkte Auswahlmöglichkeiten. Wir verwenden immer noch Spring-Batch 2, das nicht über AsyncItemProcessor/AsyncItemWriter verfügt. – mettok

+0

Für Spring Batch 2 war es in Spring Batch Admin vorhanden. –

+0

Ich habe eine Frage zur Partitionierung. Wenn sich Master und Slaves in unterschiedlichen JVM befinden. Welche Art von Kommunikationsmethoden können wir neben dem Messaging nutzen? (Wir haben keine Infrastruktur für Messaging) – mettok

Verwandte Themen