JavaScript पर WebSocket: उन्नत रियल-टाइम एप्लिकेशन

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: बुनियादी WebSocket से परे

WebSocket की बुनियादी समझ एक सरल चैट या सूचनाएं बनाने की अनुमति देती है। हालांकि, प्रोडक्शन-ग्रेड रियल-टाइम एप्लिकेशन — मल्टीप्लेयर गेम, वित्तीय टर्मिनल, सहयोगी संपादन सिस्टम — बनाने के लिए उन्नत तकनीकों में महारत हासिल करना आवश्यक है। इस लेख में हम "Hello, World" से आगे बढ़ेंगे और समझेंगे कि Node.js पर विश्वसनीय, स्केलेबल और सुरक्षित WebSocket एप्लिकेशन कैसे बनाएं।

हम चार प्रमुख क्षेत्रों को कवर करेंगे: Redis के साथ स्केलिंग, स्थितियों और कमरों का प्रबंधन, सुरक्षा और प्रमाणीकरण, और कई प्रोसेसर पर काम करने के लिए क्लस्टरीकरण। सभी कोड उदाहरण ws लाइब्रेरी और Node.js का उपयोग करके JavaScript में लिखे गए हैं।



1. Pub/Sub (Redis) के साथ स्केलिंग

WebSocket सर्वर की एक मुख्य सीमा यह है कि यह अन्य इंस्टेंस के साथ "संवाद" नहीं कर सकता। यदि आपके पास लोड बैलेंसर के पीछे दो सर्वर चल रहे हैं, तो सर्वर A से जुड़ा क्लाइंट सर्वर B के माध्यम से भेजा गया संदेश प्राप्त नहीं करेगा। समाधान — Redis पर आधारित Pub/Sub (प्रकाशक-सब्सक्राइबर) पैटर्न का उपयोग करना है।

Redis एक केंद्रीय ब्रोकर के रूप में कार्य करता है: प्रत्येक सर्वर एक चैनल की सदस्यता लेता है और उसमें संदेश प्रकाशित करता है। इस प्रकार, किसी भी सर्वर द्वारा भेजा गया संदेश तुरंत अन्य सभी में फैल जाता है।

const WebSocket = require('ws');const redis = require('redis');

const wss = new WebSocket.Server({ port: 8080 });const publisher = redis.createClient();const subscriber = redis.createClient();

// चैनल 'broadcast' की सदस्यता लेंsubscriber.subscribe('broadcast');subscriber.on('message', (channel, message) => { // सभी जुड़े क्लाइंट को संदेश भेजें wss.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(message); } });});

wss.on('connection', (ws) => { ws.on('message', (data) => { // Redis में संदेश प्रकाशित करें publisher.publish('broadcast', data.toString()); });});

यह दृष्टिकोण आपके एप्लिकेशन को लगभग असीमित रूप से क्षैतिज रूप से स्केल करने की अनुमति देता है। एक नया सर्वर जोड़ने पर, वह बस Redis पर अपनी सदस्यता बनाता है।



2. कमरों और स्थितियों का प्रबंधन

अधिकांश रियल-टाइम एप्लिकेशन में क्लाइंट को "कमरों" (चैट रूम, गेम लॉबी) में समूहित करना और उनकी स्थिति का प्रबंधन करना आवश्यक होता है। बुनियादी wss.clients ऐसी कार्यक्षमता प्रदान नहीं करता। आइए एक सरल लेकिन प्रभावी कमरा प्रणाली लागू करें।

हम एक rooms ऑब्जेक्ट बनाएंगे, जहां कुंजी कमरे का नाम है, और मान WebSocket क्लाइंट का Set है। हम प्रवेश, निकास और कमरे के अंदर प्रसारण के लिए विधियां जोड़ेंगे।

const rooms = new Map();

function joinRoom(ws, roomName) { if (!rooms.has(roomName)) { rooms.set(roomName, new Set()); } rooms.get(roomName).add(ws); // त्वरित पहुंच के लिए ws ऑब्जेक्ट पर कमरा सहेजें ws.room = roomName;}

function leaveRoom(ws) { if (ws.room && rooms.has(ws.room)) { rooms.get(ws.room).delete(ws); if (rooms.get(ws.room).size === 0) { rooms.delete(ws.room); } delete ws.room; }}

function broadcastToRoom(roomName, message, exclude = null) { if (!rooms.has(roomName)) return; rooms.get(roomName).forEach(client => { if (client !== exclude && client.readyState === WebSocket.OPEN) { client.send(message); } });}

const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', (ws) => { ws.on('message', (data) => { const msg = JSON.parse(data); switch (msg.type) { case 'join': joinRoom(ws, msg.room); break; case 'message': broadcastToRoom(ws.room, msg.text, ws); break; } }); ws.on('close', () => leaveRoom(ws));});

स्थिति प्रबंधन के लिए (जैसे, खिलाड़ी की स्थिति, कर्सर) डेटा को Map में संग्रहीत किया जा सकता है

ब्लॉग

पुस्तक अनुशंसाएँ