Slides to our (Dennis Schulte and me) talk at the German Java conference W-JAX 2013 in Munich. Subject is the batch processing framework Spring Batch, general hints regarding performance in batch applications and scalability options in Spring Batch. Slides are in German.
9. 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
10. 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
11. 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
12. 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
15. VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 1
Kenne EVA
Eingabe Verarbeitung Ausgabe
codecentric AG
16. 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
17. 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
18. 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
19. VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 2
Kenne Deine nicht-funktionalen
Anforderungen
codecentric AG
20. VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 2
Mengengerüste
Zu erreichender Durchsatz
Was läuft parallel?
Minimiere den Aufwand!
codecentric AG
21. VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 3
Kenne Deine Persistenzschicht
codecentric AG
22. VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 3
Datenlokalität
Art des DB-Zugriffs
JDBC
ORM
Transaktionsgröße (commit-interval)
codecentric AG
23. VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 4
Zahlen sind besser als
Vermutungen
codecentric AG
24. 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
27. SKALIERUNGSSTRATEGIEN
Woher kommen die Threads?
java.util.concurrent.Executor
ThreadPoolExecutor
<task:executor id="taskExecutor" pool-size="5"/>
ApplicationServer verwalten eigene Threadpools
codecentric AG
34. 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
44. 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
50. REMOTE CHUNKING
+ Hoch skalierbar
+ Struktur der Input Daten muss bekannt sein
- Ggf. Bottleneck beim ItemReader
- Transaktionale Middleware
- Alle Items werden serialisiert
codecentric AG
51. 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