Spring Batch

Performance und Skalierbarkeit

Dennis Schulte / @denschu und Tobias Flohre / @tobiasflohre

Lokale Skalierung

  • Multi-threaded Step
  • Parallele Steps
  • Partitioning



Verteilte Skalierung

  • Partitioning
  • Remote Chunking

Multi-threaded Step

Lokale Skalierung

Woher kommen die Threads?

  • java.util.concurrent.Executor
  • z.B. ThreadPoolExecutor
  • Application-Server verwalten eigene Pools


<step id="loading">
  <tasklet task-executor="taskExecutor" throttle-limit="5">
  ...
  </tasklet>
</step>
					

Multi-threaded Step



<job id="multiThreadedJob">
	<step id="step">
		<tasklet task-executor="taskExecutor">
			<chunk reader="itemReader" writer="itemWriter"/>
		</tasklet>
	</step>
</job>

<task:executor id="taskExecutor" pool-size="5">

					

Multi-threaded Step

Stateful vs. Restartable

  • Stateful + Restartable = Häufigster Fall in Spring Batch
  • ItemStream kann theoretisch Threadsafe sein!
  • Pattern: Synchronized ItemReader/ItemStream
  • Reader darf nicht Bottleneck sein
  • Besser: Partitioning verwenden

Multi-threaded Step

+ Hoch skalierbar

+ Einfach zu konfigurieren

- Alle Komponenten müssen thread-safe sein

Parallel Steps

Parallel Steps



<job id="importJob"> 
	<split id="splitStep" task-executor="taskExecutor">
		<flow> 
			<step id="partnerStep">
					<tasklet ref="partnerTasklet"/> 
			</step>
		</flow>
		<flow>
			<step id="vertragStep">
					<tasklet ref="vertragTasklet"/>
			</step>
		</flow>
	</split>
</job>
					

Partitioning

Partitioning

Partitioning

Partitioning



<job id="partitionedFlatFileJob">
		<step id="step">
			<partition step="step1" partitioner="partitioner">
					<handler task-executor="taskExecutor" />
			</partition>		
		</step>
	</job>
	
	<bean id="partitioner" class="org.springframework...MultiResourcePartitioner">
	   	<property name="resources" value="file:inputFile*.txt" />
	</bean>

					

Versch. Implementierungen

Local (TaskExecutor)

Spring Remoting

JMS

Spring Integration

Partitioning

+ Hoch skalierbar

+ Keine transaktionale Middleware

+ Kein Bottleneck beim ItemReader

+ Datenlokalität

- Struktur der Input Daten muss bekannt sein

Remote Chunking

Remote Chunking

Remote Chunking

+ Struktur der Input Daten muss bekannt sein

- Ggf. Bottleneck beim ItemReader

- Transaktionale Middleware erforderlich

- Alle Items werden serialisiert