- Vaša košarica je trenutno prazna
Node.js aplikacija z WebSocket, Socket.io in SSE
Obvestila v živo, prikaz napredka, sprotni izpis odgovorov AI modela, nadzorne plošče, ki se osvežujejo same: za vse to aplikacija potrebuje povezavo, ki ostane odprta. Najpogosteje se uporabljajo:
- WebSocket (in knjižnica Socket.io, ki temelji na njem): dvosmerna povezava med brskalnikom in strežnikom,
- SSE (Server-Sent Events): enosmerna povezava, po kateri strežnik pošilja dogodke brskalniku.
V Node.js aplikacijah na našem gostovanju delujeta oba, in sicer neposredno v aplikaciji, ustvarjeni v Setup Node.js App, brez dodatnih orodij. Preizkusili smo ju na paketih Zeleni in Turbo.
Kazalo
- WebSocket
- Socket.io
- SSE (Server-Sent Events)
- Ponovna povezava je obvezna
- Kaj je primerno za spletno gostovanje?
WebSocket
WebSocket omogoča dvosmerno komunikacijo med brskalnikom in strežnikom ter deluje brez posebnih nastavitev.
Primer s paketom ws in Expressom:
const express = require('express');
const http = require('http');
const { WebSocketServer } = require('ws');
const app = express();
const server = http.createServer(app);
const wss = new WebSocketServer({ server, path: '/api/ws' });
wss.on('connection', (ws) => {
ws.send('pozdravljeni');
ws.on('message', (msg) => ws.send(`prejel sem: ${msg}`));
});
server.listen(process.env.PORT || 3000);
V brskalniku:
const ws = new WebSocket(`wss://${location.host}/api/ws`);
Pot (/api/ws) mora vsebovati naslov iz polja Application URL, saj aplikacija prejme celotno pot.
Povezave WebSocket ostanejo odprte tudi, ko po njih dlje časa ne potuje noben podatek, in ne zasedajo mest za navadne zahtevke. V testu je ena aplikacija hkrati držala 300 odprtih povezav.
Socket.io
Socket.io omogoča komunikacijo v realnem času in samodejno ponovno povezovanje ob prekinitvi.
Primer uporabe z Expressom:
const { Server } = require('socket.io');
const io = new Server(server, { path: '/api/socket.io' });
io.on('connection', (socket) => {
socket.emit('pozdrav', 'pozdravljeni');
});
// v brskalniku
const socket = io({ path: '/api/socket.io' });
Če aplikacija ni v korenu domene ali poddomene, morate path nastaviti na strežniku in v brskalniku. Privzeta pot /socket.io/ vodi izven aplikacije in vrne napako 404.
Socket.io se najprej poveže prek običajnih zahtevkov in nato takoj preklopi na WebSocket. Če se povezava prekine, se sam znova poveže (v testu v 2 sekundah).
SSE (Server-Sent Events)
SSE deluje brez zamikov: dogodek pride do brskalnika v trenutku, ko ga pošljete. Upoštevajte pa dve pravili, sicer strežnik povezavo prekine:
- Takoj ob odprtju pošljite prvi podatek. Povezavo, po kateri 20 minut ne pride niti prvi bajt, strežnik zapre. Samo
res.flushHeaders()ne zadošča. - Vsaj vsako minuto pošljite heartbeat. Povezava, po kateri 2 minuti ne potuje noben podatek, se prekine. Priporočamo komentar
: pingvsakih 15–30 sekund.
app.get('/api/events', (req, res) => {
res.set({
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
});
// 1. prvi podatek takoj
res.write(': connected\n\n');
// 2. heartbeat
const ping = setInterval(() => res.write(': ping\n\n'), 25000);
let id = 0;
const timer = setInterval(() => {
res.write(`id: ${++id}\ndata: ${JSON.stringify({ cas: Date.now() })}\n\n`);
}, 5000);
req.on('close', () => { clearInterval(ping); clearInterval(timer); });
});
// v brskalniku
const es = new EventSource('/api/events');
es.onmessage = (e) => console.log(JSON.parse(e.data));
EventSource se po prekinitvi sam znova poveže in strežniku v glavi Last-Event-ID pošlje številko zadnjega prejetega dogodka.
Direktiva SetEnv noabort 1 v datoteki .htaccess na delovanje SSE nima vpliva in je ne potrebujete.
Koliko hkratnih SSE odjemalcev?
Vsaka odprta SSE povezava zaseda eno od 12 mest, ki jih ima aplikacija za hkratne zahtevke. Pri 12 odprtih SSE povezavah novi obiskovalci čakajo v vrsti. SSE je zato primeren za manjše število hkratnih uporabnikov (npr. administracijo ali prikaz napredka). Za več uporabnikov uporabite WebSocket ali Socket.io, ki te omejitve nimata.
Ponovna povezava je obvezna
Odprte povezave se prekinejo, ko:
- aplikacijo ponovno zaženete (RESTART, sprememba nastavitev ali spremenljivk okolja v Setup Node.js App, nova različica kode),
- poteka vzdrževanje spletnega strežnika.
Socket.io in EventSource se znova povežeta sama. Pri čistem WebSocketu mora ponovno povezavo izvesti vaša koda, na primer:
function povezi() {
const ws = new WebSocket(`wss://${location.host}/api/ws`);
ws.onclose = () => setTimeout(povezi, 2000);
}
povezi();
Kaj je primerno za spletno gostovanje?
Povezave v živo tehnično delujejo na vseh paketih z Node.js. Ker odprte povezave ves čas zasedajo sredstva paketa, za aplikacije, ki jih uporabljajo kot osnovno funkcijo, priporočamo Turbo gostovanje, ki ima več pomnilnika, procesorskih jeder in sočasnih procesov.
Primerno:
- obvestila in posodobitve v živo za manjše število uporabnikov,
- prikaz napredka obdelave, sprotni izpis odgovorov AI modela,
- nadzorne plošče in administracija.
Ni primerno:
- javne klepetalnice (chat strežniki) in spletne igre,
- aplikacije z neprekinjeno porabo procesorja,
- večje število sočasnih stalnih povezav.
Za take projekte priporočamo VPS strežnik, kjer imate na voljo celoten strežnik in poljubne nastavitve.
KOMENTIRAJTE OBJAVO
Vaš komentar je bil uspešno oddan
Komentar bo viden na strani, ko ga naši moderatorji potrdijo.