Socket.IO Best Practices and Common Mistakes
Production-specific best practices, security, scaling ও common mistakes — বাংলায় সারসংক্ষেপ।
শেষ অধ্যায়ে Socket.IO-কে production-এ নিরাপদ, দ্রুত ও নির্ভরযোগ্য করতে সবচেয়ে গুরুত্বপূর্ণ best practices আর সবচেয়ে বেশি হওয়া ভুলগুলো এক জায়গায় দেখে নিই।
শেখার লক্ষ্য
- Security, performance ও reliability-এর নিয়মগুলো
- একাধিক server/node-এ scale করার পদ্ধতি
- শুরুতে সবচেয়ে হওয়া ভুলগুলো এড়ানো
Security Checklist
- সবসময় auth middleware — handshake-এ token verify করুন (Authentication)
- প্রতিটি action-এ authorization — শুধু "logged in" নয়, "এই কাজ করার অনুমতি আছে কিনা" চেক
- Input validate ও sanitize — দৈর্ঘ্য সীমিত করুন, HTML strip করুন (XSS ঠেকাতে)
- CORS-এ নির্দিষ্ট origin — production-এ
origin: "*"নয় - Rate limiting — প্রতি IP/connection-এ throttle
- সংবেদনশীল ডেটা
socket.data-তে সব নয় — minimum রাখুন - HTTPS/WSS ব্যবহার — token ও message transport-এ সুরক্ষা
client থেকে আসা সব ডেটা (room নাম, userId, role, price) server-এ validate করুন। client-এর পাঠানো role বা userId কখনো সরাসরি authorization-এ ব্যবহার করবেন না — verified token/session থেকে নিন।
Performance
volatileemit — non-critical frequent update-এ (typing, cursor) ব্যবহার করুন; দরকার না হলে পুরনো ডেটা বাদ পড়তে পারে (Broadcasting)- Room/Namespace দিয়ে targeting — সবাইকে না পাঠিয়ে নির্দিষ্ট দলকে
- Binary বড় হলে object storage — socket দিয়ে শুধু URL/notify
maxHttpBufferSizeসচেতনভাবে — অপ্রয়োজনে বড় নয়- Listener cleanup — একই event-এ বারবার
onনয়;off/onceব্যবহার
Reliability
- ack + timeout — গুরুত্বপূর্ণ message delivery (Acknowledgements)
- try/catch প্রতিটি handler-এ — unhandled error-এ process crash ঠেকায়
- Reconnection handle —
socket.io-এreconnect_*শুনুন (Reconnection & Errors) - Connection State Recovery — সংক্ষিপ্ত outage-এ state ফিরে (Connection State Recovery)
Scaling: একাধিক Node
একটি process-এ in-memory adapter সব client ধরে — কিন্তু একাধিক server instance হলে room/event ভাগ হয় না। তখন:
import { createAdapter } from "@socket.io/redis-adapter";
import { createClient } from "redis";
const pubClient = createClient({ url: "redis://localhost:6379" });
const subClient = pubClient.duplicate();
await Promise.all([pubClient.connect(), subClient.connect()]);
io.adapter(createAdapter(pubClient, subClient));Long-polling ব্যবহার হলে load balancer-এ sticky session (একই client সবসময় একই node-এ) দরকার। WebSocket-only হলে সাধারণত লাগে না। বিস্তারিত Socket.IO scaling guide-এ।
সাধারণ ভুল ও সমাধান
| ভুল | সমাধান |
|---|---|
io.emit দিয়ে নিজের message-ও echo পাওয়া | socket.broadcast.emit অথবা client-side optimistic render |
ack(...) কল করতে ভুলে যাওয়া | প্রতিটি code path-এ ঠিক একবার ack(...) |
Express-এ app.listen ব্যবহার | httpServer.listen ব্যবহার করুন |
| Middleware-কে global ভাবা | custom namespace-এ আলাদা ns.use register করুন |
socket.id দিয়ে user চেনা | user-id/user-room ব্যবহার করুন |
| Client-এর ডেটা validate না করা | server-এ সব ইনপুট validate ও sanitize করুন |
| একই event-এ duplicate listener | cleanup করুন, off/once ব্যবহার করুন |
Production-এ origin: "*" | নির্দিষ্ট trusted origin দিন |
Project Structure (suggested)
src/
├── server.js
├── app.js
├── socket/
│ ├── index.js
│ ├── handlers/
│ └── middleware/
├── services/
└── types.tsPractice Task
- নিজের chat app-এ auth middleware যোগ করুন
- সব handler-এ input validation ও try/catch দিন
- Redis adapter দিয়ে দুটি server instance চালিয়ে cross-server broadcast test করুন
- একটি unhandled error scenario তৈরি করে try/catch দিয়ে fix করুন
সমাপ্তি
অভিনন্দন! আপনি Socket.IO-এর মূল ধারণা থেকে শুরু করে authentication, scaling আর একটি পূর্ণ real-time project পর্যন্ত শিখেছেন। এখন নিজের একটি realtime feature বানিয়ে অনুশীলন করুন।
সম্পর্কিত অধ্যায়: Socket.IO Introduction · Building a Real-Time Chat Application · Middleware