Zpět na domů

SSE notifikace v SPA: reálný čas bez pollingu

Článek popisuje architekturu asynchronních notifikací v SPA na bázi SSE a Mercure. Integrace s CDC pro sledování změn DB, opětovné použití OpenAPI schémat pro typizaci. Příklady kódu a schémata pro vývojáře.

Push-notifikace SSE v SPA: architektura a kód
Advertisement 728x90

Asynchronní aktualizace dat v SPA pomocí SSE a Mercure

Frontendové aplikace vyžadují neustálou aktualizaci dat, aby odrážely změny na backendu. Standardní API dotazy zachycují stav v době odpovědi, ale backend dále zpracovává události: doplňování zůstatků, moderaci obsahu, odpovědi podpory. K řešení se používají push mechanismy založené na SSE, integrované s existující OpenAPI specifikací.

Systém kombinuje pull přístup (periodické dotazy) s push (oznámení v reálném čase). SSE zajišťuje jednosměrný tok událostí přes HTTP/2, což minimalizuje zátěž ve srovnání s pollingem.

Scénáře použití asynchronních oznámení

Asynchronní oznámení jsou klíčová v obchodních procesech:

Google AdInline article slot
  • Doplnění zůstatku: zobrazení aktuálního stavu pro okamžitý nákup.
  • Moderace obsahu: aktualizace stavu po kontrole.
  • Odpovědi podpory: okamžité upozornění na nový ticket.

V typickém případě uživatel – inzerent nebo vykonavatel – sleduje čítače žádostí: počet vyžadujících akci, nepřečtených komentářů, kontrol umístění. Tato data jsou dostupná přes API endpoint /rest/User/info (operationId: getInfo).

/rest/User/info:
  get:
    tags:
      - User
    summary: Vrací informace o aktuálním uživateli
    operationId: getInfo
    responses:
      200:
        description: Informace o aktuálním uživateli
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: integer
                  format: int32
                  minimum: 0
                locale:
                  type: string
                  enum: [ru, en]
                login:
                  type: string
                  minimum: 3
                  maximum: 320
                seoCounters:
                  $ref: '#/components/schemas/SeoCounters'

Schéma SeoCounters definuje strukturu:

SeoCounters:
  type: object
  properties:
    nofRequests:
      type: integer
      format: int32
      minimum: 0
    nofLinksStatusNeedApprove:
      type: integer
      format: int32
      minimum: 0
    nofLinksWithUnreadComments:
      type: integer
      format: int32
      minimum: 0
    nofChanges:
      type: integer
      format: int32
      minimum: 0
    nofPlacementCheck:
      type: integer
      format: int32
      minimum: 0

Integrace CDC a Data Platform

Změny v tabulce user_counters jsou sledovány přes CDC (Change Data Capture). Proud modifikací je předáván do Data Platform – korporátního ETL systému. Odtud jsou události pushovány do UI přes SSE hub.

Google AdInline article slot

Architektura používá hexagonální model: OpenAPI specifikace automaticky generuje REST adaptéry a TypeScript typy. Pro frontend typy vypadají takto:

/* Generated by orval */
export interface SeoCounters {
  nofRequests?: number;
  nofLinksStatusNeedApprove?: number;
  nofLinksWithUnreadComments?: number;
  nofChanges?: number;
  nofPlacementCheck?: number;
}

export type GetInfo200 = {
  id: number;
  locale: 'ru' | 'en';
  login: string;
  seoCounters?: SeoCounters;
};

Tyto typy jsou znovu použity pro zpracování SSE událostí, což zajišťuje typovou bezpečnost.

Implementace SSE v aplikaci

SSE (Server-Sent Events) – standard pro serverové pushy, podporovaný prohlížeči. EventSource se připojuje k endpointu:

Google AdInline article slot
const evtSource = new EventSource('/sse-endpoint', {
  withCredentials: true,
});

evtSource.onmessage = (event) => {
  const data = JSON.parse(event.data);
  // Aktualizace store s typizovanými daty
  updateSeoCounters(data.seoCounters);
};

Pro autorizaci, témata a škálování se používá Mercure – open-source hub na SSE. Hub přijímá publikace přes REST s JWT a rozesílá odběratelům.

Příklad publikace:

curl -d 'topic=https://example.com/books/1' \
     -d 'data={"foo": "updated value"}' \
     -H 'Authorization: Bearer <JWT>' \
     -X POST https://hub/.well-known/mercure

JWT definuje práva na publish/subscribe podle témat. Mercure je nasazen jako kontejner s externí databází, integruje se s CDC proudy.

Výhody přístupu

  • Znovupoužití schémat: OpenAPI struktury jsou použity v pull i push bez duplikace.
  • Reálný čas: Změny se odrážejí okamžitě bez polling.
  • Škálovatelnost: Mercure hub distribuuje zátěž.

Seznam klíčových čítačů pro monitorování:

  • nofRequests – žádosti o akci.
  • nofLinksStatusNeedApprove – odkazy na potvrzení.
  • nofLinksWithUnreadComments – nepřečtené komentáře.
  • nofPlacementCheck – kontroly umístění.

Co je důležité

  • SSE s Mercure zajišťuje typizovaná push oznámení bez WebSocket obalů.
  • CDC zachycuje změny databáze v reálném čase pro ETL procesy.
  • Autogenerace TypeScript typů z OpenAPI garantuje konzistenci dat.
  • Přístup se škáluje pro high-load systémy s tisíci uživateli.
  • JWT v Mercure spravuje přístup k tématům oznámení.

— Editorial Team

Advertisement 728x90

Číst dál