Long Polling হলো একটি ক্লায়েন্ট-সার্ভার ইন্টারঅ্যাকশন কৌশল যেখানে সার্ভার HTTP অনুরোধটি খোলা রাখে যতক্ষণ না নতুন ডেটা উপলব্ধ হয় বা একটি টাইমআউট শেষ হয়। পর্যায়ক্রমিক পোলিংয়ের বিপরীতে, সার্ভার তাৎক্ষণিকভাবে খালি প্রতিক্রিয়া ফেরত দেয় না, বরং ক্লায়েন্টের কাছে ডেটা পাঠানোর জন্য একটি ইভেন্ট ঘটার অপেক্ষা করে। MDN Web Docs, 2024 অনুযায়ী, Long Polling রিয়েল-টাইম অ্যাপ্লিকেশনের জন্য একটি জনপ্রিয় সমাধান হিসেবে রয়ে গেছে যেখানে WebSocket উপলব্ধ নয় বা অপ্রয়োজনীয়।
মূল বিষয়সমূহ
Long Polling একটি ক্লায়েন্ট-সার্ভার আর্কিটেকচারে একটি যোগাযোগ প্যাটার্ন যেখানে একটি ক্লায়েন্ট HTTP অনুরোধ শুরু করে, এবং সার্ভার নতুন ডেটা উপলব্ধ হওয়া বা নির্দিষ্ট টাইমআউট শেষ হওয়া পর্যন্ত প্রতিক্রিয়া পাঠাতে বিলম্ব করে। প্রতিক্রিয়া পাওয়ার পর, ক্লায়েন্ট তাৎক্ষণিকভাবে পরবর্তী অনুরোধ পাঠায়, একটি অবিচ্ছিন্ন সংযোগের প্রভাব তৈরি করে।
Long Polling কৌশলটি খালি HTTP অনুরোধের সংখ্যা কমানোর জন্য Short Polling-এর একটি বিবর্তনমূলক উন্নয়ন হিসেবে আবির্ভূত হয়েছিল। ঐতিহ্যবাহী পোলিংয়ে, ক্লায়েন্ট প্রতি N সেকেন্ডে অনুরোধ পাঠায়, এবং সার্ভার নতুন ডেটা না থাকলেও সাড়া দেয়। Long Polling-এ, সার্ভার একটি সংযোগ ধরে রাখার প্রক্রিয়া ব্যবহার করে, যা অকাজে ট্রাফিক নাটকীয়ভাবে হ্রাস করে।
2011 সালে WebSocket আগমনের আগে, Long Polling ওয়েবে রিয়েল-টাইম যোগাযোগের প্রাথমিক পদ্ধতি ছিল। Facebook এবং Gmail-এর মতো কোম্পানিগুলো 2010 দশকের শুরুতে তাদের চ্যাট এবং বিজ্ঞপ্তির জন্য এই কৌশল ব্যবহার করেছিল। High Performance Browser Networking (Grigorik, 2013) অনুযায়ী, Long Polling সেই সময়ের প্রধান ওয়েব অ্যাপ্লিকেশনগুলিতে 95% পর্যন্ত সকল রিয়েল-টাইম সংযোগ পরিচালনা করেছিল।
একটি ক্লায়েন্ট সার্ভারে একটি মানক HTTP অনুরোধ পাঠায়। অনুরোধ পাওয়ার পর, সার্ভার তাৎক্ষণিকভাবে প্রতিক্রিয়া ফেরত দেয় না — এটি অনুরোধটি একটি অপেক্ষা লাইনে রাখে। যখন সার্ভারে একটি ইভেন্ট ঘটে (একটি নতুন বার্তা, ডেটা পরিবর্তন), সার্ভার একটি প্রতিক্রিয়া তৈরি করে এবং ক্লায়েন্টকে পাঠায়। প্রতিক্রিয়া পাওয়ার পর, ক্লায়েন্ট তাৎক্ষণিকভাবে একটি নতুন Long Polling অনুরোধ তৈরি করে, এবং চক্রটি পুনরাবৃত্ত হয়।
Long Polling নিম্নলিখিত পদক্ষেপের ক্রম অনুসারে কাজ করে। ক্লায়েন্ট সার্ভার এন্ডপয়েন্টে একটি HTTP GET অনুরোধ পাঠায়। অনুরোধ পাওয়ার পর, সার্ভার ইভেন্ট কিউতে নতুন ডেটা আছে কিনা পরীক্ষা করে। যদি কোনো ডেটা না থাকে, তাহলে সার্ভার অনুরোধটি একটি অপেক্ষামান অবস্থায় রাখে, তাৎক্ষণিকভাবে প্রতিক্রিয়া পাঠায় না। ধরে রাখার প্রক্রিয়া সার্ভার বাস্তবায়নের উপর নির্ভর করে — সাধারণত কলব্যাক সহ অ্যাসিনক্রোনাস প্রক্রিয়াকরণ বা ইভেন্ট-চালিত আর্কিটেকচার ব্যবহৃত হয়।
যখন সার্ভার পাশে একটি ইভেন্ট ঘটে (উদাহরণস্বরূপ, একজন ব্যবহারকারী চ্যাটে একটি বার্তা পাঠিয়েছে), সার্ভার একটি HTTP প্রতিক্রিয়া তৈরি করে যার মধ্যে এই ডেটা থাকে এবং সংযোগ শেষ করে। ক্লায়েন্ট প্রতিক্রিয়া পায়, ডেটা প্রক্রিয়া করে এবং তাৎক্ষণিকভাবে একটি নতুন অনুরোধ শুরু করে। যদি অপেক্ষা সময়ে কোনো ডেটা দেখা না যায়, তাহলে সার্ভার টাইমআউট শেষ হলে একটি খালি প্রতিক্রিয়া পাঠায়, এবং ক্লায়েন্টও সংযোগ পুনরায় স্থাপন করে। বোঝা এবং বিলম্বের মধ্যে সামঞ্জস্যের জন্য টাইমআউট সাধারণত 30–60 সেকেন্ড হয়।
Long Polling-এর জন্য একটি গুরুত্বপূর্ণ কনফিগারেশন প্যারামিটার হলো অপেক্ষা টাইমআউট। খুব ছোট টাইমআউট (10 সেকেন্ডের কম) অনুরোধের সংখ্যা বৃদ্ধি করে, কৌশলটিকে Short Polling-এর কাছাকাছি নিয়ে আসে। খুব দীর্ঘ টাইমআউট (120 সেকেন্ডের বেশি) মধ্যবর্তী প্রক্সি এবং লোড ব্যালেন্সার দ্বারা সংযোগ বিচ্ছিন্ন হতে পারে। বেশিরভাগ পরিস্থিতির জন্য প্রস্তাবিত মান 30–45 সেকেন্ড।
যদি একটি Long Polling অনুরোধের মধ্যে সার্ভারে একাধিক ইভেন্ট ঘটে, তাহলে সার্ভারকে সেগুলি একটি প্রতিক্রিয়ায় পাঠাতে হবে বা ক্লায়েন্ট পাশে একটি ইভেন্ট কিউ সংগঠিত করতে হবে। এর জন্য, ইভেন্ট বাফারিং ব্যবহৃত হয়: সার্ভার অনুরোধের ধরে রাখার সময়ে ঘটে যাওয়া ইভেন্টগুলি জমা করে এবং প্রতিক্রিয়া বডিতে ডেটার একটি অ্যারে হিসেবে প্রেরণ করে।
আধুনিক Fetch API ব্যবহার করে ক্লায়েন্ট পাশে একটি সরল Long Polling বাস্তবায়ন দেখি। ক্লায়েন্ট ফাংশন একটি অনুরোধ পাঠায় এবং প্রতিক্রিয়া পাওয়ার পর পুনরাবৃত্তভাবে নিজেকে কল করে।
async function longPoll(url) {
try {
const response = await fetch(url);
const data = await response.json();
handleData(data);
longPoll(url);
} catch (error) {
console.error("লং পোলিং ত্রুটি", error);
setTimeout(() => longPoll(url), 3000);
}
}
function handleData(data) {
if (data.events && data.events.length > 0) {
data.events.forEach(event => {
console.log("নতুন ইভেন্ট:", event);
});
}
}
longPoll("/api/events");
এই কোডটি একটি অসীম Long Polling লুপ তৈরি করে: প্রতিক্রিয়া পাওয়ার পর, ফাংশন তাৎক্ষণিকভাবে একটি নতুন অনুরোধ পাঠায়। সংযোগ ত্রুটির ক্ষেত্রে, সার্ভারে হিমধারা বোঝা এড়াতে পুনরায় চেষ্টার আগে একটি তিন সেকেন্ডের বিলম্ব নির্ধারণ করা হয়।
সার্ভার পাশে, একটি ইভেন্ট হওয়া বা টাইমআউট শেষ হওয়া পর্যন্ত অনুরোধ ধরে রাখা প্রয়োজন। Node.js-এ EventEmitter ব্যবহার করে একটি বাস্তবায়ন উদাহরণ এই প্রক্রিয়াটি প্রদর্শন করে।
const express = require("express");
const EventEmitter = require("events");
const app = express();
const eventBus = new EventEmitter();
app.get("/api/events", (req, res) => {
const timeout = setTimeout(() => {
res.json({ events: [] });
}, 30000);
eventBus.once("new-event", (data) => {
clearTimeout(timeout);
res.json({ events: [data] });
});
});
app.post("/api/events", (req, res) => {
eventBus.emit("new-event", req.body);
res.send({ status: "ok" });
});
app.listen(3000);
সার্ভার অংশটি নতুন ডেটা উপস্থিত হলে অপেক্ষামান Long Polling সংযোগগুলিকে জানানোর জন্য EventEmitter ব্যবহার করে। 30 সেকেন্ড টাইমআউট অতিক্রম করলে, সার্ভার একটি খালি ইভেন্ট অ্যারে ফেরত দেয়, এবং ক্লায়েন্ট একটি নতুন অনুরোধ তৈরি করে।
Long Polling সেই পরিস্থিতিতে ব্যবহৃত হয় যেখানে রিয়েল-টাইম ডেটা বিতরণ প্রয়োজন কিন্তু প্রযুক্তিগত বা অবকাঠামোগত কারণে WebSocket ব্যবহার সম্ভব নয়। সবচেয়ে সাধারণ ক্ষেত্র হলো কর্পোরেট প্রক্সি এবং ফায়ারওয়াল যা WebSocket সংযোগ অবরুদ্ধ করে, পাশাপাশি সার্ভার পাশে সীমিত প্রোটোকল সমর্থন সহ পরিবেশ।
মূল কারণ Long Polling নির্বাচনের পিছনে হলো পশ্চাৎমুখী সামঞ্জস্য। সকল HTTP ক্লায়েন্ট এবং সার্ভার এই পদ্ধতি সমর্থন করে, যা এটিকে অতিরিক্ত নির্ভরতা ছাড়া রিয়েল-টাইম কার্যকারিতার জন্য একটি সার্বজনীন সমাধান করে তোলে। HTTP Archive (2024) অনুযায়ী, প্রায় 8% ওয়েবসাইট মৌলিক রিয়েল-টাইম কার্যকারিতার জন্য Long Polling ব্যবহার করতে থাকে।
Long Polling এবং Short Polling একই সমস্যা সমাধান করে — সার্ভার থেকে ক্লায়েন্টে ডেটা পৌঁছানো — কিন্তু প্রক্রিয়া এবং দক্ষতায় মৌলিকভাবে ভিন্ন। Short Polling একটি নির্দিষ্ট পোলিং ব্যবধান ব্যবহার করে যেখানে ক্লায়েন্ট সার্ভারে নতুন ডেটা দেখা দেওয়ার দ্বিক না পক্ষে সমান সময় ব্যবধানে HTTP অনুরোধ পাঠায়।
| বৈশিষ্ট্য | Long Polling | Short Polling |
|---|---|---|
| প্রতিক্রিয়া সূচনা | সার্ভার ইভেন্টে ডেটা পাঠায় | সার্ভার প্রতিটি ক্লায়েন্ট অনুরোধে সাড়া দেয় |
| বিতরণ বিলম্ব | সর্বনিম্ন, 1 সেকেন্ড পর্যন্ত | পোলিং ব্যবধানের উপর নির্ভর, 3–60 সেকেন্ড |
| অনুরোধের সংখ্যা | প্রতি ইভেন্ট বা টাইমআউট 1 অনুরোধ | প্রতি সময় এককে N অনুরোধ (নির্দিষ্ট) |
| নিষ্ক্রিয় ট্রাফিক | কম (একটি খোলা অনুরোধ) | উচ্চ (প্রতি N সেকেন্ডে অনুরোধ) |
| সার্ভার বোঝা | সংযোগ ধরে রাখা | বারবার অনুরোধ প্রক্রিয়াকরণ |
| বাস্তবায়ন জটিলতা | মধ্যম (অ্যাসিনক্রোনাস প্রক্রিয়াকরণ) | কম (সাধারণ HTTP অনুরোধ) |
Short Polling বাস্তবায়নে সহজ কিন্তু একই ডেটা আপডেট ফ্রিকোয়েন্সিতে সার্ভার এবং নেটওয়ার্কে উল্লেখযোগ্যভাবে অধিক বোঝা তৈরি করে। যদি 5 সেকেন্ডের কম বিলম্ব প্রয়োজন হয়, তাহলে Short Polling প্রতি মিনিটে ডজন খানেক অনুরোধ উৎপন্ন করে, যেখানে Long Polling প্রতি ইভেন্ট বা টাইমআউট একটি অনুরোধ ব্যবহার করে। অপ্রতিবর্তী ইভেন্টের জন্য, Long Polling ট্রাফিকে বহু-গুণ অধিক দক্ষ।
WebSocket একটি পূর্ণ দ্বি-মুখী রিয়েল-টাইম প্রোটোকল যা প্রাথমিক HTTP হ্যান্ডশেকের পর TCP-তে কাজ করে। Long Polling-এর বিপরীতে, WebSocket একটি একক স্থায়ী সংযোগ স্থাপন করে এবং সার্ভারকে যেকোনো সময় নতুন HTTP অনুরোধ না করে ক্লায়েন্টে ডেটা পাঠানোর অনুমতি দেয়।
Long Polling এবং WebSocket-এর মধ্যে পছন্দ বেশ কিছু কারণের উপর নির্ভর করে। সামঞ্জস্য: Long Polling যেকোনো প্রক্সি এবং ফায়ারওয়ালের মাধ্যমে কাজ করে, যেখানে WebSocket কর্পোরেট নেটওয়ার্ক দ্বারা অবরুদ্ধ হতে পারে। কর্মদক্ষতা: WebSocket-এর কম ওভারহেড (পূর্ণ HTTP হেডারের বিপরীতে প্রতি ফ্রেম 2 বাইট) আছে, যা উচ্চ বার্তা ফ্রিকোয়েন্সিতে গুরুত্বপূর্ণ। মাপনীয়তা: Long Polling-এর একাধিক সংযোগ ধরে রাখার কারণে সার্ভার-পাশে অধিক সম্পদ প্রয়োজন, যেখানে WebSocket প্রতি সেশনে একটি নির্দিষ্ট সংযোগ ব্যবহার করে।
Mozilla Developer Network (2024) অনুযায়ী, WebSocket 2011–2015 সংস্করণ থেকে সকল আধুনিক ব্রাউজার দ্বারা সমর্থিত, কিন্তু কর্পোরেট প্রক্সি (উদাহরণ Symantec Blue Coat) 15–20% কর্পোরেট নেটওয়ার্কে এটি অবরুদ্ধ করতে থাকে, যা Long Polling-কে একটি ফ্যালব্যাক সমাধান হিসেবে প্রাসঙ্গিক রাখে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Long Polling হলো যখন একটি ক্লায়েন্ট সার্ভারকে বলে: "যখন নতুন ডেটা উপলব্ধ হয় তখন সাড়া দাও", এবং সার্ভার একটি ইভেন্টের অপেক্ষায় সংযোগটি খোলা রাখে। যত্ক্ষণ ডেটা আসে, সার্ভার সাড়া দেয়, এবং ক্লায়েন্ট তাৎক্ষণিকভাবে আবার একই প্রশ্ন জিজ্ঞাসা করে।
Short Polling-এ, ক্লায়েন্ট প্রতি N সেকেন্ডে সার্ভারকে জিজ্ঞাসা করে যে ডেটা আছে কিনা, না থাকলেও। Long Polling-এ, ক্লায়েন্ট একবার জিজ্ঞাসা করে, এবং সার্ভার কেবল তখনই সাড়া দেয় যখন ডেটা প্রকৃতই উপলব্ধ হয়। Long Polling কম খালি অনুরোধ তৈরি করে এবং নেটওয়ার্ক বোঝা হ্রাস করে।
Long Polling ব্যবহার করা উচিত যখন WebSocket উপলব্ধ নয়: কর্পোরেট নেটওয়ার্কে যা অ-HTTP প্রোটোকল অবরুদ্ধ করে, যখন পুরনো ব্রাউজার এর সাথে পশ্চাৎমুখী সামঞ্জস্যের প্রয়োজন হয় বা হোস্টিং পক্ষে সীমাবদ্ধতা থাকে। উচ্চ-ফ্রিকোয়েন্সি ডেটা আদানপ্রদানের জন্য WebSocket অধিক দক্ষ।
Long Polling-এর জন্য প্রস্তাবিত টাইমআউট হলো 30–45 সেকেন্ড। কম মান (10–15 সেকেন্ড) অনুরোধের সংখ্যা বাড়ায়, যখন একটি বেশি মান (60+ সেকেন্ড) মধ্যবর্তী লোড ব্যালেন্সার দ্বারা সংযোগ বিচ্ছেদের ঝুঁকি বাড়ায়। টাইমআউট মান নেটওয়ার্ক আর্কিটেকচার এবং বিলম্ব প্রয়োজনীয়তার উপর নির্ভর করে।
Long Polling-এর প্রধান ত্রুটিগুলো হলো: হাজার সংযোগ ধরে রাখার সময় সার্ভারে উচ্চ মেমোরি ব্যবহার, অনুভূমিক স্কেলিংয়ে অসুবিধা (একটি কেন্দ্রীয় ইভেন্ট কিউ প্রয়োজন) এবং প্রকৃত দ্বি-মুখী যোগাযোগের অভাব — সার্ভারে ডেটা পাঠানোর জন্য পৃথক POST অনুরোধের প্রয়োজন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।