Socket.IO Connection State Recovery
Connection State Recovery কী, config, কী recover হয় ও কী হয় না — Socket.IO v4.6+ বাংলায়।
Network সমস্যায় connection ছুটে গেলে সাধারণত room membership, auth state সব হারিয়ে যায়। Connection State Recovery (CSR) — Socket.IO v4.6+ এর feature — সাময়িক সংযোগ-বিচ্ছিন্ন হয়ে ফিরে এলে আগের অবস্থা ফিরিয়ে দেয়।
শেখার লক্ষ্য
- CSR কী এবং সমাধান করে কোন সমস্যা
- server option কনফিগার করা
- কী কী recover হয় এবং কী হয় না
- কখন CSR যথেষ্ট নয়
সমস্যা: Reconnect-এ হারানো state
Client বিচ্ছিন্ন হয়ে আবার যুক্ত হলে:
- new
socket.id(পুরনোটির সাথে সম্পর্ক নেই) - আগের সকলে যোগ দেওয়া room membership হারায়
- session/auth তথ্য হারায়
Browser refresh, network hiccup, মোবাইল data switch — এসব ক্ষেত্রে এটা বেশি লক্ষ্য করা যায়। তাই সাধারণত client reconnect হলে নিজে থেকে আবার room-এ join করা লাগে (socket.on("connect", () => socket.emit("rejoin", ...)))।
সমাধান: Connection State Recovery
server option চালু করলে Socket.IO session সংরক্ষণ করে এবং client যখন সংক্ষিপ্ত সময়ের মধ্যে (ডিফল্ট ২ মিনিট) ফিরে আসে, তখন room membership-সহ আগের state ফিরিয়ে দেয়; পাশাপাশি missed event-গুলোও পাঠায়।
const io = new Server(httpServer, {
connectionStateRecovery: {
// বাড়তি বাদ দিয়ে ফিরে আসার সর্বোচ্চ সময় (ডিফল্ট 2 min)
maxDisconnectionDuration: 2 * 60 * 1000,
// middleware আবার চালাবে কি না (ডিফল্ট false)
skipMiddlewares: true,
},
});Client Side
Client-এ আলাদা কিছু করতে হয় না — reconnect স্বয়ংক্রিয়।
const socket = io();
socket.on("connect", () => {
console.log("connected (new বা recovered):", socket.recovered);
});socket.recovered === true— session সফলভাবে recovered, room membership ফিরে এসেছেsocket.recovered === false— নতুন session; নিজে থেকে rejoin করতে হবে
কী Recover হয়, কী হয় না
| Recover হয় | Recover হয় না |
|---|---|
socket.data ও room membership | আপনার নিজের অ্যাপের database state |
| মিস হওয়া event (adapter সমর্থিত হলে) | untransmitted ack (ack নিজে নয়) |
socket.id পুনঃসংযোগ | server-এ রাখা ভিন্ন in-memory state (আপনি নিজে handle করবেন) |
একাধিক server process-এ CSR ঠিকমতো কাজ করতে compatible adapter দরকার। in-memory adapter কেবল একই process-এর মধ্যে session রাখে। একাধিক node হলে Redis adapter-এর মতো shared storage লাগবে — বিস্তারিত Best Practices।
Line-by-line
connectionStateRecovery— session সংরক্ষণ চালু করেmaxDisconnectionDuration— এই সময়ের মধ্যে ফিরলে state ফিরে, নাহলে নতুন sessionskipMiddlewares: true— recovered connection-এ middleware আবার না চালানো (auth repeat না হলে সুবিধাজনক)- Client-এ
socket.recoveredপড়ে UI/লজিক বুঝতে পারে
কখন CSR যথেষ্ট নয়
- অ্যাপের নিজস্ব critical state (যেমন open modal, form draft) — সেটি client-এ রাখুন/rejoin-এ পাঠান
- অ্যাকশন-level নিশ্চয়তা দরকার হলে — Acknowledgements ব্যবহার করুন
- দীর্ঘ বিচ্ছিন্নতা — max duration পেরিয়ে গেলে পুরোপুরি নতুন session
Practice Task
- devtools-network offline করে কয়েক সেকেন্ড পর online করুন;
socket.recoveredএর মান দেখুন maxDisconnectionDurationকমিয়ে (যেমন 5s) রেখে দেখুন কখন recovered false হয়- room-এ join করে disconnect-reconnect করে membership টিকে আছে কিনা verify করুন
সম্পর্কিত অধ্যায়: Reconnection and Error Handling · Rooms