Eesti

Uurige reaalajas andmevoogu Socket.IO abil, hõlmates seadistamist, rakendamist, skaleerimist ja parimaid tavasid globaalsete rakenduste jaoks.

Reaalajas andmevoog: Socket.IO rakendamise juhend

Tänapäeva kiires digitaalses maastikus on reaalajas andmevoog ülioluline rakenduste jaoks, mis nõuavad koheseid uuendusi ja sujuvat suhtlust. Alates reaalajas vestlusrakendustest kuni reaalajas analüütika armatuurlaudadeni – võime edastada andmeid silmapilkselt parandab kasutajakogemust ja annab konkurentsieelise. Socket.IO, populaarne JavaScripti teek, lihtsustab reaalajas kahesuunalise suhtluse rakendamist veebiklientide ja serverite vahel. See põhjalik juhend juhatab teid läbi reaalajas andmevoo seadistamise ja rakendamise protsessi, kasutades Socket.IO-d, hõlmates olulisi kontseptsioone, praktilisi näiteid ja parimaid tavasid globaalsete rakenduste jaoks.

Mis on reaalajas andmevoog?

Reaalajas andmevoog hõlmab andmete pidevat ja hetkelist edastamist andmeallikast sihtkohta ilma olulise viivituseta. Erinevalt traditsioonilistest päring-vastus mudelitest, kus kliendid peavad korduvalt uuendusi küsima, võimaldab reaalajas voogedastus serveritel saata andmeid klientidele kohe, kui need on saadaval. See lähenemine on oluline rakenduste jaoks, mis nõuavad sekunditäpsusega teavet, näiteks:

Reaalajas andmevoo eelised on järgmised:

Socket.IO tutvustus

Socket.IO on JavaScripti teek, mis võimaldab reaalajas, kahesuunalist ja sündmuspõhist suhtlust veebiklientide ja serverite vahel. See abstraheerib aluseks olevate transpordiprotokollide, näiteks WebSocketsi, keerukuse ja pakub lihtsat ning intuitiivset API-d reaalajas rakenduste loomiseks. Socket.IO töötab, luues püsiva ühenduse kliendi ja serveri vahel, mis võimaldab mõlemal poolel andmeid reaalajas saata ja vastu võtta.

Socket.IO peamised omadused on järgmised:

Socket.IO projekti seadistamine

Socket.IO-ga alustamiseks peab teie süsteemi olema installitud Node.js ja npm (Node Package Manager). Järgige neid samme, et seadistada lihtne Socket.IO projekt:

1. Looge projektikataloog

Looge oma projektile uus kataloog ja navigeerige sinna:

mkdir socketio-example
cd socketio-example

2. Initsialiseerige Node.js projekt

Initsialiseerige uus Node.js projekt, kasutades npm-i:

npm init -y

3. Installige Socket.IO ja Express

Installige sõltuvustena Socket.IO ja Express, populaarne Node.js veebiraamistik:

npm install socket.io express

4. Looge serveripoolne kood (index.js)

Looge fail nimega `index.js` ja lisage järgmine kood:

const express = require('express');
const http = require('http');
const { Server } = require("socket.io");

const app = express();
const server = http.createServer(app);
const io = new Server(server);

const port = 3000;

app.get('/', (req, res) => {
 res.sendFile(__dirname + '/index.html');
});

io.on('connection', (socket) => {
 console.log('Kasutaja ühendus');

 socket.on('disconnect', () => {
 console.log('Kasutaja lahkus');
 });

 socket.on('chat message', (msg) => {
 io.emit('chat message', msg); // Levitab sõnumi kõikidele ühendatud klientidele
 console.log('sõnum: ' + msg);
 });
});

server.listen(port, () => {
 console.log(`Server kuulab pordil ${port}`);
});

See kood seadistab Expressi serveri ja integreerib Socket.IO. See kuulab sissetulevaid ühendusi ja tegeleb sündmustega nagu 'connection', 'disconnect' ja 'chat message'.

5. Looge kliendipoolne kood (index.html)

Looge samasse kataloogi fail nimega `index.html` ja lisage järgmine kood:




 Socket.IO vestlus
 


 

    See HTML-fail seadistab lihtsa vestlusliidese sisestusväljaga sõnumite saatmiseks ja nimekirjaga vastuvõetud sõnumite kuvamiseks. See sisaldab ka Socket.IO klienditeeki ja JavaScripti koodi sõnumite saatmise ja vastuvõtmise käsitlemiseks.

    6. Käivitage rakendus

    Käivitage Node.js server, käivitades oma terminalis järgmise käsu:

    node index.js

    Avage oma veebibrauser ja navigeerige aadressile `http://localhost:3000`. Peaksite nägema vestlusliidest. Avage mitu brauseriakent või vahekaarti, et simuleerida mitut kasutajat. Tippige ühes aknas sõnum ja vajutage Enter; peaksite nägema, et sõnum ilmub reaalajas kõikides avatud akendes.

    Socket.IO põhimõisted

    Tugevate ja skaleeritavate reaalajas rakenduste loomiseks on oluline mõista Socket.IO põhimõisteid.

    1. Ühendused

    Ühendus esindab püsivat lüli kliendi ja serveri vahel. Kui klient ühendub Socket.IO abil serveriga, luuakse nii kliendil kui ka serveril unikaalne pesaobjekt. Seda pesaobjekti kasutatakse omavaheliseks suhtlemiseks.

    // Serveripoolne
    io.on('connection', (socket) => {
     console.log('Kasutaja ühendus pesa ID-ga: ' + socket.id);
    
     socket.on('disconnect', () => {
     console.log('Kasutaja lahkus');
     });
    });
    
    // Kliendipoolne
    var socket = io();

    2. Sündmused

    Sündmused on peamine mehhanism andmete vahetamiseks klientide ja serveri vahel. Socket.IO kasutab sündmuspõhist API-d, mis võimaldab teil määratleda kohandatud sündmusi ja seostada neid konkreetsete toimingutega. Kliendid saavad serverile sündmusi edastada ja server saab klientidele sündmusi edastada.

    // Serveripoolne
    io.on('connection', (socket) => {
     socket.on('custom event', (data) => {
     console.log('Vastuvõetud andmed:', data);
     socket.emit('response event', { message: 'Andmed vastu võetud' });
     });
    });
    
    // Kliendipoolne
    socket.emit('custom event', { message: 'Tere kliendilt' });
    
    socket.on('response event', (data) => {
     console.log('Vastuvõetud vastus:', data);
    });

    3. Levitamine (Broadcasting)

    Levitamine võimaldab teil saata andmeid mitmele ühendatud kliendile korraga. Socket.IO pakub erinevaid levitamisvõimalusi, näiteks andmete saatmine kõikidele ühendatud klientidele, andmete saatmine kindlas ruumis olevatele klientidele või andmete saatmine kõikidele klientidele peale saatja.

    // Serveripoolne
    io.on('connection', (socket) => {
     socket.on('new message', (msg) => {
     // Levitab kõikidele ühendatud klientidele
     io.emit('new message', msg);
    
     // Levitab kõikidele klientidele peale saatja
     socket.broadcast.emit('new message', msg);
     });
    });

    4. Ruumid

    Ruumid on viis klientide grupeerimiseks ja andmete saatmiseks ainult kindlas ruumis olevatele klientidele. See on kasulik stsenaariumide puhul, kus peate sihtima konkreetseid kasutajagruppe, näiteks vestlusruume või online-mängusessioone. Kliendid saavad dünaamiliselt ruumidega liituda või neist lahkuda.

    // Serveripoolne
    io.on('connection', (socket) => {
     socket.on('join room', (room) => {
     socket.join(room);
     console.log(`Kasutaja ${socket.id} liitus ruumiga ${room}`);
    
     // Saada sõnum kõikidele ruumis olevatele klientidele
     io.to(room).emit('new user joined', `Kasutaja ${socket.id} liitus ruumiga`);
     });
    
     socket.on('send message', (data) => {
     // Saada sõnum kõikidele ruumis olevatele klientidele
     io.to(data.room).emit('new message', data.message);
     });
    
     socket.on('leave room', (room) => {
     socket.leave(room);
     console.log(`Kasutaja ${socket.id} lahkus ruumist ${room}`);
     });
    });
    
    // Kliendipoolne
    socket.emit('join room', 'room1');
    socket.emit('send message', { room: 'room1', message: 'Tere ruumist room1' });
    
    socket.on('new message', (message) => {
     console.log('Vastuvõetud sõnum:', message);
    });

    5. Nimeruumid

    Nimeruumid võimaldavad teil multipleksida ühte TCP-ühendust mitmel eesmärgil, jagades oma rakenduse loogika üle ühe jagatud alusühenduse. Mõelge neist kui eraldi virtuaalsetest "pesadest" sama füüsilise pesa sees. Te võite kasutada ühte nimeruumi vestlusrakenduse ja teist mängu jaoks. See aitab hoida suhtluskanalid organiseeritud ja skaleeritavana.

    //Serveripoolne
    const chatNsp = io.of('/chat');
    
    chatNsp.on('connection', (socket) => {
     console.log('keegi ühendus vestlusega');
     // ... sinu vestluse sündmused ...
    });
    
    const gameNsp = io.of('/game');
    
    gameNsp.on('connection', (socket) => {
     console.log('keegi ühendus mänguga');
     // ... sinu mängu sündmused ...
    });
    
    //Kliendipoolne
    const chatSocket = io('/chat');
    const gameSocket = io('/game');
    
    chatSocket.emit('chat message', 'Tere vestlusest!');
    gameSocket.emit('game action', 'Mängija liikus!');

    Reaalajas funktsioonide rakendamine Socket.IO-ga

    Uurime, kuidas rakendada mõningaid levinud reaalajas funktsioone Socket.IO abil.

    1. Reaalajas vestlusrakenduse loomine

    Varem loodud lihtne vestlusrakendus demonstreerib reaalajas vestluse põhiprintsiipe. Selle täiustamiseks saate lisada funktsioone nagu:

    Siin on näide kirjutamisindikaatorite lisamisest:

    // Serveripoolne
    io.on('connection', (socket) => {
     socket.on('typing', (username) => {
     // Levitab kõikidele klientidele peale saatja
     socket.broadcast.emit('typing', username);
     });
    
     socket.on('stop typing', (username) => {
     // Levitab kõikidele klientidele peale saatja
     socket.broadcast.emit('stop typing', username);
     });
    });
    
    // Kliendipoolne
    input.addEventListener('input', () => {
     socket.emit('typing', username);
    });
    
    input.addEventListener('blur', () => {
     socket.emit('stop typing', username);
    });
    
    socket.on('typing', (username) => {
     typingIndicator.textContent = `${username} kirjutab...`;
    });
    
    socket.on('stop typing', () => {
     typingIndicator.textContent = '';
    });

    2. Reaalajas analüütika armatuurlaua loomine

    Reaalajas analüütika armatuurlauad kuvavad ajakohaseid mõõdikuid ja trende, pakkudes väärtuslikku teavet ettevõtte tulemuslikkuse kohta. Saate kasutada Socket.IO-d andmete voogesitamiseks andmeallikast armatuurlauale reaalajas.

    Siin on lihtsustatud näide:

    // Serveripoolne
    const data = {
     pageViews: 1234,
     usersOnline: 567,
     conversionRate: 0.05
    };
    
    setInterval(() => {
     data.pageViews += Math.floor(Math.random() * 10);
     data.usersOnline += Math.floor(Math.random() * 5);
     data.conversionRate = Math.random() * 0.1;
    
     io.emit('dashboard update', data);
    }, 2000); // Väljastab andmeid iga 2 sekundi järel
    
    // Kliendipoolne
    socket.on('dashboard update', (data) => {
     document.getElementById('pageViews').textContent = data.pageViews;
     document.getElementById('usersOnline').textContent = data.usersOnline;
     document.getElementById('conversionRate').textContent = data.conversionRate.toFixed(2);
    });

    3. Koostööl põhineva redigeerimistööriista arendamine

    Koostööl põhinevad redigeerimistööriistad võimaldavad mitmel kasutajal samaaegselt dokumente või koodi redigeerida. Socket.IO-d saab kasutada muudatuste sünkroonimiseks kasutajate vahel reaalajas.

    Siin on lihtne näide:

    // Serveripoolne
    io.on('connection', (socket) => {
     socket.on('text change', (data) => {
     // Levitab muudatused kõikidele teistele samas ruumis olevatele klientidele
     socket.broadcast.to(data.room).emit('text change', data.text);
     });
    });
    
    // Kliendipoolne
    textarea.addEventListener('input', () => {
     socket.emit('text change', { room: roomId, text: textarea.value });
    });
    
    socket.on('text change', (text) => {
     textarea.value = text;
    });

    Socket.IO rakenduste skaleerimine

    Kui teie Socket.IO rakendus kasvab, peate arvestama skaleeritavusega. Socket.IO on loodud skaleeritavaks, kuid suure hulga samaaegsete ühenduste haldamiseks peate rakendama teatud strateegiaid.

    1. Horisontaalne skaleerimine

    Horisontaalne skaleerimine hõlmab teie rakenduse jaotamist mitme serveri vahel. Seda saab saavutada koormuse jaoturi abil, mis jaotab sissetulevad ühendused saadaolevate serverite vahel. Socket.IO-ga peate siiski tagama, et kliendid suunatakse järjepidevalt samasse serverisse kogu nende ühenduse kestuse vältel. See on tingitud sellest, et Socket.IO tugineb ühenduse oleku säilitamiseks mälus olevatele andmestruktuuridele. Tavaliselt on vaja kasutada kleepuvaid seansse/seansi afiinsust.

    2. Redise adapter

    Socket.IO Redise adapter võimaldab teil jagada sündmusi mitme Socket.IO serveri vahel. See kasutab Redis'i, mälupõhist andmesalvestit, sündmuste levitamiseks kõikidele ühendatud serveritele. See võimaldab teil oma rakendust horisontaalselt skaleerida ilma ühenduse olekut kaotamata.

    // Serveripoolne
    const { createAdapter } = require('@socket.io/redis-adapter');
    const { createClient } = require('redis');
    
    const pubClient = createClient({ host: 'localhost', port: 6379 });
    const subClient = pubClient.duplicate();
    
    Promise.all([pubClient.connect(), subClient.connect()]).then(() => {
     io.adapter(createAdapter(pubClient, subClient));
     io.listen(3000);
    });

    3. Koormuse jaotamine

    Koormuse jaotur on oluline liikluse jaotamiseks mitme Socket.IO serveri vahel. Levinud koormuse jaotamise lahendused hõlmavad Nginxi, HAProxyt ja pilvepõhiseid koormuse jaotureid nagu AWS Elastic Load Balancing või Google Cloud Load Balancing. Konfigureerige oma koormuse jaotur kasutama kleepuvaid seansse, et tagada klientide järjepidev suunamine samasse serverisse.

    4. Vertikaalne skaleerimine

    Vertikaalne skaleerimine hõlmab ühe serveri ressursside (protsessor, mälu) suurendamist. Kuigi seda on lihtsam rakendada kui horisontaalset skaleerimist, on sellel piirangud. Lõpuks jõuate punkti, kus te ei saa enam ühe serveri ressursse suurendada.

    5. Koodi optimeerimine

    Tõhusa koodi kirjutamine võib oluliselt parandada teie Socket.IO rakenduse jõudlust. Vältige tarbetuid arvutusi, minimeerige andmeedastust ja optimeerige oma andmebaasi päringuid. Profileerimisvahendid aitavad teil tuvastada jõudluse kitsaskohti.

    Socket.IO rakendamise parimad tavad

    Oma Socket.IO projekti edukuse tagamiseks kaaluge neid parimaid tavasid:

    1. Turvake oma ühendused

    Kasutage turvalisi veebipesasid (WSS), et krüpteerida suhtlus klientide ja serveri vahel. See kaitseb tundlikke andmeid pealtkuulamise ja rikkumise eest. Hankige oma domeenile SSL-sertifikaat ja konfigureerige oma server kasutama WSS-i.

    2. Rakendage autentimine ja autoriseerimine

    Rakendage autentimine kasutajate identiteedi kontrollimiseks ja autoriseerimine ressurssidele juurdepääsu kontrollimiseks. See takistab volitamata juurdepääsu ja kaitseb teie rakendust pahatahtlike rünnakute eest. Kasutage väljakujunenud autentimismehhanisme nagu JWT (JSON Web Tokens) või OAuth.

    3. Käsitlege vigu sujuvalt

    Rakendage korralik veakäsitlus, et ootamatuid vigu sujuvalt käsitleda ja vältida rakenduse krahhe. Logige vigu silumiseks ja jälgimiseks. Pakkuge kasutajatele informatiivseid veateateid.

    4. Kasutage südamelöökide mehhanismi

    Socket.IO-l on sisseehitatud südamelöökide mehhanism, kuid peaksite selle sobivalt konfigureerima. Seadistage mõistlik pingi intervall ja pingi ajalõpp, et tuvastada ja käsitleda surnud ühendusi. Puhastage lahtiühendatud klientidega seotud ressursid mälulekete vältimiseks.

    5. Jälgige jõudlust

    Jälgige oma Socket.IO rakenduse jõudlust, et tuvastada potentsiaalseid probleeme ja optimeerida jõudlust. Jälgige mõõdikuid nagu ühenduste arv, sõnumite latentsus ja protsessori kasutus. Kasutage jälgimisvahendeid nagu Prometheus, Grafana või New Relic.

    6. Puhastage kasutaja sisend

    Puhastage alati kasutaja sisend, et vältida saidiülest skriptimist (XSS) ja muid turvaauke. Enne brauseris kuvamist kodeerige kasutaja esitatud andmed. Kasutage sisendi valideerimist, et tagada andmete vastavus oodatud vormingutele.

    7. Piirake päringute arvu (Rate Limiting)

    Rakendage päringute arvu piiramine, et kaitsta oma rakendust kuritarvitamise eest. Piirake päringute arvu, mida kasutaja saab teatud ajavahemiku jooksul teha. See takistab teenusetõkestamise (DoS) rünnakuid ja kaitseb teie serveri ressursse.

    8. Tihendamine

    Lubage tihendamine, et vähendada klientide ja serveri vahel edastatavate andmete mahtu. See võib oluliselt parandada jõudlust, eriti rakenduste puhul, mis edastavad suuri andmemahte. Socket.IO toetab tihendamist, kasutades `compression` vahevara.

    9. Valige õige transport

    Socket.IO kasutab vaikimisi WebSocketsi, kuid langeb tagasi teistele meetoditele (nagu HTTP pikk pollimine), kui WebSockets pole saadaval. Kuigi Socket.IO tegeleb sellega automaatselt, mõistke selle tagajärgi. WebSockets on tavaliselt kõige tõhusam. Keskkondades, kus WebSockets on sageli blokeeritud (teatud ettevõtete võrgud, piiravad tulemüürid), peate võib-olla kaaluma alternatiivseid konfiguratsioone või arhitektuure.

    10. Globaalsed kaalutlused: lokaliseerimine ja ajavööndid

    Globaalsele publikule rakenduste loomisel pidage silmas lokaliseerimist. Vormindage numbreid, kuupäevi ja valuutasid vastavalt kasutaja lokaadile. Käsitlege ajavööndeid õigesti, et tagada sündmuste kuvamine kasutaja kohalikus ajas. Kasutage rahvusvahelistumise (i18n) teeke, et lihtsustada oma rakenduse lokaliseerimise protsessi.

    Näide: ajavööndite käsitlemine

    Oletame, et teie server salvestab sündmuste ajad UTC-s. Saate kasutada teeki nagu `moment-timezone`, et kuvada sündmuse aega kasutaja kohalikus ajavööndis.

    // Serveripoolne (sündmuse aja saatmine UTC-s)
    const moment = require('moment');
    
    io.on('connection', (socket) => {
     socket.on('request event', () => {
     const eventTimeUTC = moment.utc(); // Praegune aeg UTC-s
     socket.emit('event details', {
     timeUTC: eventTimeUTC.toISOString(),
     description: 'Globaalne konverentskõne'
     });
     });
    });
    
    // Kliendipoolne (kuvamine kasutaja kohalikus ajas)
    const moment = require('moment-timezone');
    
    socket.on('event details', (data) => {
     const eventTimeLocal = moment.utc(data.timeUTC).tz(moment.tz.guess()); // Teisenda kasutaja ajavööndisse
     document.getElementById('eventTime').textContent = eventTimeLocal.format('MMMM Do YYYY, h:mm:ss a z');
    });

    Näide: valuuta vormindamine

    Valuutaväärtuste õigeks kuvamiseks kasutage teeki nagu `Intl.NumberFormat`, et vormindada valuuta vastavalt kasutaja lokaadile.

    // Kliendipoolne
    const priceUSD = 1234.56;
    const userLocale = navigator.language || 'en-US'; // Tuvasta kasutaja lokaat
    
    const formatter = new Intl.NumberFormat(userLocale, {
     style: 'currency',
     currency: 'USD', // Kasuta USD-d lähtepunktina, kohanda vastavalt vajadusele
    });
    
    const formattedPrice = formatter.format(priceUSD);
    
    document.getElementById('price').textContent = formattedPrice;
    
    //Hindade kuvamiseks teises valuutas:
    const formatterEUR = new Intl.NumberFormat(userLocale, {
     style: 'currency',
     currency: 'EUR',
    });
    
    const priceEUR = 1100.00;
    const formattedPriceEUR = formatterEUR.format(priceEUR);
    
    document.getElementById('priceEUR').textContent = formattedPriceEUR;

    Kokkuvõte

    Socket.IO lihtsustab reaalajas andmevoo rakendamist veebirakendustes. Mõistes Socket.IO põhimõisteid, rakendades parimaid tavasid ja skaleerides oma rakendust asjakohaselt, saate luua tugevaid ja skaleeritavaid reaalajas rakendusi, mis vastavad tänapäeva digitaalse maastiku nõudmistele. Ükskõik, kas ehitate vestlusrakendust, reaalajas analüütika armatuurlauda või koostööl põhinevat redigeerimistööriista, pakub Socket.IO teile vajalikud tööriistad ja paindlikkuse, et luua kaasahaaravaid ja reageerivaid kasutajakogemusi globaalsele publikule.