Socket.IO — müştəri və server arasında ikitərəfli real-time əlaqə üçün WebSocket əsasında avtomatik fallback ilə işləyən kitabxanadır. O, söhbətlərdə, oyunlarda və birgə redaktorlarda ani məlumat ötürülməsi üçün etibarlı nəqliyyat təmin edir. Socket.IO rəsmi sənədlərinə (2024) görə, kitabxana düzgün konfiqurasiya ilə bir serverdə bir milyondan çox bağlantını idarə edə bilər.
Əsas məqamlar
Socket.IO — müştəri və server arasında ikitərəfli hadisə yönümlü kommunikasiya üçün açıq mənbəli JavaScript kitabxanasıdır. O, 2010-cu ildə Guillermo Rauch tərəfindən yaradılmış və o vaxtdan Node.js üçün real-time proqramların de-fakto standartına çevrilmişdir.
Yerli WebSocket API-dən fərqli olaraq, Socket.IO əlavə abstraksiyalar təmin edir: otaqlar, ad sahələri, avtomatik yenidən qoşulma və ikili məlumat növləri. Kitabxana WebSocket-in ayrıca tətbiqi deyil — nəqliyyat qatı kimi Engine.IO-dan istifadə edir, o əvvəlcə HTTP long-polling bağlantısı qurur, sonra WebSocket-ə yüksəltməyə cəhd edir.
npm statistikasına (2025) görə, həftədə 12 milyondan çox socket.io paketi endirilir və bu onu Node.js ekosistemində ən populyar kitabxanalardan birinə çevirir. Socket.IO bütün müasir platformalarda dəstəklənir: brauzerlər, iOS, Android, React Native və masaüstü tətbiqlər.
Socket.IO versiya 1.0 2014-cü ildə buraxılmış və bir TCP bağlantısı üzərindən bir neçə məntiqi kanalı multipleksləşdirməyə imkan verən ad sahələri (namespaces) konsepsiyasını təqdim etmişdir. 2.0 versiyası (2017) ikili məlumat dəstəyi əlavə etmiş və analiz performansını yaxşılaşdırmışdır. Cari versiya 4.x (2020–2025) TypeScript-in tam dəstəyi, miqyaslama üçün flaqman adaptasiya rejimi və təkmilləşdirilmiş geriyə uyğunluğu əhatə edir.
Hər bir əsas buraxılış API-nin geriyə uyğunluğunu qoruyur — socket.io@2 müştərisi xüsusi uyğunluq rejimi vasitəsilə socket.io@4 serverinə qoşula bilər. Bu, müştəri hissəsinin mərhələli şəkildə yeniləndiyi uzunmüddətli layihələr üçün vacibdir.
Socket.IO arxitekturası iki komponentdən ibarətdir: server modulu (npm-paket socket.io) və müştəri modulu (npm-paket socket.io-client). Server Node.js HTTP(S) serveri üzərində işləyir və nəqliyyat səviyyəsini idarə etmək üçün Engine.IO-dan istifadə edir.
İlk qoşulmada müştəri serverə HTTP sorğusu göndərir. Engine.IO cavab verir və long-polling bağlantısı qurur. Bundan sonra müştəri nəqliyyat protokolunu WebSocket-ə yüksəltmək üçün sorğu göndərir. Server WebSocket-i dəstəkləyirsə, yüksəltmə bir TCP sessiyası çərçivəsində baş verir. Əks halda, bağlantı long-polling olaraq qalır və tətbiq kodu dəyişiklik tələb etmir.
Socket.IO performans testlərinə (2024) görə, WebSocket istifadə edərkən gecikmə mesaj ötürülməsi üçün 2–5 ms təşkil edir, halbuki long-polling HTTP əlavə xərcləri səbəbindən 150–300 ms əlavə edir. Nəqliyyat seçimi tərtibatçı üçün şəffafdır.
Engine.IO — Socket.IO-nun qurulduğu aşağı səviyyəli nəqliyyat qatıdır. O, bağlantının qurulması, nəqliyyat seçimi, heartbeat (ping/pong) və bağlantının kəsilməsinə cavabdehdir. Engine.IO paketlərinin əsas növləri: open (başlatma), close (bağlama), ping/pong (həyat yoxlaması), upgrade (nəqliyyat dəyişikliyi), message (məlumat).
Socket.IO Engine.IO üzərində öz hadisə modelini qurur — tərtibatçı məhz bununla işləyir. Hər bir Socket.IO mesajı Engine.IO paketinə message növü ilə və çatdırılmanı təsdiqləmək üçün unikal identifikatorla yığılır.
Socket.IO yerli WebSocket API-də olmayan və real-time tətbiqlərin hazırlanmasını əhəmiyyətli dərəcədə asanlaşdıran funksiyalar dəsti təqdim edir. Əsas olanları nəzərdən keçirək.
Avtomatik yenidən qoşulma — müştəri qopma zamanı eksponensial gecikmə ilə (100 ms, 200 ms, 400 ms... maksimuma qədər) avtomatik olaraq bağlantını bərpa edir. Socket.IO sənədlərinə (2024) görə, retry parametrləri reconnectionDelay və reconnectionAttempts vasitəsilə əlçatandır. Bu seçim şəbəkə dəyişikliyi zamanı bağlantının kəsilə biləcəyi mobil tətbiqlər üçün kritikdir.
Otaqların dəstəyi — server soketləri otaqlarda qruplaşdıra və mesajları yalnız müəyyən otağın üzvlərinə göndərə bilər. Otaqlar açıq şəkildə yaradılma tələb etmir — ilk soket qoşulduqda yaradılır. Otaqlar proses səviyyəsində tətbiq edilir və xüsusi adapter olmadan müxtəlif serverlər arasında paylaşılmır.
Ad sahələri — bir bağlantı üzərində rabitə kanallarının məntiqi bölünməsi. Məsələn, söhbət mesajları üçün /chat və bildirişlər üçün /notifications ad sahəsi. Hər bir ad sahəsinin öz otaqları, middleware və işləyiciləri var. Ad sahələri bir TCP bağlantısı üzərindən multipleksləşdirilir ki, bu da resurslara qənaət edir.
Çatdırılmanın təsdiqi — mesaj göndərərkən callback funksiyası ötürülə bilər, server qəbuli təsdiqlədikdə bu funksiya çağırılır. Bu, hər bir paketin unikal identifikatoru vasitəsilə həyata keçirilir. Təsdiq mexanizmi kritik vacib mesajların (məsələn, ödəniş əməliyyatlarının) alıcıya çatdırıldığına zəmanət verir.
Socket.IO və yerli WebSocket arasında seçim layihənin tələblərindən asılıdır. WebSocket bütün müasir brauzerlər tərəfindən dəstəklənən standartlaşdırılmış protokoldur (RFC 6455). Socket.IO WebSocket-i nəqliyyat kimi istifadə edən, lakin əlavə funksiyalar əlavə edən kitabxanadır.
| Xüsusiyyət | Socket.IO | WebSocket |
|---|---|---|
| Nəqliyyat | WebSocket + HTTP long-polling (fallback) | Yalnız WebSocket |
| Hadisə modeli | JSON payload ilə adlandırılmış hadisələr | Yalnız mətn/ikili çərçivələr |
| Otaqlar | Daxili soket qruplaşdırması | Əl ilə tətbiq tələb edir |
| Avto-yenidən qoşulma | Daxili | Əl ilə tətbiq tələb edir |
| Çatdırılma təsdiqi | Callback ilə ACK mexanizmi | Protokol genişləndirmələri ilə əlçatandır |
| Miqyaslanma | Adapterlər (Redis, MongoDB, Cluster) | Öz infrastrukturunu tələb edir |
| Kitabxana ölçüsü | ~50 KB (müştəri, gzip) | Brauzerə daxildir (0 KB) |
Layihə maksimum performans və minimal müştəri ölçüsü tələb edirsə — yerli WebSocket-i seçin. Etibarlı çatdırılma, qruplaşdırma və hadisə modeli lazımdırsa — Socket.IO hazır abstraksiyalar sayəsində inkişaf müddətini 2–3 dəfə qısaldacaq.
State of JS 2024 sorğusuna görə, real-time tətbiq tərtibatçılarının 67%-i Socket.IO-ya üstünlük verir, çünki API rahatlığı və kənar halların daxili işlənməsi (şəbəkə qopması, yenidən qoşulma, ikili məlumatlar) səbəbindən.
Socket.IO-nun quraşdırılması iki paket tələb edir: server və müştəri. Node.js layihəsi üçün əsas konfiqurasiyaya baxaq. Server HTTP serveri yaradır, Socket.IO-nu işə salır və müştərilərin qoşulma və ayrılma hadisələrini idarə edir.
Socket.IO sənədlərinə (2024) görə, server daxili http modulundan istifadə edərək Express olmadan işə salına bilər, lakin real layihələrdə HTTP sorğularının marşrutlaşdırılması üçün adətən Express və ya Fastify istifadə olunur.
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, {
cors: { origin: '*' }
});
io.on('connection', (socket) => {
console.log('Müştəri qoşuldu:', socket.id);
socket.emit('welcome', { message: 'Hello from server' });
socket.on('disconnect', () => {
console.log('Müştəri ayrıldı');
});
});
server.listen(3000, () => {
console.log('Server 3000 portunda işləyir');
});
import { io } from 'socket.io-client';
const socket = io('http://localhost:3000', {
transports: ['websocket', 'polling'],
reconnectionDelay: 1000
});
socket.on('welcome', (data) => {
console.log(data.message);
});
socket.emit('chat message', {
user: 'Alice',
text: 'Hello everyone!'
});
Socket.IO hadisə modeli adlandırılmış hadisələrə əsaslanır. Server və müştəri müəyyən hadisə adına bağlı mesajlar göndərir və qəbul edir. Payload sətir, JSON obyekti və ya ikili məlumat (Buffer, ArrayBuffer, Blob) ola bilər.
Hər bir hadisə ACK (acknowledgement) — qəbul edən tərəfindən hadisə işləndikdən sonra göndərən tərəfdə icra olunan callback funksiyasının ötürülməsini dəstəkləyir. Bu, hadisə modeli üzərində request-response nümunəsini tətbiq etməyə imkan verir. ACK yalnız qəbul edən callback-i açıq şəkildə çağırdıqda işləyir.
Socket.IO sənədlərinə (2024) görə, optimal performans üçün tək mesajın maksimum ölçüsü 1 MB-dan çox olmamalıdır. Daha böyük mesajlar parçalara bölünməli və ya ayrıca kanal vasitəsilə ötürülməlidir.
io.on('connection', (socket) => {
socket.join('room-1');
socket.to('room-1').emit('user joined', {
userId: socket.id
});
io.to('room-1').emit('message', {
text: 'Broadcast to room'
});
socket.leave('room-1');
});
Üfüqi miqyaslanma Socket.IO bir neçə server prosesi arasında vəziyyətin bölüşdürülməsi probleminin həllini tələb edir. Otaqlar, ad sahələri və qoşulmuş soketlərin siyahısı bir prosesin yaddaşında saxlanılır və adapter olmadan digər proseslərə görünmür.
Rəsmi Socket.IO adapterləri: redis (Redis Pub/Sub vasitəsilə), mongodb (MongoDB change streams vasitəsilə), cluster (Node.js cluster çoxprosesli rejimi üçün). Adapter Socket.IO instansiyaları arasında mesaj brokeri kimi çıxış edir. Otağa hadisə göndərildikdə, adapter onu Redis-də dərc edir və bütün serverlər bildiriş alır.
Socket.IO yük testlərinə (2024) görə, Redis adapteri olan 4 serverdən ibarət klaster 400 000-ə qədər eyni vaxtda bağlantını 10 ms-dən aşağı gecikmə ilə idarə edir. Adapter olmadan bir Node.js prosesinin maksimum tutumu 1 GB yaddaşda təxminən 100 000 bağlantı təşkil edir.
const Server = require('socket.io');
const RedisAdapter = require('@socket.io/redis-adapter');
const Redis = require('ioredis');
const pubClient = new Redis({ host: 'localhost', port: 6379 });
const subClient = pubClient.duplicate();
const io = new Server(server);
io.adapter(RedisAdapter(pubClient, subClient));
Kubernetes və ya Docker Swarm istifadə edərkən, bir müştəridən gələn sorğuların eyni serverə düşməsi üçün əlavə olaraq session affinity (sticky sessions) konfiqurasiya etmək tövsiyə olunur, əks halda hər yenidən qoşulmada təyinat dəyişə bilər.
Tez-tez verilən suallar
Socket.IO adlandırılmış hadisələrlə hadisə modeli, avtomatik yenidən qoşulma, otaq dəstəyi və HTTP long-polling-ə fallback təmin edir. Yerli WebSocket minimal API ilə aşağı səviyyəli protokoldur və bu mexanikaların əl ilə tətbiqini tələb edir.
Bəli, Python (python-socketio), Java (netty-socketio), Go (go-socketio) və digər dillər üçün üçüncü tərəf implementasiyaları mövcuddur. socket.io-client müştərisi JavaScript, Swift, Kotlin və C++ üçün əlçatandır.
Socket.IO ilə bir Node.js prosesi 1 GB RAM ilə 100 000 bağlantıya qədər işləyə bilər. Redis adapteri və 4 serverlə klaster 400 000-ə qədər eyni vaxtda müştərini dəstəkləyir.
Bəli, iOS üçün Swift-də rəsmi müştəri, Android üçün Java/Kotlin-də rəsmi müştəri mövcuddur. React Native üçün standart JavaScript socket.io-client müştərisi istifadə olunur.
HTTP/WS əvəzinə HTTPS/WSS istifadə edin, tokenlər (JWT) vasitəsilə autentifikasiya üçün middleware konfiqurasiya edin, validatorlar vasitəsilə gedən hadisələrə məhdudiyyət qoyun və DDoS-dan qorunmaq üçün rate limiting istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.