Ugrás a tartalomra

Útmutatók

Valós idejű dashboardok: Laravel, Redis és WebSockets

· 6 perc olvasás

A Laravel képes nagy volumenű adatfolyamok fölött valós idejű dashboardokat kiszolgálni, ha a nyers események soha nem jutnak el a böngészőig: pufferelje a betöltést Redisben, dolgozza fel sorba állított workerekkel, előre aggregálja időrekeszekbe, és WebSocketeken keresztül csak összesítéseket küldjön ki. Rögzített határértékek helyett a közelmúlt adataiból tanult dinamikus küszöbökre riasszon, és vezessen be dedikált streamingplatformot, amikor a visszajátszás, a sorrend vagy a volumen igényei kinövik a Redis-alapú sorokat.

Tartsa távol a nyers eseményeket a böngészőtől

A valós idejű dashboardok leggyakoribb hibája, hogy minden beérkező eseményt minden csatlakozott képernyőre kiküldenek. Nagy volumennél a böngészők lemaradnak, a WebSocket-szerver telítődik, és a grafikon amúgy is olvashatatlanná válik.

Ossza a rendszert négy szakaszra: betöltés, feldolgozás, aggregálás és kiküldés. Mindegyik szakasznak saját kapacitása van, és lelassulhat anélkül, hogy a többit is magával rántaná. A dashboard nem nyers eseményeket, hanem aggregált frissítéseket kap rögzített ütemben, például panelenként másodpercenként egyszer.

Mérnökeink ezt a felépítést alkalmazták a Slump platformon, amely dél-spanyolországi operátorok számára valós időben figyeli az 5G-hálózati trendeket és a kapacitásmutatókat, és előrejelzi a telítődést. A platform Laravel 11 és 12 alapú backendje nagy volumenű streamingadatokat tölt be.

Puffereljen a betöltésnél, hogy a forgalmi csúcsokból ne legyen leállás

A betöltési végpont a lehető legkevesebbet tegye: validálja az adatcsomagot, fűzze hozzá egy pufferhez, és térjen vissza. Az elemzés, a dúsítás és az adatbázisba írás a workerek dolga.

Mérsékelt volumennél a Redis jól működik pufferként. Tegye az eseményeket egy Redis-listába vagy -streambe, és a workerek kötegekben vegyék ki őket, mert egyetlen kötegelt beszúrás sokkal olcsóbb az adatbázisnak, mint több száz egysoros beszúrás.

  • Validálja a sémát, és a hibás eseményeket már a peremen utasítsa el
  • Válaszoljon gyorsan, és a kérésen belül soha ne írjon az elsődleges adatbázisba
  • A pufferből kötegekben olvasson, ne feladatonként egy eseményt
  • Korlátozza a puffer hosszát, és riasszon, ha nő, hogy a visszatorlódás (backpressure) látható legyen, mielőtt adatvesztés lesz belőle

Skálázza a feldolgozást külön sorokkal és a Horizonnal

A Redisre épülő Laravel-sorok vízszintesen bővíthető workereket adnak. A Laravel Horizon soronként mutatja a workerek számát, az áteresztőképességet és a várakozási időket, így ellenőrizheti, hogy a feldolgozás lépést tart-e a betöltéssel.

Válassza szét a sorokat prioritás szerint. A riasztások kiértékelése soha ne várjon egy történeti újrafeldolgozásból eredő torlódás mögött, ezért a feldolgozás, az aggregálás, a riasztás és az exportok kapjanak saját sorokat és workerkészleteket.

Legyen minden feladat idempotens. A streamek újrakézbesítenek, a workerek köteg közben összeomlanak, és vannak újrapróbálkozások, ezért ugyanannak az eseménynek a kétszeri feldolgozása nem duplázhat meg egy számlálót. Gyakran elég egy eseményazonosító, amelyet egy rövid életű Redis-halmazban ellenőriz.

Aggregáljon időrekeszekbe, mielőtt kiküldi az adatokat

A dashboardok arányokat, átlagokat, percentiliseket és trendeket mutatnak, nem egyedi eseményeket. Ezeket a workerekben számolja ki rögzített időrekeszekbe, például másodpercenként és percenként, minden megjelenített entitásra: egy cellára, egy régióra, egy ügyfélre.

Az élő aggregátumokat tartsa Redisben, rekeszenként kulcsolt hashekben vagy rendezett halmazokban, és minden lezárt rekeszt írjon az adatbázisba a történeti adatokhoz. A történeti táblák lekérdezéseinek tervezése ugyanolyan fontos, mint az élő útvonal, mert a felhasználók napi vagy heti nézetre is váltanak.

A Slumpnál a Redis-gyorsítótárazás újratervezése és a lekérdezések optimalizálása csökkentette a betöltési késleltetést, és ez tartotta naprakészen az élő nézetet terhelés alatt.

Összesítéseket küldjön WebSocketeken, Reverbbel vagy hosztolt szolgáltatással

A Laravel broadcasting csatornákra küld eseményeket, amelyekre a frontend a Laravel Echón keresztül iratkozik fel. A Laravel Reverb a Laravel saját WebSocket-szervere, és a hosztolt szolgáltatások, például a Pusher vagy az Ably, ugyanazon a broadcasting API-n keresztül működnek.

  • Időzítő alapján, az aggregált állapotból küldjön, ne minden beérkező eseménynél
  • Használjon privát csatornákat, és minden feliratkozást a szerveren engedélyezzen, hogy a felhasználók csak azokat az entitásokat lássák, amelyeket láthatnak
  • Tömör pillanatképeket vagy változásokat (deltákat) küldjön, ne teljes adathalmazokat
  • Újracsatlakozáskor a kliens HTTP-n töltse be az aktuális állapotot, majd folytassa a streamet
  • A kapcsolatok számának növekedésével futtasson több Reverb-példányt egy terheléselosztó mögött, köztük Redis pub/subbal

Rögzített határértékek helyett dinamikus küszöbökre riasszon

Streamingmetrikáknál a rögzített küszöbök mindkét irányban kudarcot vallanak. Hajnali 3-kor a forgalom egészen másképp néz ki, mint este 8-kor, így egyetlen határérték vagy egész éjjel riaszt, vagy nappal nem veszi észre a problémákat.

A dinamikus küszöb minden új értéket egy alapvonalhoz hasonlít, amelyet ugyanannak az entitásnak a közelmúltbeli adataiból tanult, a hét ugyanazon időszakára. Egy egyszerű, megmagyarázható változat entitásonként és a hét minden órájára gördülő átlagot és szórást tart nyilván, és riaszt, ha az érték több egymást követő rekeszen át a sávon kívül marad.

A Slumpnál a dinamikus anomáliariasztás csökkentette a kézi figyelést, mert az operátorokat valódi eltéréseknél riasztották, és nem kellett folyamatosan a képernyőket nézniük.

  • Követeljen meg tartósságot, például három egymást követő sávon kívüli rekeszt, a zaj csökkentésére
  • Entitásonként és feltételenként egy nyitott riasztás legyen, amelyet frissítenek, nem ismételnek
  • Minden riasztásban szerepeljen az aktuális érték, az alapvonal, a sáv és egy link a panelhez
  • Rendszeresen nézze át az elnémított és figyelmen kívül hagyott riasztásokat, és hangolja a sávot

Tudja, mikor érdemes dedikált streamingtechnológiát bevezetni

A Laravel és a Redis sok mindent lefed, de vannak korlátai. Fontolja meg a Kafkát, a Redpandát vagy egy menedzselt streamingszolgáltatást, gyakran egy streamfeldolgozóval, például az Apache Flinkkel együtt, ha a nyers események hosszú megőrzésére és visszajátszására, kulcsonként szigorú sorrendre sok fogyasztón át, vagy olyan áteresztőképességre van szüksége, amelynél a Redis memóriája válik szűk keresztmetszetté.

Az átállásnak nem kell egyszerre megtörténnie. Tartsa meg a Laravelt az API-hoz, a dashboardokhoz, a riasztáskezeléshez és a kiküldéshez, a streamet pedig tegye az aggregálási szakasz elé. Ilyen felépítésű valós idejű rendszereket építünk és bővítünk, a betöltéstől azokig a riasztási szabályokig, amelyekre az operátorok támaszkodnak.

A legfontosabbak

  • Soha ne streameljen nyers eseményeket a böngészőkbe; aggregált összesítéseket küldjön rögzített ütemben.
  • A betöltési végpont maradjon vékony, az eseményeket pedig pufferelje Redisben, hogy a workerek kötegekben dolgozzák fel őket.
  • Válassza szét a sorokat prioritás szerint, és legyen minden feladat idempotens, hogy az újrapróbálkozások ne rontsák el a számlálókat.
  • A közelmúlt adataira épülő dinamikus küszöbök kevesebb, de hasznosabb riasztást adnak, mint a rögzített határértékek.
  • Vezessen be Kafkát vagy hasonló platformot, ha visszajátszásra, szigorú sorrendre vagy a Redis képességein túli volumenre van szüksége, az alkalmazásréteghez pedig tartsa meg a Laravelt.

GYIK

Elbírja a Laravel a nagy volumenű adatok valós idejű dashboardjait?

Igen, ha az architektúra távol tartja a nehéz munkát a kérések útvonalától: vékony betöltési végpont, Redis-puffer, időrekeszekbe aggregáló, sorba állított workerek, és WebSocketen csak összesítések kiküldése. A Laravel ekkor az API-t, a dashboardokat és a riasztást szolgálja ki, a workerek pedig tőle függetlenül skálázódnak.

Laravel Reverb vagy Pusher a WebSocketekhez?

A Reverb a Laravel saját WebSocket-szervere, és a saját infrastruktúráján fut, ami azoknak a csapatoknak való, amelyek kézben akarják tartani a költségeket és az adatok helyét. A Pusher vagy az Ably leveszi a válláról a WebSocket-szerverek üzemeltetésének munkáját. Mindkettő ugyanazt a Laravel broadcasting API-t használja, így később válthat.

Mi az a dinamikus küszöb a monitorozásban?

A dinamikus küszöb olyan riasztási határérték, amelyet nem rögzített számként adnak meg, hanem ugyanannak a metrikának, entitásnak és heti időszaknak a közelmúltbeli adataiból számolnak. Alkalmazkodik a napi és heti mintázatokhoz, így a riasztások valódi eltéréseknél szólalnak meg, nem a normál csúcsoknál.

Mondja el, mire van szüksége.

Valami, amit meg kell építeni, emberek, akiket meg kell találni, vagy egy kérdés, amire választ keres. Egy 30 perces hívásban meghallgatjuk, és őszintén megmondjuk, miben segíthetünk, és mi kellene hozzá.