Vortrag auf der Symfony UG Frankfurt zum Thema "Asychrone Event Verarbeitung" mit Symfony2 und RabbitMQ im Speziellen. Wir zeigen hier die Vor- und Nachteil, sowie einige Best Practices und Erfahrungswerte.
Reaktionszeit verkürzen • Verlagerung von Last • Microservices • Parallelisierung von Prozessen • Skalierbarkeit • Austausch von Nachrichten mit anderen (Sub-)Systemen
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)
Message Queuing Protocol) • Offenes, aber binäres Netzwerkprotokoll • Routing, Verteilen von Messages, etc. • Transaktionen • Weitere tolle Features ◦ TTL ◦ DLX (Dead Letter eXchange) ◦ PreFetching
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
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!)
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
◦ 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)
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.
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)