হালনাগাদ
আমি এটির উপর ক্রমাগত প্রাপ্তি অব্যাহত রাখার সাথে সাথে আমি মনে করি যে এই উত্তরটি 4 বছরের পুরাতন মনে রাখা যুক্তিযুক্ত। ওয়েব সত্যিই দ্রুত গতিতে বেড়েছে, সুতরাং দয়া করে এই উত্তরটি সম্পর্কে সচেতন হন।
আমি সম্প্রতি একই সমস্যা ছিল এবং বিষয়টি নিয়ে গবেষণা করেছি।
প্রদত্ত সমাধানটিকে দীর্ঘ পোলিং বলা হয় এবং সঠিকভাবে এটি ব্যবহার করার জন্য আপনাকে অবশ্যই নিশ্চিত হওয়া উচিত যে আপনার এজেএক্স অনুরোধটির একটি "বড়" সময়সীমা শেষ হয়েছে এবং সর্বদা শেষের পরে (সময়সীমা, ত্রুটি বা সাফল্য) পরে এই অনুরোধটি করা উচিত।
দীর্ঘ পোলিং - ক্লায়েন্ট
এখানে কোডটি সংক্ষিপ্ত রাখতে আমি jQuery ব্যবহার করব:
function pollTask() {
$.ajax({
url: '/api/Polling',
async: true, // by default, it's async, but...
dataType: 'json', // or the dataType you are working with
timeout: 10000, // IMPORTANT! this is a 10 seconds timeout
cache: false
}).done(function (eventList) {
// Handle your data here
var data;
for (var eventName in eventList) {
data = eventList[eventName];
dispatcher.handle(eventName, data); // handle the `eventName` with `data`
}
}).always(pollTask);
}
এটি মনে রাখা গুরুত্বপূর্ণ ( jQuery ডক্স থেকে ):
JQuery 1.4.x এবং এর নীচে XMLHttpRequest অবজেক্টটি যদি অনুরোধটির সময়সীমা বেঁধে দেয় তবে অবৈধ অবস্থায় থাকবে; যে কোনও অবজেক্টের সদস্যদের অ্যাক্সেস ব্যতিক্রম হতে পারে। শুধুমাত্র ফায়ারফক্স 3.0.০+ তে, স্ক্রিপ্ট এবং জেএসএনপি অনুরোধগুলি একটি সময়সীমা দ্বারা বাতিল করা যায় না; স্ক্রিপ্টটি সময়সীমা পেরিয়ে যাওয়ার পরেও চলবে।
দীর্ঘ পোলিং - সার্ভার
এটি কোনও নির্দিষ্ট ভাষায় নয়, তবে এটি এমন কিছু হবে:
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
এখানে, hasTimedOut
আপনার কোডটি চিরকালের জন্য অপেক্ষা না করে তা নিশ্চিত করবে এবং anythingHappened
কোনও ইভেন্ট হ্যাণ্ডড হয়েছে কিনা তা পরীক্ষা করবে will এটি sleep
হ'ল আপনার থ্রেডটি অন্যান্য জিনিসগুলি করার জন্য মুক্ত করার জন্য যখন কিছুই ঘটে না। events
JSON ফর্ম্যাটে ঘটনা অভিধান (অথবা অন্য কোন ডাটা স্ট্রাকচার আপনি পছন্দ করতে পারেন) ফিরে আসবে (অথবা অন্য কোন আপনি পছন্দ)।
এটি অবশ্যই সমস্যার সমাধান করে, তবে, যদি আপনি গবেষণা করার সময় যেমন ছিলাম তেমনি স্কেল্যাবিলিটি এবং পারফরম্যান্স সম্পর্কে উদ্বিগ্ন হন তবে আপনি খুঁজে পেতে পারেন এমন আরও একটি সমাধান বিবেচনা করতে পারেন।
সমাধান
সকেট ব্যবহার করুন!
ক্লায়েন্ট পক্ষ থেকে, কোনও সামঞ্জস্যতা সমস্যা এড়ানোর জন্য, সকেট.ইও ব্যবহার করুন । এটি সরাসরি সকেট ব্যবহার করার চেষ্টা করে এবং সকেট পাওয়া না গেলে অন্যান্য সমাধানগুলিতে ফলব্যাক থাকে।
সার্ভারের পাশে, নোডজেএস (উদাহরণস্বরূপ ) ব্যবহার করে একটি সার্ভার তৈরি করুন । ক্লায়েন্ট সার্ভারের সাথে তৈরি এই চ্যানেলটির (পর্যবেক্ষক) সাবস্ক্রাইব করবে। যখনই কোনও বিজ্ঞপ্তি প্রেরণ করতে হবে, এটি এই চ্যানেলে প্রকাশিত হবে এবং সাবস্ক্রিপ্টর (ক্লায়েন্ট) অবহিত হবে।
আপনি যদি এই সমাধানটি পছন্দ না করেন তবে এপিই ( আজাক্স পুশ ইঞ্জিন ) ব্যবহার করে দেখুন।
আশা করি আমি সাহায্য করেছি।