24
ASYNC JOB EXECUTION MIT SYMFONY2 ‘Die Welt ist nicht genug’ Wolfgang Münder

Async Job Execution mit Symfony2

Embed Size (px)

DESCRIPTION

Umfangreiche (Symfony2-) Applikationen machen es oftmals nötig größere BackEnd-Aufgaben asynchron auf mehrere Server zu verteilen. Ich möchte in diesem Vortrag ein generisches und leichtgewichtiges Setup für eine Symfony2 Applikation vorstellen. Als Beispiel ist hier (aus historischen Gründen) Gearman gewählt.

Citation preview

Page 1: Async Job Execution mit Symfony2

ASYNC JOB EXECUTION MIT SYMFONY2

‘Die Welt ist nicht genug’

Wolfgang Münder

Page 2: Async Job Execution mit Symfony2

Browser Apache PHP

Timeout

Page 3: Async Job Execution mit Symfony2

Browser

Done

Apache PHP PHP

Page 4: Async Job Execution mit Symfony2

PROBLEMSTELLUNG

• Hoher Zeitaufwand (Timeout!)

• Hoher Speicherbedarf

• User braucht Ergebnis nicht sofort

Page 5: Async Job Execution mit Symfony2

ANFORDERUNGEN

• Client-Prozesse

• Job-Server (ggf. mehrere)

•Worker auf mehreren Async-Servern

• Konfigurierbar

• Jobtypen (pro Worker)

• Job Priorität

• Worker-Instanzen pro Server

Image (c) http://gearman.org/

Page 6: Async Job Execution mit Symfony2

FRAMEWORK

• Job Queuing System

• Gearman

• Alternative: Message Queue

• ActiveMQ, RabbitMQ, ZeroMQ

Page 7: Async Job Execution mit Symfony2

CLIENT‘In tödlicher Mission’

Page 8: Async Job Execution mit Symfony2

CLIENT

• Best practice: \GearmanClient abstrahieren

• Symfony2 Service

• Schlankes Interface

• Job einstellen

• Job Status abrufen

• Job Output abrufen

• Überblick über alle Jobs/Jobtypen

Page 9: Async Job Execution mit Symfony2

JOB-SERVER‘Octopussy’

Page 10: Async Job Execution mit Symfony2

WORKER‘Stirb an einem anderen Tag’

Page 11: Async Job Execution mit Symfony2

SYMFONY2 FRISST SPEICHERLass es nicht lange leben.

Page 12: Async Job Execution mit Symfony2

TRENNE WORKER UND JOBS

Page 13: Async Job Execution mit Symfony2

WORKER COMMAND‘Leben und sterben lassen’

Page 14: Async Job Execution mit Symfony2

WORKER COMMAND

• Lebt ewig (supervisor)

• Registriert sich für Jobtypen (laut config)

• Startet Job Commands (proc_open)

•Organisiert Kommunikation

• Best practice: \GearmanWorker, \GearmanJob abstrahiert

Page 15: Async Job Execution mit Symfony2

WORKER COMMAND

•Nice to have

• Eigenes Logfile für Worker

• Logging mit hostname + process_id

Page 16: Async Job Execution mit Symfony2

JOB COMMAND‘Man lebt nur zweinmal’

Page 17: Async Job Execution mit Symfony2

JOB COMMAND

• Lebt nur für einen Job

• Vollständig entkoppelt vom Job-Framework

• Änderungen im Code sofort verfügbar

• Eigenes Command pro Jobtyp

Page 18: Async Job Execution mit Symfony2

JOB COMMAND

• Nice to have

• Eigenes Logfile pro Jobtyp

• Logging mit hostname + process_id

• Generische Fehlerbehandlung

• E-Mail im Fehlerfall

• Xhprof Profiling

• Login über serialisierten Token

Page 19: Async Job Execution mit Symfony2

‘Ein Quantum Trost’TESTS

Page 20: Async Job Execution mit Symfony2

TESTS

• Infrastruktur immer nur bedingt testbar

• Test-Client

• Prüft ob Jobs korrekt eingestellt werden

• Prüft ob Jobs korrekte Argumente erhalten

• Job Commands individuell testbar

Page 21: Async Job Execution mit Symfony2

GEARMANJob-Server auf mehreren Servern funktioniert nicht

Page 22: Async Job Execution mit Symfony2

GEARMANJob-Priorität nicht über Jobtypen hinweg

Page 23: Async Job Execution mit Symfony2

GEARMANOutput abrufen nur ‘händisch’

Page 24: Async Job Execution mit Symfony2

FAZIT

• Gearman löst Timeout-Probleme

• Generische Implementierung durch Abstraktion

• Gearman löst das Skalierungsproblem aber nicht vollständig

[email protected]