Architektur und Entwicklung einer Support-Platform mit Telefonie- und Videofunktion mit Fokus auf Entkopplung der einzelnen Komponenten (PHP/Symfony API, Node.js Realtime/Websocket Server, HTML5 Frontend und RabbitMQ als verbindender Message Bus)
Events ‣ Agent ändert seinen Status ‣ Session wird gestartet, verlängert oder beendet ‣ Fehler- / Ausnahnmefälle ‣ Event-Propagierung an mehrere Komponenten ‣ Frontend, Stats, Chat-Server, Tech-Support etc.
& Symfony 2.1 ‣ RESTful API zur "Annahme" von Events ‣ MySQL DB für "historische" Daten ‣ Redis Key-Value Store für Livedaten und Statistiken ‣ RabbitMQ zur Event-Propagierung
dem Frontend ‣ Websockets (Socket.io) ‣ Permanente Verbindung zum RabbitMQ ‣ Frontend ‣ Backbone.js App ‣ Kommuniziert ausschließlich mit Node.js Server ‣ d.h. keine sonstigen Abhängigkeiten
Node.js als Alternative ‣ OpenSource (MIT License) ‣ Entwickelt von Ryan Dahl / Joyent (2009) ‣ Basierend auf Googles V8 Javascript Engine ‣ Event-driven, non-blocking I/O ‣ Scalable by design ‣ Socket.io für WebSockets
‣ Service-App legt einen Eintrag für den Agent im Online-Pool (Redis) an ‣ Service-App published eine Nachricht ans RabbitMQ ‣ RabbitMQ verteilt die Nachricht per Fanout an alle verbundenen Queues ‣ Node.js Server konsumiert die Nachricht aus dem RabbitMQ ‣ Node.js Server schickt die Information per WebSockets ans Frontend ‣ Frontend updatet seine HTML-Darstellung
wenig Logik im zentralen Service ‣ "App-Silos" ‣ Belohnung ‣ Schnellere Iteration ‣ Vermeidung/Verringerung von Regressionen ‣ Einfachere Wart- und Testbarkeit
Sorted Sets für Session-Duration per Agent ‣ Live-Statistiken ohne "hohe Kosten" ‣ Real-time Gewichtung für Sortierung im Frontend ‣ Regelmäßige Archivierung in MySQL-Table ‣ z.B. stündlich, täglich, wöchentlich, monatlich etc.
Keine doppelten Elemente ‣ Built-in Scoring ‣ Commands für Rankings ‣ Update nach jeder erfolgreichen Session ‣ Nur eine Metrik von vielen Agent 1 Agent 2 Agent 4 Agent 3 100 200 250 300 stats:agents:durations
RabbitMQ ‣ Broadcasting an alle verbundenen Clients ‣ Unidirektionale Kommunikation (derzeit) ‣ Benchmark: ~ 9000 - 10000 concurrent Connections pro Server ‣ Neue Server-Instanz <-> Neuer Worker für Queue(s) ‣ Lastverteilung ‣ HAProxy, ldirectord etc.
HTML & CSS ‣ Installation / Konfiguration = trivial ‣ Eat your own dog food ‣ n Frontends statt einem Frontend ‣ Generiert aus einer einzigen Codebase ‣ Maintenance win!
Queues und Messages (default) ‣ "Mirrored Queues" ‣ "Iterative" Synchronisierung für neue Slaves ‣ Explizite Sychronisierung möglich, lockt aber die zu synchronisierende Queue
/ Partitioning Limitierungen ‣ Operationen mit mehr als einem Key problematisch ‣ Kein Support für Transactions mit mehreren Keys ‣ Client-seitiges Partitioning auf Kosten von Performance ‣ Hinzufügen von neuen Nodes nicht trivial ‣ ...bis unöglich bei Client-seitigem Partitioning ‣ Presharding als Workaround