Ideas Innovation Creativity Knowledge Inspiration Vision Concept

ارسال پیام به کلاینت های تحت وب با روش Long Polling

بهمن ۲, ۱۳۹۵

برچسب‌ها, , , , ,

سال ها پیش گپ قابل ملاحظه ای بین رابط های کاربری دسکتاپ و وب وجود داشت. رابط های کاربری دسکتاپ به طور کلی تجربه کاربری بهتری را در اختیار می گذاشتند. دلیل اصلی این بود که رابط های کاربری تحت وب به خوبی رابط های کاربری دسکتاپ پیام دریافتی از سرور را در کلاینت نمایش نمی دادند. به عنوان مثال جهت نمایش جواب دریافتی از سرور کل صفحه وب بروز رسانی می گردید! البته کمپانی های تولید کننده نرم افزار های تحت وب بیکار ننشستند و با خلق فن آوری های جدید مانند Applet، Adobe Flash و Comet به رقابت با رقیب خود پرداختند. بعضی های دیگر نیز فقط به استفاده از ارسال و دریافت پیام با Ajax بسنده کردند. ولی با همه این تکنولوژی ها، آنها نتوانستند با رابط های کاربری دسکتاپ رقابت کنند.

این روزها انتظار می رود که رابط های کاربری وب چیزی از رقیب دیرینه خود کم نداشته باشند. که البته پیاده سازی رابط کاربری چشم نواز و کارآمد به لطف تکنولوژی های طراحی Rich Front-End مانند Bootstrap و تکنولوژی های پردازشی مانند JQuery و Angular JS که به خوبی تغییرات کلاینت را به سرور انتقال می دهند کار سختی نیست.

اما توزیع پیام های سرور به کلاینت های وب چطور؟ خوشبختانه تکنولوژی امروز این نیاز را برآورده می نماید. در این مقاله می خواهیم با یکی از این راه حل ها به نام Long Polling آشنا شویم و جایگزین های آن را نیز بشناسیم.

Long Polling چیست؟

سال ها برنامه های کاربردی وب به صورت چند لایه طراحی می شدند که در آنها هیچ پیامی بدون آنکه کلاینت آن را درخواست کرده باشد از طرف سرور ارسال نمی گردید. در واقع شروع کننده ارتباط همیشه کلاینت بوده است. در نتیجه تغییری که در سرور ایجاد گردیده و نیاز به توزیع به کلاینت ها دارد پروسه زمان بری بوده است. راه حل دور زدن این محدودیت Long Polling بوده است.

Long Polling یک تکنیک برای ارسال پیام به کلاینت است. بعد از اینکه کلاینت درخواست داده می نماید، سرور کانکشن را تا زمان آماده سازی پیام نگه می دارد. به محض تکمیل پیام در سمت سرور، درخواست معطل مانده توسط توسط سرورتکمیل شده وبه کلاینت ارسال می شود. سرور می تواند اتصال (Connection) را برای ارسال پیام جدید باز نگه دارد و یا تنها به کلاینت اطلاع دهد که پیام جدیدی وجود ندارد و اتصال را ببندد. در روش دوم کلاینت بلافاصله درخواست جدیدی ارسال می کند و این چرخه مدام تکرار می شود.

Long Polling انواع مختلفی دارد. همانطور که اشاره شد در ساده ترین حالت بدین صورت عمل می نماید که کلاینت در بازه های زمانی مشخص به سراغ سرور می رود. در صورت وجود داده جدید، آنها برای کلاینت ارسال می شوند و در صورت عدم وجود تنها اطلاع داده می شود که پیامی برای ارسال وجود ندارد. این روش زمانی مناسب است که نرخ دریافت داده جدید زیاد نباشد و در ضمن دریافت داده نه چندان جدید مشکل ساز نشود. نسخه دیگر این است که سرور درخواست کلاینت را تا زمان در دسترس قرار گرفتن داده جدید نگه می دارد که در مورد آن بیشتر توضیح خواهم داد.

جایگزین های Long Polling

جایگزین های اصلی Long Polling عبارتند از: Web Socket و Server Sent Events(SSE).
Web Socket روشی استاندارد جهت ارتباط کاملا دو طرفه بر روی پروتکل TCP بین کلاینت و سرور است. این روش به صورت گسترده مورد استفاده قرار می گیرد. از مهمترین مزایای آن می توان به کاهش قابل ملاحظه ترافیک بین کلاینت و سرور اشاره کرد. و از نقاط ضعف آن می توان عدم پشتیبانی تمام مرورگرها از آن نام برد. همینطور روترهای شبکه قدیمی که برای ارتباط HTTP بهینه شده اند ممکن است اتصال Web Socket را قطع و یا داده های دریافتی از سرور را Cache کنند.

SSE تکنولوژی استاندارد دیگری است که از طریق آن مرورگر می تواند آپدیت های جدید را از طریق ارتباط HTTP از سرور دریافت نماید. این تکنولوژی امکاناتی مانند Automatic Reconnection را به صورت ذاتی پشتیبانی می نماید ولی مانند Web Socket تمامی مرورگرها از آن پشتیبانی نمی نمایند.

پس همانطور که ملاحظه می کنید Long Polling کماکان به عنوان یک روش مطمئن و قابل اتکا در بسیاری از سیستم ها پیاده سازی می گردد تا لااقل به عنوان راه حل دوم در صورت عدم امکان استفاده از دو تکنولوژی نام برده، جایگزین گردد.

کمک بزرگ جاوا برای استفاده از Long Polling

همانطور که گفته شد Long Polling یک روش برای ارسال داده به کلاینت است و به صورت فراخوانی ممتد کلاینت برای بررسی وجود داده جدید و یا نگه داشتن درخواست کلاینت تا زمان در دسترس قرار گرفتن داده جدید عمل می نماید. در صورت استفاده از روش دوم به علت گیر افتادن یک Thread برای سرویس دهی به یک درخواست که ممکن است مدت زمان زیادی طول بکشد، بازده سیستم کاهش پیدا می نماید. اگر از جاوا برای توسعه سیستم های Backend استفاده می کنید، خبر خوب برای شما این است که در Servlet(تکنولوژی جاوا برای پردازش درخواست های ارسالی به وب سرور) نسخه ۳ این امکان وجود دارد که Thread فراخوانی شده توسط Servlet Container به صورت ناهمگام پردازش گردد که به عنوان ویژگی asynchronous processing شناخته می شود.

با ارسال پیام به سرور، اطلاعات درخواست جدید در یک آبجکت ناهمگام جدید کپسوله می گردد که خارج از Servlet قابل استفاده است. Thread ای که درخواست را تحویل Servlet داده است به وب سرور بر می گردد و می تواند درخواست های جدید دریافتی از کلاینت های دیگر را سرویس دهی کند. در عوض، آبجکت ناهمگام می تواند توسط برنامه نویس در Thread جداگانه ای پردازش شود و به محض آماده شده پیام جهت ارسال به کلاینت، داده جدید در آبجکت ناهمگام نوشته شده و به عنوان درخواست تکمیل شده علامت زده شود. با این کار پاسخ سرور به کلاینت ارسال می شود و چرخه تکمیل می گردد.

منبع: Java Magazine

 

امیر حاجی زاده

از ۱۷ سالگی وارد دنیای برنامه نویسی شدم و همیشه از خلق محصول و یا سرویس نرم افزاری که باعث رضایت کاربر میشه لذت برده ام. علاقه مند به تکنولوژی های جدید و تعامل با افراد شاغل در حوزه تولید نرم افزار.

More Posts

Follow Me:
LinkedIn

1 پسند