# مباحث مرتبط با توسعه وب > طراحی وب (Web Design) >  Comet تکنولوژی جدید وب

## bamdadd

منبع اصلی : http://www.bamdad.info/?p=9

*کامیت* نام معماری از وب است که در آن وب سرور ، اطلاعات را به صورت نا متقارن به سمت کلاینت ( معمولاّ مرورگر وب ) می فرستد بدون آنکه کلاینت صریحاً درخواستی کرده باشد.کامیت به شما این امکان را می دهد که بر اساس رخداد ها عمل کنید ، به صورت زنده با مرورگر تراکنش داشته باشید که در حالت های دیگر ( سایر معماری ها ) امکان پذیر نیست.
واژه *کامیت* از سال 2006 مطرح شد ولی از سال ها قبل تحت نام های  _server push_, _HTTP push_, _HTTP streaming_, _Pushlets_, _Reverse Ajax_ و.... به کار می رفته است.

اپلیکیشن های کامیت  ارتباط های طولانی مدت HTTP بین وب سرور و کلاینت دارند (Long-Lived)  که به سرور اجازه میدهد با وقفه به درخواست ها  پاسخ دهد ، و هر موقع اطلاعات جدیدی بوجود آمد آن ها را به سمت کلاینت Push  کنند.این متغایر با تعریفی که از ابتدا در مورد وب شده است می باشد که در آن مرورگر صفحه ی کامل وبی را در قبال فرستادن درخواست می گیرد.همچنین با مدلی که از آژاکس نیز ارائه شده است هم متغایر است که در آن مرور گر با درخواست خود  قطعه ای  از اطلاعات را برای بروز رسانی صفحه ی کنونی به کار می برد.

اثری که کامیت می گذارد بسیار شبیه اپلیکیشن هایی که به طور سنتی از آژاکس به همراه Polling برای چک کردن  اطلاعات جدید بوجود آمده در سرور برای بروز رسانی صفحه می باشد.
ولی عملکرد بسیار بهینه شده و تاخیر و server load  بسیار کم شده است.


ممنون میشم اشکال هامو بگیرید : bamdadd@gmail.com

----------


## bamdadd

منبع اصلی : http://www.bamdad.info/?p=10

اپلیکیشن های وب همیشه نسبت به اپلیکیشن های دسکتاپ کم توانا تر  و کم انعطاف پذیر تر بودند به خاطر وجود محدودیت های دسترسی به منابع محلی و شبکه  ای  و همچنین محدودیت هایی  که برنامه های درون مرورگری داشتند.از وقتی مرورگرها  پیشرفت کردند ، بسیاری از این محدودیت ها برداشته شد و همین باعث بوجود آمدن  اپلیکیش های توانای اینترنت شد.(Rich Internet Applications ) و اپلیکیشن های وب  شبیه تر و شبیه تر به اپلیکیشن های دسکتاپ شدند.
یکی از این مشکلات آن بود که هر قطعه ای از اطلاعات که از سمت سرور به سمت کاربر می  رفت باید از طرف کاربر صراحتاّ درخواست می شد.  که این مشکل با بوجود آمدن *کامیت* برداشته شد.*کامیت* به سرور اجازه می داد به صورت زنده به رخ داد ها پاسخ  دهد مانند به روز شدن منابع اطلاعات یا تغییر در آن ( شما شاهد تغییر آنی آن خواهید  بود ) یا فرستادن پیغامی از طرف کاربر.کامیت بهترین راه حل برای حل این محدودیت می  باشد.
فرض کنید شما نشستید و آخرین تغییرات قیمت طلا را مشاهده می کنید برای اینکه قیمت  جدید را ببینید احتیاجی نیست از جاوا ، فلش یا ... استفاده کنید. شما با کامیت فقط  احتیاج به یک مرورگر دارید.به محض تغییر در سرور در مرورگر شما اطلاعات بروز می  شوند بدون اینکه از شما درخواستی برای بروز شدن فرستاده شده باشد.

----------


## oxygenws

البته منبع اصلی اینجاست:
http://en.wikipedia.org/wiki/Comet_(programming)

به هر حال به نظرم چیز عجیبی نیست و ایجاد اتصالات ثابت با سرور نه تنها باعث کاهش server load نمی شه، بلکه «در صورت کم بودن نسبی حافظه» باعث زیاد شدن server load هم میشه.

ضمن اینکه شاید در این زمان با وجود امکانی مثل Ajax دیگه comet مورد نیاز نباشه، دقیقا به همین دلیل ثابت بودن اتصال به سرور و نیاز اتصال دائم به اینترنت برای کار کردن، به نظر من مردود است :)

----------


## bamdadd

احساس می کنم هنوز کاربر این تکنولوژی رو درک نکردید.
برای همین از چند مثال استفاده می کنم.
این مثال ها مربوط به Light Streamer  نام فریم ورکی تجاری برای Comet و Ajax می باشد.
توجه داشته باشید که در آن واحد فقط یک اپلیکیشن را باز کنید و چند تا با هم باز نکنید.
برای سرعت بیشتر از مرورگر فایر فاکس استفاده کنید.

1- نمودار زنده :
http://app.lightstreamer.com/ChartDemo/

2- لیست زنده قیمت های بازار بورس : 
http://app.lightstreamer.com/StockLi...x.html?fade=ON

Rss خوان زنده :
http://app.lightstreamer.com/RSSDemo

مونیتوریگ زنده سرور  ( برای پهنای باند ، رم ، CPU ...)
http://app.lightstreamer.com/MonitorConsole/

اندازه گیری از راه دور مسابقات فرمول 1 :
http://app.lightstreamer.com/WebTelemetryDemo/

----------


## bamdadd

شما با استفاده از آژاکس با همچین کیفیتی نمیتوانید این اپلیکیشن ها را روی وب داشته باشید.
این تکنولوژی می تواند کاربرد های زیادی در وب داشته باشد، سال هاست برای داشتن چنین اپلیکیشن هایی از جاوا ، فلش و ... استفاده می شده ، واقعا به نظر شما چیز عجیبی نیست؟
برای سرور لود و بند ویت هم در این تکنولوژی راه حل هایی ارائه شده. 
برای همینه که از کامیت به عنوان یک تکنولوژی میشه نام برد و نه یه تکنیک
در ادامه مقالات به همه موارد می پردازم.
امیدوارم با دیدن مثال ها براتون جذاب تر شده باشه این تکنولوژی

----------


## oxygenws

نه، هنوز جذاب نیست برام. اگر می تونی خودت یک نمونه کد ۳-۴ خطی اینجا بنویس.

حدود سال ۲۰۰۱ یه ساعت نوشته بودم که تمام مدت به سرور وصل بود و آخرین ساعت رو از سرور می گرفت و ساعت کلاینت به روز می شد، البته اون کار کاملا تست و آزمایش بود، می تونست به راحتی به شکل یک نمودار هم بشه!

اما با توجه به تجربه ای که در زمینهء سرور داری دارم، کامیت پدر سرور رو در میاره و حتی ارزش فکر کردن نداره.

منتظر یک مثال ۳ یا ۴ خطی هستم، یا اینکه یک مثالی که کد های جاوا اسکریپتش کد/مخدوش نشده باشه.

ممنون، موفق باشید.

----------


## bamdadd

چشم دوست عزیز حتما کد نمونه میگذارم 
برای استفاده از کامیت باید از سرور های اوپتیمایز شده استفاده کرد

----------


## oxygenws

یه نمونهء ساده تو لینک زیر پیدا کردم:
http://www.zeitoun.net/index.php?200...comet-with-php

دقیقا همون روشی است که من اون سال اسفاده کردم.

یه iframe ایجاد می کنه و یک درخواستی توی iframe ارسال میشه و اتصال این درخواست هیچ وقت بسته نمی شه آخرین اطلاعات از سرور به سمت کلاینت میاد و با کمک جاوا اسکریپت به فرم نمایشی در میاد (مثل آژاکس)

و خوب این روش کاملا یک ابزار است و اصلا یک تکنیک نیست. و شدیدا شدیدا شدیدا پدر سرور رو در میاره. چون حداقل روی سرور های عمومی و معمولی، اتصال روی سرور باز می مونه، حتی زمانی که شما از سرور قطع بشید.

دقیقا به همین دلیله که این lightstreamer نمی ذاره شما بیشتر از یک اتصال داشته باشید، چون می تونید باعث بشید سرور بخوابه.

اینم کدی است که اون زمان نوشته بودم :) من با iframe و جاوا اسکریپت کار نکرده بودم، اما منطق دقیقا همینی است که توی کامیت هست.
http://oxygenws.com/php/time.phps

----------


## bamdadd

> یه نمونهء ساده تو لینک زیر پیدا کردم:
> http://www.zeitoun.net/index.php?200...comet-with-php
> 
> دقیقا همون روشی است که من اون سال اسفاده کردم.
> 
> یه iframe ایجاد می کنه و یک درخواستی توی iframe ارسال میشه و اتصال این درخواست هیچ وقت بسته نمی شه آخرین اطلاعات از سرور به سمت کلاینت میاد و با کمک جاوا اسکریپت به فرم نمایشی در میاد (مثل آژاکس)
> 
> و خوب این روش کاملا یک ابزار است و اصلا یک تکنیک نیست. و شدیدا شدیدا شدیدا پدر سرور رو در میاره. چون حداقل روی سرور های عمومی و معمولی، اتصال روی سرور باز می مونه، حتی زمانی که شما از سرور قطع بشید.
> 
> ...


دوست عزیز منم دقیقا می خواستم همین مثالو بگذارم ، بد نیست منتظر مطالب بعدی هم باشید و زود قضاوت نکنید. استفاده از iframe یکی از تکنیک هایcomet  می باشد. من هنوز به بحث های تکنیکی نرسیدم. برای استفاده از کامیت باید سرور رو منحصرا پیکربندی کنید.
استفاده از کامیت برای هر اپلیکیشنی توصیه نمیشود. باید ماهیت اپلیکیشن بطلبه !!!
LightStreamer هم نسخه های مختلف داره. میتونید اون ها رو با هم مقایسه کنید.
من باز هم مثال ها و فریم ورک های مختلف می گذارم

----------


## bamdadd

> حدود سال ۲۰۰۱ یه ساعت نوشته بودم که تمام مدت به سرور وصل بود و آخرین ساعت رو از سرور می گرفت و ساعت کلاینت به روز می شد، البته اون کار کاملا تست و آزمایش بود، می تونست به راحتی به شکل یک نمودار هم بشه!


دوست عزیز پس شما جزو پیش تازان این تکنولوژی بودید.




> اما با توجه به تجربه ای که در زمینهء سرور داری دارم، کامیت پدر سرور رو در میاره و حتی ارزش فکر کردن نداره.


خب من تجربه شما در مورد سرور رو ندارم ولی خیلی از بزرگان در مورد این تکنولوژی و آینده آن بحث می کنند. لینک زیر از سایت معتبر آژاکسیان در مورد کامیت می باشد.
اگه دقت کرده باشید بار ها هم گفتم، کامیت یک تکنولوژی هست که به فکر مقدار منابعی که سرور میگیره هم بوده.
http://ajaxian.com/by/topic/comet/
مقاله زیر هم نوشته Joe Walker توسعه دهنده فریم ورک DWR یکی از معروف ترین فریم ورک های آژاکس می باشد.
http://cometdaily.com/2007/10/23/why...ng-importance/

لینک  http://directwebremoting.com/ DWR

حتما اسم Dojo هم به گوشتون خورده ، یک فریم ورک جاوا اسکریپت هستش که از طرف شرکت های بزرگ از جمله IBM  پشتیبانی میشه و به موازات اون پروژه روی کامیت هم کار می کنند. که نام پروژه Cometd هستش البته هنوز Realse  نشده ولی میتونید با SVN  دانلود کنید.
www.cometd.org

دنیا به کامیت فکر می کنه ! به همین راحتی نباید از کنار این تکنولوژی گذشت.

----------


## Nabi

سلام ،
این موجودی که به عنوان Comet ازش نام میبرید آیا همون Live Connection است؟ یعنی همون مثال 'ساعت' که آقا امید نوشتند؟
خب این که خیلی قدیمیه.
راستی چت Gmail هم ظاهراً از همین استفاده میکنه.
در این مورد خوندن توضیحات آقای 'علی فرهادی' در لینک زیر و مثال ساده و جالبشون خالی از لطف نیست:
http://forum.majidonline.com/showthread.php?t=46410

تشکر
نبی

----------


## oxygenws

> راستی چت Gmail هم ظاهراً از همین استفاده میکنه.


اونجا هم گفته بودم.
چت جیمیل با Ajax کار می کنه (یا نهایتا iframe برای شبیه سازی Ajax) اما در نهایت اتصال شبکه ثابت نیست و بسته میشه.

به طور پیش فرض هر ۱ ثانیه درخواست می فرسته و اگه از شبکه قطع شده باشید هر ۲۰ ثانیه تلاش می کنه.

----------


## armin390

کارت اینطور میتونه قشنگ باشه که همون صفحه ویکی رو که به فارسی ترجمه می کنی، تو ویکی پدیا قرار بدی... و البته خونسرد باشی

----------


## Folaani

مطلب جالبی بود.
بنده تا حد زیادی با نظر جناب oxygenws موافقم.
اما اینهم بالاخره بعضی جاها ممکنه کاربرد داشته باشه. مثلا نیاز به یک پاسخ نزدیکتر به realtime داشته باشیم و غیره.
ضمنا خیلی شباهت به اجاکس داره. انگار از یک خانواده هستن (فقط یکی کمی سر و ته شده!!)
بازهم ضمنا! اینکه نمیدونم چطور به این میشه گفت تکنولوژی و اینقدر بزرگش کرد؛ درحالیکه خیلی ها اعتقاد دارن به اجاکس هم نمیشه گفت تکنولوژی. اجاکس کاربردهای خیلی وسیعتری داره و چیز نسبتا متعادل و بهینه ای هست در کاربردهای عادی خودش. اما این یکی کمی حساستر و مشکل دار هست و باید مجبور باشیم تا ازش استفاده کنیم. برای کاربردهای متداول معمولی بنظرم اجاکس ترجیح زیادی داره.
اما جدا از این تاپیک این قضیه رو یاد گرفتم و خوشحالم. شاید جایی قابل استفاده بود. بنظر من هیچ روشی به خودی خود تابو نیست و کاربرد خودش رو داره. ولو ۱٪ باشه.
تنها روشهایی که با روشهای بهتری میشه تمام مزایای اونها رو هم بدست آورد دیگه کاملا از رده خارج میشن. اما اغلب میبینم که هر روشی خصوصیات و مزایا و معایبی داره که منحصر به خودش هست.
چه اشکالی داره شاید جایی مثلا اجاکس رو با Comet ترکیب کردیم و یک چیز جدید و جالب و مفیدتری بدست آوردیم که با هیچکدوم از این دو روش به تنهایی نمیشد بدست آورد. مثلا یک Comet ای که زمان طولانی و نامحدود نداره و در یک جای خاص ازش استفاده میکنیم.
راستی بنده مقاله ای راجع به این موضوع در ویکی پدیا و یک منبع اصلی دیگه پیدا نکردم.

----------


## Nabi

> ...و البته خونسرد باشی


تائید میشه! (زیاد!) 


یاد یه چیزی افتادم.

در مورد حلقه بی نهایت که با sleep درونش وقفه انداخته باشیم (شبیه ساعتی که آقا امید نوشتند) من قبلا در یه موردی تست کرده بودم متوجه شدم در لحظه ای که sleep وارد عمل شده حتی با وجود اتصال دائم با سرور و پایان نیافتن اسکریپت، باز هم cpu usage روی صفر است ! اما آقا امید اصرار داره که سرور رو دچار مشکل میکنه. داستان چیه؟

----------


## Folaani

مسئلهء سی پی یو به تنهایی نیست؛ مسئلهء کانکشن http هم هست. فکر میکنم تعداد اینطور کانکشنها هم محدودیت خاصی داره.
بنابراین شما یک کانکشن رو به مدت طولانی اشغال میکنید. حالا اگر کاربرد شما واقعا ارتباطات زیادی در زمان کوتاه نداشته باشه، اینکار هدر دادن اون اسلات هست.
هر کانکشن منابعی رو مصرف میکنه و در یک سرور که تعداد زیادی کاربر همزمان وصل شده باشن، و اون سرور کارهای دیگر هم داره، چیز جالبی نیست.
اصولا پروتکل اچ تی تی پی اینطوری طراحی شده. همهء بخشها هم بر این اساس پیش بینی و بهینه شدن.
زمان کوتاه بنظر من خوبه، اما زمانهای طولانی یا نامحدود، در کاربردهای عمومی جالب بنظر نمیرسه.

----------


## oxygenws

> باز هم cpu usage روی صفر است ! اما آقا امید اصرار داره که سرور رو دچار مشکل میکنه. داستان چیه؟


روی لینوکس خونه ات، یه پنجاه تا از این پردازش ها ایجاد کن و یه یک روزی بذار باشه :)

----------


## bamdadd

دوستان عزیز ، این مثال ساعت رو دقیقا نمیشه یه مثاله کامیت دونست ، من چند روزی نبودم بازم می نویسم 
سعی می کنم از این به بعد بیشتر به کاربرد ها بپردازم تا قابل لمس تر باشه.
براتون یه فیلم می گذارم به صورت فلش ، بد نیست اگه علاقه دارید ببینیدش

----------


## Nabi

> روی لینوکس خونه ات، یه پنجاه تا از این پردازش ها ایجاد کن و یه یک روزی بذار باشه :)


درسته ! اینطوری بین لحظاتی که request های هر connection اجرا میشن تداخل پیش میاد چون تعدادشون زیاده. شبیه به حالتی که یه اسکریپت خیلی ساده و کوچیک رو توی کرون جاب بزاریم که هر دقیقه یکبار اجرا بشه و اینجاست که داد مدیر سرور هوا میره !

----------


## bamdadd

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


Apache Bench :
برای آپاچی 1.3
httpd.apache.org/docs/1.3/programs/ab.html

برای آپاچی 2
httpd.apache.org/docs/2.0/programs/ab.html




*dajax*

برای LightHttpd Webserver:
http://www.refwell.com/blog/index.php/category/fdajax/

----------


## Nabi

> دوستان عزیز ، این مثال ساعت رو دقیقا نمیشه یه مثاله کامیت دونست ، من چند روزی نبودم بازم می نویسم 
> سعی می کنم از این به بعد بیشتر به کاربرد ها بپردازم تا قابل لمس تر باشه.
> براتون یه فیلم می گذارم به صورت فلش ، بد نیست اگه علاقه دارید ببینیدش


این فیلم با اون مثال ساعت به نظر خیلی متفاوت بودند. چون در این فیلم process پایان یافته به نظر میرسید چون در status مرورگر done شده بود(البته اگر connection پشت پرده و توسط ajax ایجاد نشده باشه) برخلاف مثال ساعت که اینطور نبود. 

خب مثال گویا و جالبی بود. ممکنه سورس همین رو بزارید ؟

----------


## bamdadd

> کارت اینطور میتونه قشنگ باشه که همون صفحه ویکی رو که به فارسی ترجمه می کنی، تو ویکی پدیا قرار بدی... و البته خونسرد باشی


دوست عزیز من یک دنیا به ویکیپدیا مدیونم
همیشه تلاشم این بوده که به ویکی نویسی کمک کنم.
منتظرم ترجمه ام مقداری کامل تر شه تا توی ویکی فارسی هم بنویسم.
ممنون

----------


## oxygenws

> این فیلم با اون مثال ساعت به نظر خیلی متفاوت بودند.


تا حالا با iframe کار کردی؟؟ :)
چیز زیاد عجیبی نیست!

----------


## bamdadd

اگه این جوری فکر کنیم کلا هیچ چیزی توی دنیای کامپیوتر عجیب نیست.

----------


## Nabi

تا سورس مثال Hello world که در فیلم بود رو نبینم نظری ندارم !

----------


## Farhadi

سلام

در کل من با نظر امید هم موافقم هم مخالف.
به نظر من استفاده از comet در هر شرایطی توصیه نمیشه. ولی در بعضی شرایط استفاده ازش اجتناب ناپذیره.

بهترین مثال یک برنامه چت هست.
در یک برنامه چت یا باید هر یک یا دو ثانیه به سرور وصل شیم و سرور رو چک کنیم یا اینکه یک ارتباط دائم برقرار کنیم. حالا به نظر شما کدوم یکی از این دو حالت پردازش و زمان بیشتری رو می‌طلبه. به نظر من حالت دوم بهینه تره. هم برای کاربر هم برای سرور.

برای کاربر به این دلیل که زمان تاخیر ناشی از برقراری ارتباط(network latency) حذف میشه و این خیلی اهمیت داره چون این تاخیر بستگی به سرعت اینترنت شما نداره و حتی در حالتی که از سرعت زیادی برخوردار باشید این تاخیر وجود داره. یه جمله معروف در این زمینه هست که یادم نیست کی گفته:
These days, bandwidth is cheap, latency expensive. 
 ضمن اینکه کلی از بار ترافیک شبکه هم کم میکنه. 

و اما در مورد سرور اگر بگیم که لود زیادی میگیره بی انصافیه. چون فکر نمیکنم لودش بیشتر از کانکشن های پی در پی یک یا دو ثانیه ای باشه. البته این نکته هم مهمه که بتونیم این کانشکن های باز رو به خوبی مدیریت کنیم و تعداد کانکشن ها رو به حداقل برسونیم. ضمن اینکه پهنای باند  کمتری از سرور رو مصرف میکنه.

در مورد چت gmail هم که قبلا در موردش مفصل صحبت شد. همون موقع من خودم با sniffer چک کردم و مطمئن شدم که گوگل هم از comet استفاده میکنه.

----------


## oxygenws

> در کل من با نظر امید هم موافقم هم مخالف.


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




> برای کاربر به این دلیل که زمان تاخیر ناشی از برقراری ارتباط(network latency) حذف میشه و این خیلی اهمیت داره چون این تاخیر بستگی به سرعت اینترنت شما نداره و حتی در حالتی که از سرعت زیادی برخوردار باشید این تاخیر وجود داره.


این مورد رو میشه توسط keep alive توی HTTP1.1 تا حدود زیادی برطرف کرد. (اینکه می گم «تا حدود زیادی» به خاطر اینه که ساختار فریم ورک های کامت رو نمی دونم چیه!)




> و اما در مورد سرور اگر بگیم که لود زیادی میگیره بی انصافیه. چون فکر نمیکنم لودش بیشتر از کانکشن های پی در پی یک یا دو ثانیه ای باشه. البته این نکته هم مهمه که بتونیم این کانشکن های باز رو به خوبی مدیریت کنیم و تعداد کانکشن ها رو به حداقل برسونیم. ضمن اینکه پهنای باند کمتری از سرور رو مصرف میکنه.


به طور پیشفرض خیلی به سرور فشار میاره، چون کلا وب سرور برای این کار بهینه نشده. روی آپاچی یه سری ابزار هست که در این زمینه کمکت کنند، مثل این:
http://en.wikipedia.org/wiki/Mod_qos
یا اینکه از وب سرور های اختصاصی (یا اختصاصی شده) استفاده بشه.




> در مورد چت gmail هم که قبلا در موردش مفصل صحبت شد. همون موقع من خودم با sniffer چک کردم و مطمئن شدم که گوگل هم از comet استفاده میکنه.


در مورد چتی که دقیقا تو خود پنجرهء جیمیل باز میشه، با اسنیفر چک کردم و *در صورت اتصال* موفق، هر یک ثانیه یک درخواست مجزا به سرور ارسال میشه، که اگه جلوی اونها نیز گرفته بشه، معمولا میگه که طرف disconnect شده و اگر درخواست بعدی رو اجازه بدی می بینی که طرف وصل میشه. و این اتفاق برای هر درخواستی که یک ثانیه یک ثانیه ارسال میشه، وجود داره.

----------


## Farhadi

> من نمی گم کامت بدون استفاده است، ولی اونقدر شرایط خاص داره و اونقدر چیز ساده ای است که نیاز به این همه جنجال نداره. آژاکس حداقل یک سری متد و پراپرتی و یک کلاس جدید داشت، یعنی برای تولیدش یک حرکتی اتفاق افتاده بود :)


با اینکه چیز جدیدی نیست ولی جنجال بر انگیز هست.
در واقع همیشه همینطور بوده که بعضی امکانات قدیمی که برای برآوردن نیاز های جدید کارایی داشته باشند گنده میشن و جنجال به پا میکنن. مثل همین ajax که از مدت ها قبل در IE وجود داشت و کسی بهش توجه نمیکرد ولی وقتی برای برآوردن نیاز های وب ۲ کاربرد پیدا کرد مثل بمب صدا کرد.




> این مورد رو میشه توسط keep alive توی HTTP1.1 تا حدود زیادی برطرف کرد. (اینکه می گم «تا حدود زیادی» به خاطر اینه که ساختار فریم ورک های کامت رو نمی دونم چیه!)


خوب آره، تو لود شدن معمولی یک صفحه، مرورگر از keepalive برای لود کردن تصاویر و استایل ها و ... استفاده میکنه ولی ظاهرا وقتی از ajax استفاده میکنی اگر فاصله زمانی بین دو کانکشن بیشتر از چند ثانیه باشه کانکشن دوباره برقرار میشه. حتی اگر مرورگر تو کانکشن های اجکسی هم از keepalive استفاده کنه باز هم صرف با comet هست چون نیازی به ارسال و دریافت متوالی هدر ها نیست. و کلی توی پهنای باند صرفه جویی میشه.




> به طور پیشفرض خیلی به سرور فشار میاره، چون کلا وب سرور برای این کار بهینه نشده. روی آپاچی یه سری ابزار هست که در این زمینه کمکت کنند، مثل این:
> http://en.wikipedia.org/wiki/Mod_qos
> یا اینکه از وب سرور های اختصاصی (یا اختصاصی شده) استفاده بشه.


تو این که به سرور فشار میاره شکی نیست. ولی بحث اینجاست که بین دو روش گفته شده کدوم فشار کمتری به سرور میاره.
من که تا حالا تست نکردم و نمیتونم نظر بدم.
ولی روی حرف شما حساب میکنم چون هرچی باشه شما خبره‌ی این کاری.





> در مورد چتی که دقیقا تو خود پنجرهء جیمیل باز میشه، با اسنیفر چک کردم و *در صورت اتصال* موفق، هر یک ثانیه یک درخواست مجزا به سرور ارسال میشه، که اگه جلوی اونها نیز گرفته بشه، معمولا میگه که طرف disconnect شده و اگر درخواست بعدی رو اجازه بدی می بینی که طرف وصل میشه. و این اتفاق برای هر درخواستی که یک ثانیه یک ثانیه ارسال میشه، وجود داره.


نمیدونم شما با چه مرورگری تست کردی. من که با firefox تست کردم به نظرم از comet استفاده میکرد.
حتی بودن sniffer و فقط با firefox و firebug هم میشه فهمید.
برای اینکار کافیه چند دقیقه ای چت کنید. بعد از قسمت net در فایر باگ دنبال کانکشن هایی با نام bind که زمانشون بالای یک دقیقه هست بگردین قسمت response رو نگاه کنید یه عالمه آرایه جاوا اسکریپت پشت سر هم میبینید که حاوی متن پیام هایی که دریافت کرده اید هم هست.
با توجه به اینکه مدت زمان این کانکشن ها بین دو تا پنج دقیقه هست و با توجه به اینکه چندین پیام از طریق یک کانکشن دریافت شده میشه فهمید که داره از comet استفاده میکنه.

یک راه بهتر هم استفاده از یک sniffer هست.
اگر با یک sniffer چک کنید میبینید یک کانکشن با انکدینگ chunked وجود داره که بسته نشده و وقتی پیام دریافت میکنید اون پیام به صورت آرایه جاوااسکریپتی به انتهاش اضافه میشه.

----------


## hidensoft

> به طور پیشفرض خیلی به سرور فشار میاره، چون کلا وب سرور برای این کار بهینه نشده.


با حرف ایشون کاملا موافقم.

----------


## oxygenws

> استفاده میکنه ولی ظاهرا وقتی از ajax استفاده میکنی اگر فاصله زمانی بین دو کانکشن بیشتر از چند ثانیه باشه کانکشن دوباره برقرار میشه.


آره، keepalive به همراه یک keepalive timeout میاد. دلیل این کار هم اینه که حتما یه زمانی برای پایان اتصال باشه، چون اتصالات زنده به وب سرور صدمه می زنند.




> حتی اگر مرورگر تو کانکشن های اجکسی هم از keepalive استفاده کنه باز هم صرف با comet هست چون نیازی به ارسال و دریافت متوالی هدر ها نیست. و کلی توی پهنای باند صرفه جویی میشه.


می دونی ساختار HTTP فقط بر اساس درخواست و جوابیه (request/response) است و اگه ارتباط این شکلی باشه، برای هر حرکتی نیاز به یک درخواست هست.

توی comet هم نهایتا اینه که رابطهء سرور به سمت کلاینت می تونه زنده بمونه. یعنی زمانی که اولین خط جوابیه به سمت کلاینت ارسال شد، دیگه درخواستی نمی تونه از همون طریق ارسال بشه و یا (۱) باید یک «اتصال» جدید ایجاد بشه و یا (۲) «ارتباط» قبلی قطع بشه و از روی «اتصال» قبلی، یک «ارتباط» جدید ایجاد بشه.

* «اتصال» به مفهوم hand shaking و باز کردن پورت و ... است.
* «ارتباط» بدون باز کردن اتصال است و اتصال پیشتر برقرار شده.




> تو این که به سرور فشار میاره شکی نیست. ولی بحث اینجاست که بین دو روش گفته شده کدوم فشار کمتری به سرور میاره.


خیلی بستگی به شرایط برنامه ها داره. نمی شه به طور کلی به این راحتی گفت کدوم بهتره.




> نمیدونم شما با چه مرورگری تست کردی. من که با firefox تست کردم به نظرم از comet استفاده میکرد.
> حتی بودن sniffer و فقط با firefox و firebug هم میشه فهمید.
> برای اینکار کافیه چند دقیقه ای چت کنید. بعد از قسمت net در فایر باگ دنبال کانکشن هایی با نام bind که زمانشون بالای یک دقیقه هست بگردین قسمت response رو نگاه کنید یه عالمه آرایه جاوا اسکریپت پشت سر هم میبینید که حاوی متن پیام هایی که دریافت کرده اید هم هست.
> با توجه به اینکه مدت زمان این کانکشن ها بین دو تا پنج دقیقه هست و با توجه به اینکه چندین پیام از طریق یک کانکشن دریافت شده میشه فهمید که داره از comet استفاده میکنه.
> 
> یک راه بهتر هم استفاده از یک sniffer هست.
> اگر با یک sniffer چک کنید میبینید یک کانکشن با انکدینگ chunked وجود داره که بسته نشده و وقتی پیام دریافت میکنید اون پیام به صورت آرایه جاوااسکریپتی به انتهاش اضافه میشه.


به دلیلی که بالا گفتم، *نمی شه* فقط با کامت (یعنی دقیقا یک اتصال کاملا ثابت با سرور) یک چت راه انداخت. در نهایت کامت یک ارتباط یک طرفه خواهد داشت و شما نمی تونی ارتباطی با سرور داشته باشی، ولی سرور می تونه با تو حرف بزنه.

شاید همون مثال هایی که تو پست های اولیه بود یا احیانا همون ساعت مسخره ای که ساخته بودم، معقول ترین استفاده از کامت باشه.

پس با توجه به موارد فوق جیمیل کامت نیست و حتما و حتما و حتما باید از درخواست های متوالی استفاده کنه.

----------


## Farhadi

> توی comet هم نهایتا اینه که رابطهء سرور به سمت کلاینت می تونه زنده بمونه. یعنی زمانی که اولین خط جوابیه به سمت کلاینت ارسال شد، دیگه درخواستی نمی تونه از همون طریق ارسال بشه و یا (۱) باید یک «اتصال» جدید ایجاد بشه و یا (۲) «ارتباط» قبلی قطع بشه و از روی «اتصال» قبلی، یک «ارتباط» جدید ایجاد بشه.
> 
> * «اتصال» به مفهوم hand shaking و باز کردن پورت و ... است.
> * «ارتباط» بدون باز کردن اتصال است و اتصال پیشتر برقرار شده.


از کامت فقط برای دریافت استفاده میشه.
برای ارسال که اصلا از اول هم مشکلی نبوده، یک کانکشن جدید برای هر بار ارسال باز میشه.
مشکل فقط دریافت بوده که با کامت قابل حله.
اما برای دریافت، تفاوت بین comet و درخواست های مکرر keepalive اینه که با کامت یک «اتصال» و یک «ارتباط» برقرار میشه ولی با درخواست های مکرر keepalive یک «اتصال» و صدها «ارتباط» برقرار میشه. طبیعیه که هر «ارتباطی» نیاز به هدر های request و response داره. واین کلی پهنای باند مصرف میکنه.




> به دلیلی که بالا گفتم، *نمی شه* فقط با کامت (یعنی دقیقا یک اتصال کاملا ثابت با سرور) یک چت راه انداخت. در نهایت کامت یک ارتباط یک طرفه خواهد داشت و شما نمی تونی ارتباطی با سرور داشته باشی، ولی سرور می تونه با تو حرف بزنه.


من هم نگفتم فقط با کامت همه کارها انجام میشه.
از کامت فقط برای دریافت استفاده میشه.




> پس با توجه به موارد فوق جیمیل کامت نیست و حتما و حتما و حتما باید از درخواست های متوالی استفاده کنه.


وقتی میشه دید چه نیازی به اثبات هست !!!
gmail و meebo هر دو از کامت استفاده میکنند.
این هم سند از وبلاگ Alex
http://alex.dojotoolkit.org/?p=545

راستی میدونستین Alex Russell اولین کسی بود که اصطلاح comet رو برای این روش به کار برد.

----------


## Nabi

- وقتی آقای فرهادی و آقای متقی، کل میندازند بحث بسیار خواندنی میشه ;-)

- هنوز منتظر مثال hello world جناب bamdadd هستم.

- آقای فرهادی، در مورد میهن نیک از کامت استفاده نکردید، همون آژاکسه درسته؟

----------


## bamdadd

دوستان عزیزم ، من و یکی از دوستانم روی پروژه اوپن سورس یک  Libraryبرای Comet در PHP  کار می کنیم و به همین دلیل سخت مشغولم و وقت پست زدن رو ندارم. برای همینه پوستامو هنوز کامل ویرایش نکردم تا پست کنم.
ان شاالله به محض اینکه پروژه رو هاست کردیم اینجا لینکش رو می گذاریم.
از همه بابت نظر ها ممنون.

----------


## Nabi

> دوستان عزیزم ، من و یکی از دوستانم روی پروژه اوپن سورس یک  Libraryبرای Comet در PHP  کار می کنیم و به همین دلیل سخت مشغولم و وقت پست زدن رو ندارم. برای همینه پوستامو هنوز کامل ویرایش نکردم تا پست کنم.
> ان شاالله به محض اینکه پروژه رو هاست کردیم اینجا لینکش رو می گذاریم.
> از همه بابت نظر ها ممنون.


امیدوارم موفق باشید، انشااله که زودتر به سرانجام برسه و ما هم بهرمند بشیم.
ولی صحبت من فقط کد hello world بود که فکر نمیکنم بیشتر 4 خط باشه !

----------


## Farhadi

> - آقای فرهادی، در مورد میهن نیک از کامت استفاده نکردید، همون آژاکسه درسته؟


نه، از کامت استفاده نشده.
چت میهن نیک با روش کانکشن های متوالی کار میکنه.

----------


## sinoohe

من چند روزیه دنبال یک مثال ساده از comet  می گردم ولی چیزی پیدا نکردم
یه مثال خیلی خیلی ساده می خوام
این مثال رو دیدم ولی جاوا اسکریپتش خیلی ریخته پاشه http://www.zeitoun.net/articles/comet_and_php/start
کسی مثال دیگه سراغ نداره؟

----------

