Socket.IO Reconnection and Error Handling
auto reconnection, connection state, reconnect_error, server error handling — বাংলায়।
আসল application-এ network সবসময় স্থিতিশীল নয়। Socket.IO-এর সবচেয়ে বড় সুবিধাগুলোর একটি হলো automatic reconnection — নিজে থেকেই সংযোগ ফিরে আসে।
শেখার লক্ষ্য
- client auto-reconnect কীভাবে কাজ করে
- reconnection option কনফিগার
- connection state ও connection error event হ্যান্ডেল
- server-side error handling
Default Reconnection
Client disconnect হলে Socket.IO নিজে থেকেই প্রচেষ্টা করে — প্রথমে সামান্য দেরি, তারপর ক্রমে একটু বাড়িয়ে (exponential backoff), ডিফল্টে অসীম সংখ্যক চেষ্টা।
const socket = io("http://localhost:3000", {
// সর্বোচ্চ unseccessful attempt (ডিফল্ট Infinity)
reconnectionAttempts: 5,
// দেরি (ms) — ডিফল্ট 1000
reconnectionDelay: 1000,
// কত বাড়বে (multiplier)
reconnectionDelayMax: 5000,
// randomness (0-1) — thundering herd এড়াতে
randomizationFactor: 0.5,
// নিজে auto-reconnect বন্ধ করতে
reconnection: true,
});Connection State Flow
socket.on("connect", () => console.log("connected"));
socket.on("disconnect", (reason) => console.log("disconnected:", reason));
socket.on("connect_error", (err) => console.log("error:", err.message));
// reconnection cycle
socket.io.on("reconnect_attempt", (n) => console.log("attempt", n));
socket.io.on("reconnect", (n) => console.log("reconnected on", n));
socket.io.on("reconnect_error", (err) => console.log("reconnect failed:", err));
socket.io.on("reconnect_failed", () => console.log("সব চেষ্টা শেষ"));
socket.io.on("ping", () => console.log("heartbeat"));reconnect_* ঘটনাগুলো socket-এর নয়, `socket.io` (Manager)-এর উপর শুনতে হয়। ping/pong দিয়ে Socket.IO সংযোগ জীবিত কিনা যাচাই করে; নির্দিষ্ট সময়ে সাড়া না এলে connection tear-down হয়।
Reconnection Option ব্যাখ্যা
| Option | কাজ |
|---|---|
reconnection | চালু/বন্ধ (ডিফল্ট true) |
reconnectionAttempts | সর্বোচ্চ চেষ্টা (ডিফল্ট Infinity) |
reconnectionDelay | প্রথম delay ms (ডিফল্ট 1000) |
reconnectionDelayMax | সর্বোচ্চ delay (ডিফল্ট 5000) |
randomizationFactor | delay-এ randomness (ডিফল্ট 0.5) |
randomizationFactor: delay = base (1 ± factor)। অনেক client একসাথে reconnect করলে সবাই একই মুহূর্তে hit করলে thundering herd* হয়। randomness ছড়িয়ে দিলে server-এ চাপ কমে।
Manual Reconnect
কখনো server নিজে থেকে client-কে disconnect করে; client চাইলে হাতে re-connect করতে পারে:
socket.on("disconnect", (reason) => {
if (reason === "io server disconnect") {
// server disconnect করেছে — auto-reconnect চলবে না
socket.connect(); // নিজে থেকে আবার
}
});Server-Side Error Handling
Server-এ error event listener যোগ করুন, আর event handler-এ সবসময় try/catch রাখুন যাতে একটি error পুরো process না ফেলে।
io.on("connection", (socket) => {
socket.on("error", (err) => {
console.error("socket error from", socket.id, err.message);
});
socket.on("chat:message", async (payload, ack) => {
try {
const saved = await saveMessage(payload);
if (typeof ack === "function") ack({ ok: true, id: saved.id });
} catch (err) {
console.error(err);
if (typeof ack === "function") {
ack({ ok: false, error: "message সংরক্ষণ ব্যর্থ" });
}
}
});
});একটি socket handler-এ exception ছড়ালে পুরো Node process crash করতে পারে — ফলে সব client-এর connection যায়। প্রতিটি async callback-এ try/catch রাখুন এবং ack-এ error report করুন।
Real-World Behavior
- Wi-Fi বন্ধ করে ৫ সেকেন্ড পর চালু করুন —
reconnect_attemptদেখবেন, তারপরreconnect - Server বন্ধ করে রাখলে
reconnect_failedআসবে (যদি attempts সীমিত হয়) - Server restart-এর পর client নিজে থেকে নতুন connection-এ ফিরে আসবে
সাধারণ ভুল ও সমাধান
socket.on("reconnect")ভুল target — এগুলোsocket.io-এ register করুন- reconnect-এ state হারানো — rejoin logic যোগ করুন অথবা Connection State Recovery
- backoff ছাড়া infinite attempt — production-এ attempts সহ backoff রাখুন
Practice Task
reconnectionAttempts: 3দিয়ে server বন্ধ করেreconnect_failedদেখুনreconnectইভেন্টে server-এ আবার room join করুন- একটি handler-এ
try/catchযোগ করে ack-এ error report করুন
সম্পর্কিত অধ্যায়: Connecting and Disconnecting · Connection State Recovery