WebSockets ব্যবহার করে রিয়েল-টাইম অ্যাপ তৈরি করা
পোলিং (Polling) আপনার অ্যাপের জন্য ক্ষতিকর।
আমি একবার AJAX polling ব্যবহার করে একটি চ্যাট উইজেট তৈরি করেছিলাম। আমি অ্যাপটিকে প্রতি সেকেন্ডে সার্ভারের কাছে নতুন মেসেজ চাওয়ার জন্য সেট করেছিলাম। এটি কাজ করেছিল, কিন্তু এটি ছিল ধীরগতির। UI ল্যাগি (laggy) মনে হচ্ছিল। সার্ভারকে অনেক বেশি পরিশ্রম করতে হচ্ছিল। বেশিরভাগ রিকোয়েস্ট খালি ডেটা রিটার্ন করছিল। এটি অনেকটা চামচ দিয়ে একটি বাথটাব ভর্তি করার চেষ্টার মতো ছিল।
WebSockets এটি বদলে দেয়।
ক্রমাগত রিকোয়েস্ট পাঠানোর পরিবর্তে, আপনি একটি স্থায়ী (persistent) কানেকশন খুলতে পারেন। এটি ডেটার দ্বিমুখী প্রবাহ (two-way flow) নিশ্চিত করে। সার্ভার তাৎক্ষণিকভাবে ক্লায়েন্টের কাছে ডেটা পাঠাতে পারে। ক্লায়েন্টও তাৎক্ষণিকভাবে সার্ভারে ডেটা পাঠাতে পারে।
কেন WebSockets ব্যবহার করবেন?
• ল্যাটেন্সি (Latency) শত শত মিলিসেকেন্ড থেকে কমে কয়েক দশ মিলিসেকেন্ডে নেমে আসে। • সার্ভারের লোড বা চাপ অনুমানযোগ্য হয়ে ওঠে। • বারবার HTTP হেডার পাঠানোর প্রয়োজন না থাকায় আপনি ব্যান্ডউইথ সাশ্রয় করতে পারেন। • এটি চ্যাট, লাইভ নোটিফিকেশন এবং মাল্টিপ্লেয়ার গেমের জন্য কার্যকর।
এটি যেভাবে কাজ করে:
কানেকশনটি একটি HTTP upgrade রিকোয়েস্টের মাধ্যমে শুরু হয়। সার্ভার রাজি থাকলে, এটি একটি 101 স্ট্যাটাস কোড পাঠায়। এরপর, আপনি একটি র (raw) বাইনারি বা টেক্সট প্রোটোকল ব্যবহার করতে পারেন। এরপর আর কোনো কুকি বা হেডার আপনার গতি কমিয়ে দেবে না।
সাধারণ কিছু ভুল যা এড়িয়ে চলা উচিত:
- কানেকশন ড্রপ হওয়া: নেটওয়ার্ক ব্যর্থ হতে পারে। আপনাকে exponential backoff-এর মতো একটি রিট্রাই স্ট্র্যাটেজি (retry strategy) ইমপ্লিমেন্ট করতে হবে।
- মেমরি লিক (Memory leaks): ব্যবহারকারী চলে গেলে সর্বদা আপনার সকেটগুলো বন্ধ করে দিন। Zombie connections সার্ভারের মেমরি দখল করে ফেলে।
- মেসেজ লুপ: ব্রডকাস্টিং করার সময় মূল প্রেরককে বাদ দিন। অন্যথায়, ব্যবহারকারী তার নিজের মেসেজটি দুবার দেখতে পাবেন।
- আইডল (Idle) কানেকশন: কিছু প্রক্সি নীরব কানেকশনগুলো বন্ধ করে দেয়। সকেটটিকে সচল রাখতে ping/pong heartbeat ব্যবহার করুন।
কিছু পরিবর্তন হয়েছে কি না তা সার্ভারকে জিজ্ঞাসা করা বন্ধ করুন। একটি লাইন খোলা রাখুন যাতে যখনই প্রয়োজন তখনই আপনি কথা বলতে পারেন।
আপনার চ্যালেঞ্জ:
একটি সাধারণ চ্যাট উদাহরণ নিন। এতে একটি "typing..." ইন্ডিকেটর যোগ করুন। এটি Render বা Fly.io-এর মতো কোনো হোস্টে ডেপ্লয় করুন। পোলিং ছাড়াই যখন আপনি রিয়েল-টাইমে সেই ইন্ডিকেটরটি নড়াচড়া করতে দেখবেন, বুঝবেন আপনি পরবর্তী ধাপে পৌঁছে গেছেন।