Zum Inhalt springen

Ratgeber

Echtzeit-Dashboards mit Laravel, Redis und WebSockets

· 6 Min. Lesezeit

Laravel kann Echtzeit-Dashboards über volumenstarke Datenströme betreiben, wenn Rohereignisse nie den Browser erreichen: Puffern Sie die Ingestion in Redis, verarbeiten Sie sie in Queue-Workern, voraggregieren Sie in Zeit-Buckets und senden Sie nur Zusammenfassungen über WebSockets. Lösen Sie Alarme über dynamische Schwellenwerte aus, die aus der jüngsten Historie gelernt werden, statt über feste Grenzen, und ergänzen Sie eine eigene Streaming-Plattform, wenn Anforderungen an Replay, Reihenfolge oder Volumen die Redis-Queues übersteigen.

Halten Sie Rohereignisse vom Browser fern

Der häufigste Fehler bei Echtzeit-Dashboards ist, jedes eingehende Ereignis an jeden verbundenen Bildschirm zu schicken. Bei hohem Volumen kommen die Browser nicht mehr hinterher, der WebSocket-Server ist ausgelastet, und das Diagramm wird ohnehin unlesbar.

Teilen Sie das System in vier Stufen: Ingestion, Verarbeitung, Aggregation und Broadcast. Jede Stufe hat ihre eigene Kapazität und kann langsamer werden, ohne die anderen mitzureißen. Das Dashboard erhält aggregierte Updates in festem Takt, etwa einmal pro Sekunde und Panel, keine Rohereignisse.

Unsere Entwickler haben diese Architektur bei Slump eingesetzt, einer Plattform für das Echtzeit-Monitoring von 5G-Netztrends, Kapazitätsindikatoren und Sättigungsprognosen für Betreiber in ganz Südspanien, gebaut auf einem Backend mit Laravel 11 und 12, das volumenstarke Streaming-Daten aufnimmt.

Puffern Sie die Ingestion, damit Traffic-Spitzen nicht zu Ausfällen werden

Der Ingestion-Endpoint sollte so wenig wie möglich tun: den Payload validieren, ihn an einen Puffer anhängen und antworten. Parsing, Anreicherung und Schreibvorgänge in die Datenbank gehören in die Worker.

Bei moderatem Volumen eignet sich Redis gut als Puffer. Legen Sie die Ereignisse in eine Redis-Liste oder einen Redis-Stream und lassen Sie die Worker sie in Batches abholen, denn ein gebündelter Insert ist für die Datenbank weit günstiger als Hunderte einzelner Zeilen-Inserts.

  • Validieren Sie das Schema und weisen Sie fehlerhafte Ereignisse schon am Eingang ab
  • Antworten Sie schnell und schreiben Sie innerhalb der Anfrage nie in die primäre Datenbank
  • Lesen Sie den Puffer in Batches statt ein Ereignis pro Job
  • Begrenzen Sie die Pufferlänge und lösen Sie einen Alarm aus, wenn er wächst, damit Rückstau sichtbar wird, bevor er zu Datenverlust führt

Skalieren Sie die Verarbeitung mit getrennten Queues und Horizon

Laravel-Queues auf Redis-Basis geben Ihnen Worker, die Sie horizontal hinzufügen können. Laravel Horizon zeigt pro Queue die Zahl der Worker, den Durchsatz und die Wartezeiten, und so prüfen Sie, ob die Verarbeitung mit der Ingestion Schritt hält.

Trennen Sie Queues nach Priorität. Die Auswertung von Alarmen sollte nie hinter einem Rückstau historischer Nachverarbeitung warten, also geben Sie Verarbeitung, Aggregation, Alarmierung und Exporten jeweils eigene Queues und Worker-Pools.

Machen Sie jeden Job idempotent. Streams liefern erneut aus, Worker stürzen mitten im Batch ab, und es kommt zu Wiederholungsversuchen: Die doppelte Verarbeitung desselben Ereignisses darf keinen Zähler verdoppeln. Oft genügt eine Ereigniskennung, die gegen ein kurzlebiges Redis-Set geprüft wird.

Aggregieren Sie in Zeit-Buckets, bevor Sie senden

Dashboards zeigen Raten, Durchschnitte, Perzentile und Trends, keine einzelnen Ereignisse. Berechnen Sie diese in den Workern in festen Zeit-Buckets, etwa pro Sekunde und pro Minute, für jede angezeigte Entität: eine Funkzelle, eine Region, einen Kunden.

Halten Sie die Live-Aggregate in Redis, in Hashes oder Sorted Sets mit dem Bucket als Schlüssel, und schreiben Sie jeden abgeschlossenen Bucket für die Historie in die Datenbank. Das Abfragedesign auf diesen Historientabellen ist genauso wichtig wie der Live-Pfad, denn Nutzer werden auf einen Tag oder eine Woche herauszoomen.

Bei Slump senkten eine Neugestaltung des Redis-Cachings und die Optimierung der Abfragen die Ingestion-Latenz, und genau das hielt die Live-Ansicht unter Last aktuell.

Senden Sie Zusammenfassungen über WebSockets, mit Reverb oder einem gehosteten Dienst

Laravel Broadcasting sendet Ereignisse an Kanäle, die das Frontend über Laravel Echo abonniert. Laravel Reverb ist der offizielle WebSocket-Server von Laravel, und gehostete Dienste wie Pusher oder Ably funktionieren über dieselbe Broadcasting-API.

  • Senden Sie zeitgesteuert aus dem aggregierten Zustand, nicht einmal pro eingehendem Ereignis
  • Nutzen Sie private Kanäle und autorisieren Sie jedes Abonnement auf dem Server, damit Nutzer nur die Entitäten sehen, die sie sehen dürfen
  • Senden Sie kompakte Snapshots oder Deltas, keine vollständigen Datensätze
  • Lassen Sie den Client bei einer Neuverbindung den aktuellen Zustand per HTTP laden und dann den Stream fortsetzen
  • Betreiben Sie mit wachsender Zahl von Verbindungen mehrere Reverb-Instanzen hinter einem Load Balancer, mit Redis Pub/Sub dazwischen

Alarmieren Sie über dynamische Schwellenwerte statt über feste Grenzen

Feste Schwellenwerte versagen bei Streaming-Metriken in beide Richtungen. Der Traffic um 3 Uhr morgens sieht völlig anders aus als um 20 Uhr, also schlägt ein einzelner Grenzwert entweder die ganze Nacht an oder übersieht Probleme am Tag.

Ein dynamischer Schwellenwert vergleicht jeden neuen Wert mit einer Basislinie, die aus der jüngsten Historie derselben Entität zur selben Zeit in der Woche gelernt wird. Eine einfache, erklärbare Variante führt einen gleitenden Mittelwert und eine Standardabweichung pro Entität und Wochenstunde und löst einen Alarm aus, wenn der Wert mehrere Buckets in Folge außerhalb dieses Bands liegt.

Bei Slump reduzierte die dynamische Anomalie-Alarmierung die manuelle Überwachung, denn die Betreiber wurden bei echten Abweichungen benachrichtigt, statt Bildschirme zu beobachten.

  • Verlangen Sie Beständigkeit, etwa drei aufeinanderfolgende Buckets außerhalb des Bands, um Rauschen zu reduzieren
  • Führen Sie pro Entität und Bedingung einen offenen Alarm, der aktualisiert statt wiederholt wird
  • Nehmen Sie in jeden Alarm den aktuellen Wert, die Basislinie, das Band und einen Link zum Panel auf
  • Überprüfen Sie regelmäßig stummgeschaltete und ignorierte Alarme und justieren Sie das Band nach

Erkennen Sie, wann Sie eine eigene Streaming-Technologie brauchen

Laravel mit Redis deckt viel ab, hat aber Grenzen. Ziehen Sie Kafka, Redpanda oder einen verwalteten Streaming-Dienst in Betracht, oft zusammen mit einem Stream-Prozessor wie Apache Flink, wenn Sie lange Aufbewahrung und Replay von Rohereignissen brauchen, eine strikte Reihenfolge pro Schlüssel über viele Consumer hinweg oder einen Durchsatz, bei dem der Redis-Speicher zum Engpass wird.

Der Umstieg muss nicht auf einmal geschehen. Behalten Sie Laravel für API, Dashboards, Alarmverwaltung und Broadcasting und setzen Sie den Stream vor die Aggregationsstufe. Wir bauen und erweitern Echtzeitsysteme dieser Art, von der Ingestion bis zu den Alarmregeln, auf die sich die Betreiber verlassen.

Das Wichtigste in Kürze

  • Streamen Sie nie Rohereignisse an Browser; senden Sie aggregierte Zusammenfassungen in festem Takt.
  • Halten Sie den Ingestion-Endpoint schlank und puffern Sie Ereignisse in Redis für die gebündelte Verarbeitung durch Worker.
  • Trennen Sie Queues nach Priorität und machen Sie jeden Job idempotent, damit Wiederholungen keine Zähler verfälschen.
  • Dynamische Schwellenwerte auf Basis der jüngsten Historie erzeugen weniger und nützlichere Alarme als feste Grenzen.
  • Ergänzen Sie Kafka oder eine ähnliche Plattform, wenn Sie Replay, strikte Reihenfolge oder Volumen jenseits von Redis brauchen, und behalten Sie Laravel für die Anwendungsschicht.

FAQ

Kann Laravel Echtzeit-Dashboards für große Datenmengen bewältigen?

Ja, wenn die Architektur schwere Arbeit aus dem Anfragepfad heraushält: ein schlanker Ingestion-Endpoint, ein Redis-Puffer, Queue-Worker, die in Zeit-Buckets aggregieren, und WebSocket-Broadcasts nur für Zusammenfassungen. Laravel bedient dann API, Dashboards und Alarmierung, während die Worker unabhängig skalieren.

Laravel Reverb oder Pusher für WebSockets?

Reverb ist der offizielle WebSocket-Server von Laravel und läuft auf Ihrer eigenen Infrastruktur, was zu Teams passt, die Kosten und Datenstandort selbst kontrollieren wollen. Pusher oder Ably nehmen Ihnen den Betrieb von WebSocket-Servern ab. Beide nutzen dieselbe Broadcasting-API von Laravel, sodass Sie später wechseln können.

Was ist ein dynamischer Schwellenwert im Monitoring?

Ein dynamischer Schwellenwert ist eine Alarmgrenze, die statt einer festen Zahl aus der jüngsten Historie derselben Metrik, derselben Entität und derselben Zeit in der Woche berechnet wird. Er passt sich an Tages- und Wochenmuster an, sodass Alarme bei echten Abweichungen auslösen statt bei normalen Spitzen.

Sagen Sie uns, was Sie brauchen.

Etwas zu entwickeln, Personen zu finden oder eine Frage zu klären. In einem 30-minütigen Gespräch hören wir zu und sagen Ihnen ehrlich, wie wir helfen können und was es dafür braucht.

Termin buchen

30 Minuten, auf Französisch oder Englisch. Kostenlos.

Lieber schreiben? Schicken Sie uns stattdessen eine kurze Anfrage.