SSE über Postgres LISTEN/NOTIFY
Benachrichtigungen erreichen offene Tabs sofort — ohne Redis, ohne externen Dienst, ohne Polling. Die Datenbank, die ohnehin läuft, übernimmt das Pub/Sub.
Warum so?
Polling hätte bei jedem Client dauerhaft Last erzeugt, ein externer Broker wäre ein zusätzlicher Dienst mit eigenen Kosten und Ausfallmodi gewesen. Postgres kann LISTEN/NOTIFY nativ. Eine dedizierte Verbindung pro Node-Prozess hört auf den Kanal und verteilt die Events an alle verbundenen SSE-Streams. Das Muster ist damit bereits horizontal skalierbar, obwohl aktuell nur ein Knoten läuft.
// One persistent LISTEN socket per Node process —// sql.listen() uses a dedicated connection, not the pool.await sql.listen(CHANNEL, (payload) => { const parsed = JSON.parse(payload) as StreamEvent if (parsed.userId) publish(parsed.userId, parsed)}) export async function notifyUser(event: StreamEvent) { await sql.notify(CHANNEL, JSON.stringify(event))}








