SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Tobias Flohre / Dennis Schulte | codecentric AG

Spring Batch – Performance und
Skalierbarkeit
Dennis Schulte
Düsseldorf
@denschu
www.github.com/denschu
blog.codecentric.de/author/dsc

dennis.schulte@codecentric.de
www.codecentric.de

codecentric AG
Tobias Flohre
Düsseldorf
@TobiasFlohre
www.github.com/tobiasflohre
blog.codecentric.de/en/author/tobias.flohre

tobias.flohre@codecentric.de
www.codecentric.de

codecentric AG
AGENDA
Grundlagen Spring Batch
Vier Aussagen zu Performance im Batch
Skalierungsstrategien

codecentric AG
AGENDA
Grundlagen Spring Batch
Vier Aussagen zu Performance im Batch
Skalierungsstrategien

codecentric AG
WAS IST EIN BATCH?

Traditionelles Batch-Pattern

Read

codecentric AG

Process

Write
SPRING BATCH

Restart

Automatisches
Transaktionsmanagement
Persistente
Job-Metadaten

Skip
Retry

codecentric AG

Skalierungsfeatures
DOMAIN / KONFIGURATION / ABLAUF

Job
Step

ItemWriter

ItemReader
ItemProcessor

codecentric AG

Item

Chunk
DOMAIN / KONFIGURATION / ABLAUF
Job wird als Spring-Konfiguration erstellt
Domain Specific Language manifestiert sich in XML-Namespace
Zentrale Elemente
job

step
tasklet
chunk
reader
processor
writer
commit-interval

codecentric AG

<job id="myJob" >
<step id="myStep" >
<tasklet>
<chunk reader="myReader"
processor="myProcessor" writer="myWriter"
commit-interval="1" />
</tasklet>
</step>
</job>

10.11.2013

9
DOMAIN / KONFIGURATION / ABLAUF
Reader, Processor und Writer implementieren bestimmte Interfaces
ItemReader<T>
T read()
ItemProcessor<I,O>
O process(I item)
ItemWriter<T>
void write(List<? extends T> items)

Spring Batch bietet für sehr viele Use Cases Implementierungen an
Lesen/Schreiben aus/in eine Datenbank

Lesen/Schreiben aus/in ein Flat-File
Lesen/Schreiben aus/in ein XML-File
Lesen/Schreiben aus/in eine JMS-Queue
Lesen/Schreiben mit JPA
und viele mehr

codecentric AG

10.11.2013

10
DOMAIN / KONFIGURATION / ABLAUF
item == null ||
completionPolicy

fulfilled
Begin Step

list of items

true

1

list of items

For each item

false

Open
transaction

ItemReader
Item read()

ItemProcessor
process(Item)

ItemWriter
write(List<Item>)

Commit
transaction
false

2
true

item == null

Finish Step

codecentric AG

10.11.2013

11
DOMAIN / KONFIGURATION / ABLAUF

Inkasso
Kraftfahrt
Inkasso
Kraftfahrt am
22.03.13

Inkasso
Kraftfahrt am
22.03.13 erster
Versuch
codecentric AG

Job

*

Step

*
JobInstance
JobParameters

*
JobExecution

*

StepExecution
DOMAIN / KONFIGURATION / ABLAUF
Infrastrukturkomponenten

PlatformTransaction
Manager

JobLauncher

JobRepository

codecentric AG

10.11.2013

13
AGENDA
Grundlagen Spring Batch
Vier Aussagen zu Performance im Batch
Skalierungsstrategien

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 1

Kenne EVA
Eingabe Verarbeitung Ausgabe

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 1
<job id=“step-job">
<step id=“xml-einlesen“>...</step>
<step id=“xml-verarbeiten“>...</step>
<step id=“xml-schreiben“>...</step>
</job>

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 1

<job id=“eva-job">
<step id=“xml-step">
<tasklet>
<chunk reader=“xml-einlesen“
processor=“xml-verarbeiten"
writer=“xml-schreiben“ />
</tasklet>
</step>
</job>
codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 1
ExecutionContext ist kein Datenspeicher für Nutzdaten, sondern:
Zählerstände
Steuerdaten
Problem: HeapSize

Processor und Writer sollten stateless sein
Parallelisierung

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 2

Kenne Deine nicht-funktionalen
Anforderungen

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 2
Mengengerüste
Zu erreichender Durchsatz
Was läuft parallel?
Minimiere den Aufwand!

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 3

Kenne Deine Persistenzschicht

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 3
Datenlokalität
Art des DB-Zugriffs
JDBC
ORM

Transaktionsgröße (commit-interval)

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 4

Zahlen sind besser als
Vermutungen

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 4
Messen, Messen, Messen!
Wiederholbarkeit
Immer nur einen Parameter ändern
Immer im Blick: CPU, Speicher, Datenquellen
Ergebnisse protokollieren

Testdaten
Stetiger Verbesserungsprozess
Randsysteme abdecken

Tools verwenden
Profiling lokal
Application Performance Management tools

codecentric AG
AGENDA
Grundlagen Spring Batch
Vier Aussagen zu Performance im Batch
Skalierungsstrategien

codecentric AG
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunking

codecentric AG
SKALIERUNGSSTRATEGIEN
Woher kommen die Threads?
java.util.concurrent.Executor
ThreadPoolExecutor

<task:executor id="taskExecutor" pool-size="5"/>
ApplicationServer verwalten eigene Threadpools

codecentric AG
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunking

codecentric AG
MULTI-THREADED STEP
<job id="multithreadedStepJob">
<step id="step">
<tasklet task-executor="taskExecutor" throttle-limit="4">

<chunk reader="reader" processor="processor" writer="writer"
commit-interval="3" />
</tasklet>
</step>

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

codecentric AG
MULTI-THREADED STEP
Threadsafe

Begin Step

Open
transaction

1

ItemReader
Item read()

For each item

ItemProcessor
process(Item)

ItemWriter
write(List<Item>)

Commit
transaction

2

File vs. DB vs. JMS
Finish Step

codecentric AG

10.11.2013

30
MULTI-THREADED STEP
+ Hoch skalierbar
+ Einfach zu konfigurieren

- Alle Komponenten müssen thread-safe sein

codecentric AG
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunking

codecentric AG
ASYNCITEMPROCESSOR -> ASYNCITEMWRITER
Thread 1
process(item)

Thread 2
ItemReader

Async
ItemProcessor

process(item)

Thread 3
process(item)

codecentric AG

Async
ItemWriter
ASYNCITEMPROCESSOR -> ASYNCITEMWRITER
AsyncItemProcessor and AsyncItemWriter
Java Concurrency API
Future

FutureTask

Sehr einfach zu konfigurieren
Optimal für aufwändige process-Schritte
Anreicherung von Daten über langsame APIs

Komplexe Berechnungen

codecentric AG
ASYNCITEMPROCESSOR -> ASYNCITEMWRITER
<bean id="processor" class="org.sfw.batch.integration.async.AsyncItemProcessor">
<property name="delegate" ref="delegateProcessor"/>
<property name="taskExecutor" ref="taskExecutor"/>

</bean>
<bean id="writer" class="org.sfw.batch.integration.async.AsyncItemWriter">
<property name="delegate" ref="delegateWriter"/>

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

Achtung: commit-interval > 1

codecentric AG
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunking

codecentric AG
PARALLEL STEPS

databaseJob

Thread 1

Thread 2

importTablePartner

loadTablePartner

codecentric AG

importTableVertrag

loadTableVertrag
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>
codecentric AG
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunking

codecentric AG
PARTITIONING
Name

Kategorie

…

…

A

Dennis

…

…

A

Frank

…

…

A

Daniel

…

…

B

Ben

…

…

B

Max

…

…

B

Christian …

…

C

Dirk

…

…

C

Thomas

codecentric AG

…

Tobias

Partitioner

…

…

…

C
PARTITIONING
Name

Kategorie

…

…

A

Dennis

…

…

A

Frank

…

…

A

Daniel

…

…

B

Ben

…

…

B

Max

…

…

B

Christian …

…

C

Dirk

…

…

C

Thomas

codecentric AG

…

Tobias

Partitioner

…

…

…

C

File 1

File 2

File 3
PARTITIONING
Name

Kategorie

…

…

A

Dennis

…

…

A

Frank

…

…

A

Daniel

…

…

B

Ben

…

…

B

Max

…

…

B

Christian …

…

C

Dirk

…

…

C

Thomas

codecentric AG

…

Tobias

Partitioner

…

…

…

C

File 1

File 2

File 3
PARTITIONING

Partitioner

PartitionHandler

erzeugt Partitionen

verteilt Partitionen an Worker

Lokaler Prozess (TaskExecutor)
Spring Remoting
JMS
Hadoop YARN

codecentric AG
PARTITIONING
Begin Step

For each item

Open
transaction

ItemReader
Item read()

ItemProcessor
process(Item)

ItemWriter
write(List<Item>)

Commit
transaction
false

For each item

Partitioner

Open
transaction

ItemReader
Item read()

ItemProcessor
process(Item)

ItemWriter
write(List<Item>)

Commit
transaction
false

For each item

Open
transaction

ItemReader
Item read()

ItemProcessor
process(Item)

ItemWriter
write(List<Item>)

Commit
transaction
false

codecentric AG

Finish
Step
PARTITIONING
<job id="flatfilePartitioningJob">
<step id="partitionedStep" >
<partition step="flatfilePartitioningStep" partitioner="partitioner">

<handler task-executor="taskExecutor" />
</partition>
</step>
</job>
<bean id="partitioner" class="org.sfw...support.MultiResourcePartitioner">
<property name="resources" value="file:src/test/resources/*.csv" />
</bean>

codecentric AG
PARTITIONING
+ Hoch skalierbar
+ Kein Bottleneck beim ItemReader
+ Datenlokalität

- Struktur der Input Daten muss bekannt sein

codecentric AG
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunking

codecentric AG
REMOTE CHUNKING

Slave Node 1

Master
Step 1

codecentric AG

ChunkProvider

ItemReader

Chunk
Processor

ItemWriter

Slave Node 2
Chunk
Processor

ItemWriter
REMOTE CHUNKING

Begin Step

Open
transaction

1

ItemReader
Item read()

Commit
transaction

Open
transaction

JMS

JMS

For each
item

ItemProcessor
process(Item)

ItemWriter
write(List<Item>)

Commit
transaction

2

Finish Step

codecentric AG
REMOTE CHUNKING
+ Hoch skalierbar
+ Struktur der Input Daten muss bekannt sein

- Ggf. Bottleneck beim ItemReader
- Transaktionale Middleware
- Alle Items werden serialisiert

codecentric AG
FRAGEN?
Dennis Schulte / Tobias Flohre
codecentric AG
Merscheider Straße 1
42699 Solingen
tobias.flohre@codecentric.de
dennis.schulte@codecentric.de

www.codecentric.de
blog.codecentric.de
www.meettheexperts.de

codecentric AG

10.11.2013

51

Weitere ähnliche Inhalte

Ähnlich wie W-JAX 2013 Spring Batch - Performance und Skalierbarkeit

Making AdWords Scripts Scale
Making AdWords Scripts ScaleMaking AdWords Scripts Scale
Making AdWords Scripts ScalePeakAce
 
Mit Performance-Modellierung Test- und Betriebskosten senken
Mit Performance-Modellierung Test- und Betriebskosten senkenMit Performance-Modellierung Test- und Betriebskosten senken
Mit Performance-Modellierung Test- und Betriebskosten senkenDynatrace
 
Webinar - ABAP Development Tools
Webinar - ABAP Development ToolsWebinar - ABAP Development Tools
Webinar - ABAP Development ToolsCadaxo GmbH
 
Open Source BPM - iteratec Architekturtag
Open Source BPM - iteratec ArchitekturtagOpen Source BPM - iteratec Architekturtag
Open Source BPM - iteratec Architekturtagcamunda services GmbH
 
JUG Luzern: Open Source BPM mit BPMN 2.0 und Java
JUG Luzern: Open Source BPM mit BPMN 2.0 und JavaJUG Luzern: Open Source BPM mit BPMN 2.0 und Java
JUG Luzern: Open Source BPM mit BPMN 2.0 und Javacamunda services GmbH
 
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge UnternehmenGewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge UnternehmenBjoern Reinhold
 
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...Mayflower GmbH
 
TDD mit ABAP Units
TDD mit ABAP UnitsTDD mit ABAP Units
TDD mit ABAP UnitsCadaxo GmbH
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreGregor Biswanger
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009Andreas Schulte
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsTorsten Kleiber
 
Domain-Driven Design in der Praxis
Domain-Driven Design in der PraxisDomain-Driven Design in der Praxis
Domain-Driven Design in der PraxisMichael Mirold
 
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“hpaustria
 
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...Spark Summit
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsThorsten Kamann
 

Ähnlich wie W-JAX 2013 Spring Batch - Performance und Skalierbarkeit (20)

Making AdWords Scripts Scale
Making AdWords Scripts ScaleMaking AdWords Scripts Scale
Making AdWords Scripts Scale
 
Mit Performance-Modellierung Test- und Betriebskosten senken
Mit Performance-Modellierung Test- und Betriebskosten senkenMit Performance-Modellierung Test- und Betriebskosten senken
Mit Performance-Modellierung Test- und Betriebskosten senken
 
Webinar - ABAP Development Tools
Webinar - ABAP Development ToolsWebinar - ABAP Development Tools
Webinar - ABAP Development Tools
 
Webinar: Vom Schrauber in die Cloud – Wie geht die Anbindung an das SAP Cloud...
Webinar: Vom Schrauber in die Cloud – Wie geht die Anbindung an das SAP Cloud...Webinar: Vom Schrauber in die Cloud – Wie geht die Anbindung an das SAP Cloud...
Webinar: Vom Schrauber in die Cloud – Wie geht die Anbindung an das SAP Cloud...
 
Open Source BPM - iteratec Architekturtag
Open Source BPM - iteratec ArchitekturtagOpen Source BPM - iteratec Architekturtag
Open Source BPM - iteratec Architekturtag
 
JUG Luzern: Open Source BPM mit BPMN 2.0 und Java
JUG Luzern: Open Source BPM mit BPMN 2.0 und JavaJUG Luzern: Open Source BPM mit BPMN 2.0 und Java
JUG Luzern: Open Source BPM mit BPMN 2.0 und Java
 
Jug muenchen bpmn in der praxis
Jug muenchen bpmn in der praxisJug muenchen bpmn in der praxis
Jug muenchen bpmn in der praxis
 
20110321 activiti märz
20110321 activiti märz20110321 activiti märz
20110321 activiti märz
 
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge UnternehmenGewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
 
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
 
TDD mit ABAP Units
TDD mit ABAP UnitsTDD mit ABAP Units
TDD mit ABAP Units
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009
 
Enterprise APEX
Enterprise APEXEnterprise APEX
Enterprise APEX
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and Operations
 
Domain-Driven Design in der Praxis
Domain-Driven Design in der PraxisDomain-Driven Design in der Praxis
Domain-Driven Design in der Praxis
 
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
 
2011 05 11 11-45 top_sopft-startfolien-xx-01
2011 05 11 11-45 top_sopft-startfolien-xx-012011 05 11 11-45 top_sopft-startfolien-xx-01
2011 05 11 11-45 top_sopft-startfolien-xx-01
 
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development Environments
 

W-JAX 2013 Spring Batch - Performance und Skalierbarkeit