Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WJAX 2014 Best Practice Java Batch - Architektur, Probleme und Lösungen

tobiasflohre
November 04, 2014
490

WJAX 2014 Best Practice Java Batch - Architektur, Probleme und Lösungen

Immer mehr Unternehmen setzen auf Batch-Verarbeitung in Java – nur wie macht man es richtig? Nach einer kurzen Einführung in den JSR-352 / Spring Batch stellen wir in diesem Vortrag die unserer Erfahrung nach optimale Architektur für Batch-Services im Enterprise-Umfeld zunächst Framework-neutral vor: verteilte Umgebung, Container, Kommunikation über http, fertig. Vielfach kundenerprobt. Und doch – ganz problemfrei und schnell geht es nicht immer. Aufwände fließen in die Entwicklung eines eigenen Meta-Batch-Frameworks, der Umgang mit den Application Servern ist nicht immer ganz einfach, und schnell entstehen Batch-Monolithen mit Unmengen von Jobs – ein Horror für Updates und Testing. Wie kann man diese Aufwände umgehen? Im zweiten Teil unseres Vortrags zeigen wir eine Lösung mit Spring Boot / Spring Batch auf.

tobiasflohre

November 04, 2014
Tweet

Transcript

  1. Tobias Flohre / Dennis Schulte | codecentric AG Best Practice

    Java Batch Architektur, Probleme und Lösungen
  2. codecentric AG FRAGEN JAVA BATCH -  Soll ein Framework verwendet

    werden? Wenn ja, welches? -  Wie sollen die Batch-Jobs betrieben werden? -  Wie werden die Batch-Jobs ins Unternehmen eingebunden? Wer startet sie?
  3. codecentric AG FRAGEN JAVA BATCH -  Soll ein Framework verwendet

    werden? Wenn ja, welches? -  Wie sollen die Batch-Jobs betrieben werden? -  Wie werden die Batch-Jobs ins Unternehmen eingebunden? Wer startet sie? Ja! Spring Batch JSR-352 / JEE7
  4. codecentric AG BATCH FRAMEWORK Automatisches Transaktionsmanagement Skip Retry Persistente Job-Metadaten

    Restart Skalierungsfeatures Gleichförmiges Programmiermodell Komponenten
  5. codecentric AG -  Job wird in XML erstellt (Job-XML) - 

    Domain Specific Language manifestiert sich in XML- Namespace -  Zentrale Elemente -  job -  step -  chunk -  reader -  processor -  writer -  item-count -  Ablage unter META-INF/batch-jobs DOMAIN / KONFIGURATION / ABLAUF 06.11.14 9 <job id="myJob" > <step id="myStep" > <chunk item-count="2" > <reader ref="myReader" /> <processor ref="myProcessor" /> <writer ref="myWriter" /> </chunk> </step> </job>
  6. codecentric AG -  Reader, Processor und Writer implementieren bestimmte Interfaces

    -  ItemReader -  Object readItem() -  ItemProcessor -  Object processItem(Object item) -  ItemWriter -  void writeItems(List<Object> items) -  Implementierungen nicht Bestandteil der Spec DOMAIN / KONFIGURATION / ABLAUF 06.11.14 10
  7. codecentric AG * * * * DOMAIN / KONFIGURATION /

    ABLAUF Step Job JobInstance JobExecution StepExecution Inkasso Kraftfahrt Inkasso Kraftfahrt am 22.03.13 Inkasso Kraftfahrt am 22.03.13 erster Versuch
  8. codecentric AG FRAGEN JAVA BATCH -  Soll ein Framework verwendet

    werden? Wenn ja, welches? -  Wie sollen die Batch-Jobs betrieben werden? -  Wie werden die Batch-Jobs ins Unternehmen eingebunden? Wer startet sie?
  9. codecentric AG BETRIEB VON BATCH-JOBS -  Spring Batch / JSR-352

    geben keine Laufzeitumgebung vor -  Empfehlung: Betrieb im Servlet-Container -  HTTP etabliertes Protokoll -  Fail-Fast -  Monitoring -  Speichermanagement
  10. codecentric AG FRAGEN JAVA BATCH -  Soll ein Framework verwendet

    werden? Wenn ja, welches? -  Wie sollen die Batch-Jobs betrieben werden? -  Wie werden die Batch-Jobs ins Unternehmen eingebunden? Wer startet sie?
  11. codecentric AG Servlet Container 06.11.14 15 Anwendung Batch Application HTTP

    Endpoint Scheduler Job- Metadaten Logs EINBINDUNG DER BATCH-JOBS Cron-Job Workflow-System
  12. codecentric AG EINBINDUNG DER BATCH-JOBS -  REST-Like API -  Job

    starten -  Status des Jobs abfragen -  Job stoppen -  Protokoll / Log des Jobs abholen
  13. codecentric AG 06.11.14 17 /jobs/ <jobname> Scheduler Steuerungs- Skript starteJob()

    ExecutionId /jobs/executions/ <executionId> /jobs/executions/ <executionId>/ log getStatus() getLogFile() Schleife EINBINDUNG DER BATCH-JOBS
  14. codecentric AG FRAGEN JAVA BATCH -  Soll ein Framework verwendet

    werden? Wenn ja, welches? -  Wie sollen die Batch-Jobs betrieben werden? -  Wie werden die Batch-Jobs ins Unternehmen eingebunden? Wer startet sie? Fragen beantwortet Batch-Meta-Framework
  15. codecentric AG BATCH-META-FRAMEWORK HTTP-Endpoints Job-Start Status Job-Stop Logfile / Protokoll

    Laufende Jobs Deployed Jobs Job-Execution- Details Logging Logfile pro Job-Execution Thread-Local Protokoll Einheitliches Format Kerndaten des Joblaufs Revisionssichere Ablage Metrics Test- Unterstützung Test-Ressourcen In-Memory Zähler Summen Transaktionssicher
  16. codecentric AG -  Es entstehen Monolithen -  Conway‘s Law - 

    Gemeinsam genutzter Code - Wer darf wann, was ändern? -  Abhängigkeiten zwischen Modulen – Wann darf ich releasen? -  à Erhöhte Komplexität! -  Das Handling von Application Servern ist unnötig komplex -  Kein Parallelbetrieb von Online und Batch -  Mehrere Apps pro AppServer wird selten genutzt -  Zyklische Abhängigkeit zwischen Anwendung und Server -  Komplexes Aufsetzen der lokalen IDE HERAUSFORDERUNGEN 06.11.14 20
  17. codecentric AG 1. Unterstützung der favorisierten Architektur 2. Extrem einfache

    Verwendung 3. Allgemein benötigte Funktionalität sollte enthalten sein LÖSUNG – ZIELE 06.11.14 21
  18. codecentric AG -  Microservice-Architektur -  Totale Prozessisolation -  ~1 Job

    pro Anwendung -  Basisarchitektur -  Spring Boot / Spring Batch -  Implementierung der Batch-Meta-Framework Features in eigenem Starter -  https://github.com/codecentric/spring-boot-starter-batch-web -  Gemeinsame Komponenten -  Gesunder Menschenverstand vs. shared nothing -  Open Source -  „Don‘t repeat yourself“ nicht übertreiben LÖSUNG – MICRO BATCH SERVICES 06.11.14 22
  19. codecentric AG LÖSUNG – MICRO BATCH SERVICES 06.11.14 24 JAR

    HTTP Batch A Nachher: JAR HTTP Batch B JAR HTTP Batch C
  20. codecentric AG - No Hot Deployments! - Pakete bauen: RPM, deb, Docker

    -  Jenkins! -  z.B. mit maven-rpm-plugin DEPLOYMENT UND BETRIEB 06.11.14 27
  21. codecentric AG <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>rpm-maven-plugin</artifactId> <configuration> <name>${project.name}</name> <mappings> <mapping> <directory>/opt/${project.name}/</directory>

    <sources> <source> <destination>${project.name}.jar</destination> <location>target/${project.artifactId}.jar</location> </source> </sources> </mapping> </mappings> </configuration> </plugin> DEPLOYMENT UND BETRIEB 06.11.14 28
  22. codecentric AG - Installation über Paketmanager des OS - Konfigurationen werden aus

    SCM geladen -  Einfaches Shell-Skript „copy-properties.sh“ -  Spring Cloud Config - Automatisieren! DEPLOYMENT UND BETRIEB 06.11.14 29
  23. codecentric AG FRAGEN? Tobias Flohre Dennis Schulte codecentric AG Merscheider

    Straße 1 42699 Solingen tobias.fl[email protected] [email protected] www.codecentric.de blog.codecentric.de www.meettheexperts.de 06.11.14 30