SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Asynchrone Event
Verarbeitung
Jan Gregor Emge-Triebel (@jan0707)
Dennis Oehme (@dennisoehme)
Symfony User Group Frankfurt
25. Februar 2016
Garden of Concepts GmbH
● Hanau / München
● Eigenes CMS - System
● Eigenes CRM - System
● Individual - Entwicklungen
● Symfony Entwicklung
○ MongoDB, ElasticSearch, MySQL,
RabbitMQ, Redis, AngularJS, Twig, Jade,
Gitlab, Docker, Vagrant, Ansible
● Say hi @goc_mediastudio
Requests == Event
“Symfony is a request based
framework.”
Fabien Potencier, Symfony Live 2014
@fabpot
Requests
Request Controller Logik 1 Logik 2 Response
Request Controller
Logik 1
Logik 2
Response
Synchron
Asynchron
Warum benötigen wir asynchrone Verarbeitung?
● Langläufige Prozesse auslagern
● Reaktionszeit verkürzen
● Verlagerung von Last
● Microservices
● Parallelisierung von Prozessen
● Skalierbarkeit
● Austausch von Nachrichten mit anderen (Sub-)Systemen
Unsere Reiseroute
● Gearman
● (PHP) Resque
○ Demo
● RabbitMQ
Gearman
● Gearman Job Server (in C geschrieben)
● Läuft als Linux Daemon
● PECL Extension für Worker API
● Worker APIs für weiteren Sprachen (C, Perl,...)
Gearman
http://gearman.org/examples/send-emails/
Gearman
● PECL-Extension Version 1.1.2 von August 2013
● Letztes Server-Release von Anfang 2014
● Gefühlter Stillstand
● Gearmand und Extension oftmals inkompatibel / instabil
(PHP) Resque
● Portierung von Resque:
○ Resque is a Redis-backed Ruby library for creating background jobs, placing them on multiple
queues, and processing them later.
● Nutzt Redis(-Cluster)
● Redis beherrscht atomare Transaktionen (FIFO)
Demo
https://github.com/Jan0707/async-symfony
(PHP) Resque
● Seit 2012 unregelmäßig Commits im Master, letzter 2015-05-12
● chrisboulton/php-resque & michelsalib/BCCResqueBundle tot ?
RabbitMQ
Oder warum wir den Vortrag
“Asynchrone Event Verarbeitung mit RabbitMQ”
hätten nennen sollen
RabbitMQ
● Message Broker in Erlang geschrieben
● AMQP (Advanced Message Queuing Protocol)
● Offenes, aber binäres Netzwerkprotokoll
● Routing, Verteilen von Messages, etc.
● Transaktionen
● Weitere tolle Features
○ TTL
○ DLX (Dead Letter eXchange)
○ PreFetching
Vom publishen und consumen...
Publisher Publish Consumer
Ex-
change
QueueRoutes Consumes
There is a Bundle for it
● https://github.com/php-amqplib/RabbitMqBundle
● Consumer und Producer werden zu Symfony-Services
● Queue Consumer werden als Symfony Command ausgeführt
● Konfiguration via app/config.yml
○ Besser: app/config/rabbitmq.yml und in app/config/config.yml importieren
app/config/rabbitmq.yml
Symfony Producer
Symfony Consumer
Erfahrungen mit Consumern
● PHP-Prozesse sind nicht für langläufige Prozesse gemacht
○ Ungewohnte Probleme: Memory Leaks, ...
● Mit Supervisor Consumer überwachen und neu starten lassen
● Offene Datenbank-Verbindungen, ggf. Timeouts = Beendigung bei Inaktivät
● Begrenzte Laufzeit pro Prozess (nach x Messages automatisch beenden)
● Memory Limit: RabbitMQ-Bundle hat eine Art “Soft-Quota”
● Anlaufen von Consumern dauert vergleichsweise lange
● Prefetching (Achtung: Reihenfolge!)
Message
● Kompakte Messages, Queues fressen Storage / RAM
● Allgemeines Format, z.B. JSON oder XML
○ Keine serialisierten PHP Objekte oder Array, um langfristig Interoperabilität mit anderen
System oder Sprachen zu gewährleisten
Message Transformation
● JMS/Serializer um Objekte nach JSON zu konvertieren
○ Im Consumer JSON-formatierte Strings zurück in Objekte
○ Objekte lassen sich dank Symfony Form und Asserts validieren
○ Alternativ: PHPs JsonSerializable Interface
○ Entities / Dokumente ggf. neu laden / aktualisieren (Unit of Work)
Message Header
● Message “Header” für Content-Type und Version
○ Messages könnten sich ändern, Consumer müssen kompatibel bleiben
● Eindeutige IDs machen das Logging / Debugging / Leben einfacher
● Weitere Metadaten:
○ Zeitstempel
○ User
○ App ID, etc.
Tipp: Eigene Consumer- / Producer-Klassen
● Message Transformation
● Events
● Logging
Transaktionen
● Messages werden immer exakt einem Consumer zugewiesen
● Consumer muss explizit eine Nachricht mit “acknowledge” beantworten
● Andernfalls wird Nachricht rejected (and ggf. requeued)
○ Verwerfen heißt ggf. Datenverlust
○ Requeuing - Achtung:
■ könnte u.U. zu sog. Toxic Messages führen
■ könnte die Reihenfolge der Messages verändern
Toxic Messages
● Wird eine Message nicht explizit beantwortet, landet sie wieder in der Queue
● Wiederholt sich der Vorgang, haben wir eine Endlosschleife
Dead Letter Exchange
● RabbitMQ kennt daher die sog. Dead Letter Exchange (DLX)
● Queue bestimmt eine DLX, eine weitere Queue, in der alle Messages landen,
die zurückgewiesen wurden (Reject, TTL, Prefetch)
app/config/rabbitmq.yml
Signal Handling
● Graceful Shutdown
● pcntl_signal / _dispatch
● SIGTERM
● FATAL ERROR abfangen
● Logging
● Toxic Message-Handling
Shutdown
Deployment
● Consumer benötigen i.d.R. die aktuelle Code-Base
● Consumer benötigen einen “graceful” Shutdown
● Consumer sollten nur bei Inaktivät beendet werden
○ Sonst Message/Daten - Verlust
Und andere Herausforderungen
● Maßgebliche Änderung der Infrastruktur
○ Vorsicht bei der Partnerwahl / Abhängigkeit
● Last verschoben ist nicht aufgehoben
● Umdenken erforderlich
○ Statusanzeige
○ Zwischenstände
○ Push statt Pull / Websockets
● Abhängigkeiten von Messages
○ Insbesondere bei Parallelisierung !
● Performance (insg. mit Doctrine ORM / ODM)
Fragen ?
Danke :)
Diesen und andere Talks findet ihr auf:
https://www.gardenofconcepts.com/talks/
Talk bewerten nicht vergessen!

Weitere ähnliche Inhalte

Andere mochten auch

Wärme im dialog slideshare
Wärme im dialog slideshareWärme im dialog slideshare
Wärme im dialog slideshareWaermeimdialog
 
Pitch isterre
Pitch isterrePitch isterre
Pitch isterreSMARTHUB
 
Deutscher Lernatlas 2012
Deutscher Lernatlas 2012Deutscher Lernatlas 2012
Deutscher Lernatlas 2012Andre_Schleiter
 
Desarrollo sostenible
Desarrollo sostenibleDesarrollo sostenible
Desarrollo sostenibleWILS2015
 
Eine Einführung in die Evaluation - Unterrichtsmaterialien für Schulen
Eine Einführung in die Evaluation - Unterrichtsmaterialien für SchulenEine Einführung in die Evaluation - Unterrichtsmaterialien für Schulen
Eine Einführung in die Evaluation - Unterrichtsmaterialien für SchulenTanja Jadin
 
Comics als Ordnungs-/Reflexionswerkzeug in (Online-) Lernprozessen
Comics als Ordnungs-/Reflexionswerkzeug in (Online-) LernprozessenComics als Ordnungs-/Reflexionswerkzeug in (Online-) Lernprozessen
Comics als Ordnungs-/Reflexionswerkzeug in (Online-) LernprozessenJutta Pauschenwein
 
Aus dem elektronischen Werkzeugkasten geplaudert - Arbeitserleichterung und M...
Aus dem elektronischen Werkzeugkasten geplaudert - Arbeitserleichterung und M...Aus dem elektronischen Werkzeugkasten geplaudert - Arbeitserleichterung und M...
Aus dem elektronischen Werkzeugkasten geplaudert - Arbeitserleichterung und M...Manfred Sablotny
 
Portrait of a provider of integrated field services and solutions
Portrait of a provider of integrated field services and solutionsPortrait of a provider of integrated field services and solutions
Portrait of a provider of integrated field services and solutionsTeleste Corporation
 
Bildungsnetzwerk Steiermark, Diplomlehrgang: Jutta Tomintz Abschlußarbeit
Bildungsnetzwerk Steiermark, Diplomlehrgang: Jutta Tomintz AbschlußarbeitBildungsnetzwerk Steiermark, Diplomlehrgang: Jutta Tomintz Abschlußarbeit
Bildungsnetzwerk Steiermark, Diplomlehrgang: Jutta Tomintz AbschlußarbeitErwin Schmitzberger
 

Andere mochten auch (16)

Wärme im dialog slideshare
Wärme im dialog slideshareWärme im dialog slideshare
Wärme im dialog slideshare
 
John Steinbeck
John SteinbeckJohn Steinbeck
John Steinbeck
 
Webwest
WebwestWebwest
Webwest
 
Ferramentas web 2
Ferramentas web 2Ferramentas web 2
Ferramentas web 2
 
MY GAMES
MY GAMESMY GAMES
MY GAMES
 
Pitch isterre
Pitch isterrePitch isterre
Pitch isterre
 
BBFC
BBFCBBFC
BBFC
 
Deutscher Lernatlas 2012
Deutscher Lernatlas 2012Deutscher Lernatlas 2012
Deutscher Lernatlas 2012
 
Desarrollo sostenible
Desarrollo sostenibleDesarrollo sostenible
Desarrollo sostenible
 
Eine Einführung in die Evaluation - Unterrichtsmaterialien für Schulen
Eine Einführung in die Evaluation - Unterrichtsmaterialien für SchulenEine Einführung in die Evaluation - Unterrichtsmaterialien für Schulen
Eine Einführung in die Evaluation - Unterrichtsmaterialien für Schulen
 
Ppt
PptPpt
Ppt
 
Comics als Ordnungs-/Reflexionswerkzeug in (Online-) Lernprozessen
Comics als Ordnungs-/Reflexionswerkzeug in (Online-) LernprozessenComics als Ordnungs-/Reflexionswerkzeug in (Online-) Lernprozessen
Comics als Ordnungs-/Reflexionswerkzeug in (Online-) Lernprozessen
 
El control
El controlEl control
El control
 
Aus dem elektronischen Werkzeugkasten geplaudert - Arbeitserleichterung und M...
Aus dem elektronischen Werkzeugkasten geplaudert - Arbeitserleichterung und M...Aus dem elektronischen Werkzeugkasten geplaudert - Arbeitserleichterung und M...
Aus dem elektronischen Werkzeugkasten geplaudert - Arbeitserleichterung und M...
 
Portrait of a provider of integrated field services and solutions
Portrait of a provider of integrated field services and solutionsPortrait of a provider of integrated field services and solutions
Portrait of a provider of integrated field services and solutions
 
Bildungsnetzwerk Steiermark, Diplomlehrgang: Jutta Tomintz Abschlußarbeit
Bildungsnetzwerk Steiermark, Diplomlehrgang: Jutta Tomintz AbschlußarbeitBildungsnetzwerk Steiermark, Diplomlehrgang: Jutta Tomintz Abschlußarbeit
Bildungsnetzwerk Steiermark, Diplomlehrgang: Jutta Tomintz Abschlußarbeit
 

Ähnlich wie Asynchrone Event Verarbeitung

TYPO3 Migration in komplexen Upgrade- und Relaunch-Projekten
TYPO3 Migration in komplexen Upgrade- und Relaunch-ProjektenTYPO3 Migration in komplexen Upgrade- und Relaunch-Projekten
TYPO3 Migration in komplexen Upgrade- und Relaunch-ProjektenAlex Kellner
 
Pub/Sub for the masses- Ein Einführungsworkshop in MQTT [GERMAN]
Pub/Sub for the masses- Ein Einführungsworkshop in MQTT [GERMAN]Pub/Sub for the masses- Ein Einführungsworkshop in MQTT [GERMAN]
Pub/Sub for the masses- Ein Einführungsworkshop in MQTT [GERMAN]Dominik Obermaier
 
Domino 9 - Was ist neu?
Domino 9 - Was ist neu?Domino 9 - Was ist neu?
Domino 9 - Was ist neu?Ralph Belfiore
 
SplunkLive! München - Flughafen München
SplunkLive! München - Flughafen MünchenSplunkLive! München - Flughafen München
SplunkLive! München - Flughafen MünchenSplunk
 
Back to Basics - Webinar 6: Produktivsetzung einer Anwendung
Back to Basics - Webinar 6: Produktivsetzung einer AnwendungBack to Basics - Webinar 6: Produktivsetzung einer Anwendung
Back to Basics - Webinar 6: Produktivsetzung einer AnwendungMongoDB
 
JAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsJAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsFrank Müller
 
MQTT Deep Dive Workshop [GERMAN]
MQTT Deep Dive Workshop [GERMAN]MQTT Deep Dive Workshop [GERMAN]
MQTT Deep Dive Workshop [GERMAN]Dominik Obermaier
 
Camunda Community Day_Wiener BPM Offensive
Camunda Community Day_Wiener BPM OffensiveCamunda Community Day_Wiener BPM Offensive
Camunda Community Day_Wiener BPM Offensivecamunda services GmbH
 
MySQL Beispiele aus der Praxis - Wie setzen Kunden MySQL ein?
MySQL Beispiele aus der Praxis - Wie setzen Kunden MySQL ein?MySQL Beispiele aus der Praxis - Wie setzen Kunden MySQL ein?
MySQL Beispiele aus der Praxis - Wie setzen Kunden MySQL ein?FromDual GmbH
 
Fujitsu Storage Days 2017 - Rudolf Klassen - "Erfahrungsbericht ETERNUS DX200...
Fujitsu Storage Days 2017 - Rudolf Klassen - "Erfahrungsbericht ETERNUS DX200...Fujitsu Storage Days 2017 - Rudolf Klassen - "Erfahrungsbericht ETERNUS DX200...
Fujitsu Storage Days 2017 - Rudolf Klassen - "Erfahrungsbericht ETERNUS DX200...Fujitsu Central Europe
 
Webservice API - Webportale mit Force.com verbinden
Webservice API - Webportale mit Force.com verbindenWebservice API - Webportale mit Force.com verbinden
Webservice API - Webportale mit Force.com verbindenAptly GmbH
 
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source JavaJBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Javacamunda services GmbH
 
OSMC 2010 | Monitoring mit Shinken by Gerhard Laußer
OSMC 2010 | Monitoring mit Shinken by Gerhard LaußerOSMC 2010 | Monitoring mit Shinken by Gerhard Laußer
OSMC 2010 | Monitoring mit Shinken by Gerhard LaußerNETWAYS
 
XMPP - Real Time Communication
XMPP - Real Time CommunicationXMPP - Real Time Communication
XMPP - Real Time CommunicationDominic Lüchinger
 
Nebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenNebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenJörn Dinkla
 
5 Tweaks für 500 % bessere Performance
5 Tweaks für 500 % bessere Performance5 Tweaks für 500 % bessere Performance
5 Tweaks für 500 % bessere PerformanceJonas Hünig
 

Ähnlich wie Asynchrone Event Verarbeitung (20)

TYPO3 Migration in komplexen Upgrade- und Relaunch-Projekten
TYPO3 Migration in komplexen Upgrade- und Relaunch-ProjektenTYPO3 Migration in komplexen Upgrade- und Relaunch-Projekten
TYPO3 Migration in komplexen Upgrade- und Relaunch-Projekten
 
Pub/Sub for the masses- Ein Einführungsworkshop in MQTT [GERMAN]
Pub/Sub for the masses- Ein Einführungsworkshop in MQTT [GERMAN]Pub/Sub for the masses- Ein Einführungsworkshop in MQTT [GERMAN]
Pub/Sub for the masses- Ein Einführungsworkshop in MQTT [GERMAN]
 
Domino 9 - Was ist neu?
Domino 9 - Was ist neu?Domino 9 - Was ist neu?
Domino 9 - Was ist neu?
 
SplunkLive! München - Flughafen München
SplunkLive! München - Flughafen MünchenSplunkLive! München - Flughafen München
SplunkLive! München - Flughafen München
 
SuperCollider SS2016 1
SuperCollider SS2016 1SuperCollider SS2016 1
SuperCollider SS2016 1
 
openHAB @ rheinJUG Düsseldorf
openHAB @ rheinJUG DüsseldorfopenHAB @ rheinJUG Düsseldorf
openHAB @ rheinJUG Düsseldorf
 
Back to Basics - Webinar 6: Produktivsetzung einer Anwendung
Back to Basics - Webinar 6: Produktivsetzung einer AnwendungBack to Basics - Webinar 6: Produktivsetzung einer Anwendung
Back to Basics - Webinar 6: Produktivsetzung einer Anwendung
 
JAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsJAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIs
 
MQTT Deep Dive Workshop [GERMAN]
MQTT Deep Dive Workshop [GERMAN]MQTT Deep Dive Workshop [GERMAN]
MQTT Deep Dive Workshop [GERMAN]
 
Camunda Community Day_Wiener BPM Offensive
Camunda Community Day_Wiener BPM OffensiveCamunda Community Day_Wiener BPM Offensive
Camunda Community Day_Wiener BPM Offensive
 
MySQL Backup
MySQL BackupMySQL Backup
MySQL Backup
 
MySQL Beispiele aus der Praxis - Wie setzen Kunden MySQL ein?
MySQL Beispiele aus der Praxis - Wie setzen Kunden MySQL ein?MySQL Beispiele aus der Praxis - Wie setzen Kunden MySQL ein?
MySQL Beispiele aus der Praxis - Wie setzen Kunden MySQL ein?
 
Fujitsu Storage Days 2017 - Rudolf Klassen - "Erfahrungsbericht ETERNUS DX200...
Fujitsu Storage Days 2017 - Rudolf Klassen - "Erfahrungsbericht ETERNUS DX200...Fujitsu Storage Days 2017 - Rudolf Klassen - "Erfahrungsbericht ETERNUS DX200...
Fujitsu Storage Days 2017 - Rudolf Klassen - "Erfahrungsbericht ETERNUS DX200...
 
Webservice API - Webportale mit Force.com verbinden
Webservice API - Webportale mit Force.com verbindenWebservice API - Webportale mit Force.com verbinden
Webservice API - Webportale mit Force.com verbinden
 
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source JavaJBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
 
OSMC 2010 | Monitoring mit Shinken by Gerhard Laußer
OSMC 2010 | Monitoring mit Shinken by Gerhard LaußerOSMC 2010 | Monitoring mit Shinken by Gerhard Laußer
OSMC 2010 | Monitoring mit Shinken by Gerhard Laußer
 
Transaktionssysteme
TransaktionssystemeTransaktionssysteme
Transaktionssysteme
 
XMPP - Real Time Communication
XMPP - Real Time CommunicationXMPP - Real Time Communication
XMPP - Real Time Communication
 
Nebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenNebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturieren
 
5 Tweaks für 500 % bessere Performance
5 Tweaks für 500 % bessere Performance5 Tweaks für 500 % bessere Performance
5 Tweaks für 500 % bessere Performance
 

Asynchrone Event Verarbeitung

  • 1. Asynchrone Event Verarbeitung Jan Gregor Emge-Triebel (@jan0707) Dennis Oehme (@dennisoehme) Symfony User Group Frankfurt 25. Februar 2016
  • 2. Garden of Concepts GmbH ● Hanau / München ● Eigenes CMS - System ● Eigenes CRM - System ● Individual - Entwicklungen ● Symfony Entwicklung ○ MongoDB, ElasticSearch, MySQL, RabbitMQ, Redis, AngularJS, Twig, Jade, Gitlab, Docker, Vagrant, Ansible ● Say hi @goc_mediastudio
  • 3. Requests == Event “Symfony is a request based framework.” Fabien Potencier, Symfony Live 2014 @fabpot
  • 4. Requests Request Controller Logik 1 Logik 2 Response Request Controller Logik 1 Logik 2 Response Synchron Asynchron
  • 5. Warum benötigen wir asynchrone Verarbeitung? ● Langläufige Prozesse auslagern ● Reaktionszeit verkürzen ● Verlagerung von Last ● Microservices ● Parallelisierung von Prozessen ● Skalierbarkeit ● Austausch von Nachrichten mit anderen (Sub-)Systemen
  • 6. Unsere Reiseroute ● Gearman ● (PHP) Resque ○ Demo ● RabbitMQ
  • 7. Gearman ● Gearman Job Server (in C geschrieben) ● Läuft als Linux Daemon ● PECL Extension für Worker API ● Worker APIs für weiteren Sprachen (C, Perl,...)
  • 9. Gearman ● PECL-Extension Version 1.1.2 von August 2013 ● Letztes Server-Release von Anfang 2014 ● Gefühlter Stillstand ● Gearmand und Extension oftmals inkompatibel / instabil
  • 10. (PHP) Resque ● Portierung von Resque: ○ Resque is a Redis-backed Ruby library for creating background jobs, placing them on multiple queues, and processing them later. ● Nutzt Redis(-Cluster) ● Redis beherrscht atomare Transaktionen (FIFO)
  • 12. (PHP) Resque ● Seit 2012 unregelmäßig Commits im Master, letzter 2015-05-12 ● chrisboulton/php-resque & michelsalib/BCCResqueBundle tot ?
  • 13. RabbitMQ Oder warum wir den Vortrag “Asynchrone Event Verarbeitung mit RabbitMQ” hätten nennen sollen
  • 14. RabbitMQ ● Message Broker in Erlang geschrieben ● AMQP (Advanced Message Queuing Protocol) ● Offenes, aber binäres Netzwerkprotokoll ● Routing, Verteilen von Messages, etc. ● Transaktionen ● Weitere tolle Features ○ TTL ○ DLX (Dead Letter eXchange) ○ PreFetching
  • 15. Vom publishen und consumen... Publisher Publish Consumer Ex- change QueueRoutes Consumes
  • 16. There is a Bundle for it ● https://github.com/php-amqplib/RabbitMqBundle ● Consumer und Producer werden zu Symfony-Services ● Queue Consumer werden als Symfony Command ausgeführt ● Konfiguration via app/config.yml ○ Besser: app/config/rabbitmq.yml und in app/config/config.yml importieren
  • 20. Erfahrungen mit Consumern ● PHP-Prozesse sind nicht für langläufige Prozesse gemacht ○ Ungewohnte Probleme: Memory Leaks, ... ● Mit Supervisor Consumer überwachen und neu starten lassen ● Offene Datenbank-Verbindungen, ggf. Timeouts = Beendigung bei Inaktivät ● Begrenzte Laufzeit pro Prozess (nach x Messages automatisch beenden) ● Memory Limit: RabbitMQ-Bundle hat eine Art “Soft-Quota” ● Anlaufen von Consumern dauert vergleichsweise lange ● Prefetching (Achtung: Reihenfolge!)
  • 21. Message ● Kompakte Messages, Queues fressen Storage / RAM ● Allgemeines Format, z.B. JSON oder XML ○ Keine serialisierten PHP Objekte oder Array, um langfristig Interoperabilität mit anderen System oder Sprachen zu gewährleisten
  • 22. Message Transformation ● JMS/Serializer um Objekte nach JSON zu konvertieren ○ Im Consumer JSON-formatierte Strings zurück in Objekte ○ Objekte lassen sich dank Symfony Form und Asserts validieren ○ Alternativ: PHPs JsonSerializable Interface ○ Entities / Dokumente ggf. neu laden / aktualisieren (Unit of Work)
  • 23. Message Header ● Message “Header” für Content-Type und Version ○ Messages könnten sich ändern, Consumer müssen kompatibel bleiben ● Eindeutige IDs machen das Logging / Debugging / Leben einfacher ● Weitere Metadaten: ○ Zeitstempel ○ User ○ App ID, etc.
  • 24. Tipp: Eigene Consumer- / Producer-Klassen ● Message Transformation ● Events ● Logging
  • 25. Transaktionen ● Messages werden immer exakt einem Consumer zugewiesen ● Consumer muss explizit eine Nachricht mit “acknowledge” beantworten ● Andernfalls wird Nachricht rejected (and ggf. requeued) ○ Verwerfen heißt ggf. Datenverlust ○ Requeuing - Achtung: ■ könnte u.U. zu sog. Toxic Messages führen ■ könnte die Reihenfolge der Messages verändern
  • 26. Toxic Messages ● Wird eine Message nicht explizit beantwortet, landet sie wieder in der Queue ● Wiederholt sich der Vorgang, haben wir eine Endlosschleife
  • 27. Dead Letter Exchange ● RabbitMQ kennt daher die sog. Dead Letter Exchange (DLX) ● Queue bestimmt eine DLX, eine weitere Queue, in der alle Messages landen, die zurückgewiesen wurden (Reject, TTL, Prefetch)
  • 29. Signal Handling ● Graceful Shutdown ● pcntl_signal / _dispatch ● SIGTERM ● FATAL ERROR abfangen ● Logging ● Toxic Message-Handling Shutdown
  • 30. Deployment ● Consumer benötigen i.d.R. die aktuelle Code-Base ● Consumer benötigen einen “graceful” Shutdown ● Consumer sollten nur bei Inaktivät beendet werden ○ Sonst Message/Daten - Verlust
  • 31. Und andere Herausforderungen ● Maßgebliche Änderung der Infrastruktur ○ Vorsicht bei der Partnerwahl / Abhängigkeit ● Last verschoben ist nicht aufgehoben ● Umdenken erforderlich ○ Statusanzeige ○ Zwischenstände ○ Push statt Pull / Websockets ● Abhängigkeiten von Messages ○ Insbesondere bei Parallelisierung ! ● Performance (insg. mit Doctrine ORM / ODM)
  • 32. Fragen ? Danke :) Diesen und andere Talks findet ihr auf: https://www.gardenofconcepts.com/talks/ Talk bewerten nicht vergessen!