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

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

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

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

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

\n\n

रीयल-टाइम एप्लिकेशन आधुनिक वेब का एक अनिवार्य हिस्सा बन गए हैं। चैट और सूचनाओं से लेकर ऑनलाइन गेम और ट्रेडिंग प्लेटफॉर्म तक — WebSocket तकनीक क्लाइंट और सर्वर के बीच स्थायी द्विदिश कनेक्शन सुनिश्चित करती है। उन्नत स्तर पर, ऐसी प्रणालियों के विकास के लिए न केवल प्रोटोकॉल की समझ की आवश्यकता होती है, बल्कि दोष-सहिष्णु, स्केलेबल आर्किटेक्चर बनाने की क्षमता भी होती है। इस लेख में, हम सर्वोत्तम अभ्यासों और पैटर्न का उपयोग करके TypeScript पर production-grade WebSocket एप्लिकेशन बनाने का तरीका समझेंगे।

\n\n

1. WebSocket सर्वर की आर्किटेक्चर और क्लस्टरीकरण

\n\n

एक एकल WebSocket सर्वर वास्तविक प्रोजेक्ट के लोड को संभाल नहीं पाएगा। मुख्य कार्य क्लस्टरीकरण और इंस्टेंस के बीच संदेश आदान-प्रदान को व्यवस्थित करना है। आइए ws लाइब्रेरी और Redis इवेंट बस का उपयोग करके आर्किटेक्चर पर विचार करें।

\n\n

निर्भरताएँ स्थापित करें:

\n
npm install ws redis ioredis @types/ws @types/ioredis
\n\n

एक बुनियादी क्लस्टरित सर्वर बनाएँ:

\n\n
import { WebSocketServer, WebSocket } from 'ws';\nimport Redis from 'ioredis';\n\nconst redisPub = new Redis();\nconst redisSub = new Redis();\n\nconst wss = new WebSocketServer({ port: 8080 });\n\n// अंतर-सर्वर संचार के लिए चैनल\nconst CHANNEL = 'ws:messages';\n\nredisSub.subscribe(CHANNEL, (err, count) => {\n  if (err) console.error('सब्सक्रिप्शन त्रुटि:', err);\n  console.log(`${count} चैनलों की सदस्यता ली`);\n});\n\n// अन्य इंस्टेंस से संदेश प्राप्त करना\nredisSub.on('message', (channel, message) => {\n  const parsed = JSON.parse(message);\n  wss.clients.forEach((client) => {\n    if (client.readyState === WebSocket.OPEN) {\n      client.send(parsed.data);\n    }\n  });\n});\n\nwss.on('connection', (ws) => {\n  console.log('नया कनेक्शन');\n\n  ws.on('message', (data) => {\n    const message = data.toString();\n    // सभी इंस्टेंस के लिए Redis में प्रकाशित करें\n    redisPub.publish(CHANNEL, JSON.stringify({ data: message }));\n  });\n});
\n\n

लाभ:

\n
    \n
  • क्षैतिज स्केलिंग — जितने चाहें उतने सर्वर जोड़ें
  • \n
  • दोष-सहिष्णुता — एक इंस्टेंस के डाउन होने पर अन्य काम करते रहते हैं
  • \n
  • Redis Pub/Sub के माध्यम से एकीकृत संदेश बस
  • \n
\n\n

2. प्रमाणीकरण और सत्र प्रबंधन

\n\n

production एप्लिकेशन में, अप्रमाणित कनेक्शन पर भरोसा नहीं किया जा सकता। कनेक्शन स्थापित करते समय JWT के माध्यम से टोकन सत्यापन लागू करें।

\n\n

jsonwebtoken स्थापित करें:

\n
npm install jsonwebtoken @types/jsonwebtoken
\n\n

WebSocket प्रमाणीकरण के लिए middleware बनाएँ:

\n\n
import { IncomingMessage } from 'http';\nimport jwt from 'jsonwebtoken';\n\nconst JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';\n\ninterface AuthenticatedSocket extends WebSocket {\n  userId?: string;\n}\n\nfunction authenticate(ws: AuthenticatedSocket, req: IncomingMessage): boolean {\n  const url = new URL(req.url || '', 'http://localhost');\n  const token = url.searchParams.get('token');\n\n  if (!token) {\n    ws.close(4001, 'टोकन प्रदान नहीं किया गया');\n    return false;\n  }\n\n  try {\n    const decoded = jwt.verify(token, JWT_SECRET) as { userId: string };\n    ws.userId = decoded.userId;\n    console.log(`उपयोगकर्ता ${decoded.userId} प्रमाणित`);\n    return true;\n  } catch (err) {\n    ws.close(4002, 'अमान्य टोकन');\n    return false;\n  }\n}\n\n// उपयोग\nwss.on('connection', (ws: AuthenticatedSocket, req) => {\n  if (!authenticate(ws, req)) return;\n\n  ws.on('message', (data) => {\n    // अब हम userId जानते हैं\n    console.log(`${ws.userId} से संदेश: ${data}`);\n  });\n});
\n\n

सिफारिशें:

\n
    \n
  • कनेक्शन स्थापित करते समय टोकन को query-पैरामीटर या हेडर के माध्यम से भेजें
  • \n
  • अल्पकालिक access-टोकन और refresh-टोकन का उपयोग करें
  • \n
  • सत्रों को Redis में स्टोर करें

ब्लॉग

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