PDA

View Full Version : حرفه ای: کم کردن درخواست ها از بانک در سیستم تالارگفتگوی سایت



majnun
پنج شنبه 30 دی 1389, 00:36 صبح
سلام خسته نباشید

من یک روم برای سایت نوشتم که کاربرها میتونن مثل چت روم با همدیگر چت کنند

برای اینکه بفهمم که رکورد جدیدی در بانک ثبت شده یا نه هر 7 ثانیه یه درخواست به بانک میدم و چک میکنم ببینم رکوردی اضافه شده یا نه اگه شده بود رکورد را برگشت میدم و اگر نه که هیچ

خب این قشنگ کار میکنه و هیچ مشکلی نداره فقط یه چیزی هست اونم اینکه

فرض کنید من 100 کاربر همزمان آنلاین درون روم داشته باشم و هر 7 ثانیه قراره اینها برن ار بانک ببینن چیزی ثبت شده یا نه

نتیجه این چی میشه ؟

من در هر دقیقه 800 بار کانکشنم را به بانک باز میکنم و میبندم و این یه بار سنگینی به بانک وارد میکنه ،

(بدون احتساب اینکه اگه رکورد جدیدی وجود داشت بیاره و ....)

میخوام ببینم راهی وجود داره که این درخواست ها به بانک را کم کنم ؟

راهی وجود داره که بشه این مشکل حل بشه ؟

ممنون میشم راهنمایی کنید

prankster
پنج شنبه 30 دی 1389, 00:51 صبح
پیاده سازی چت با استفاده از Database؟ فکر نمی کنم اصلا روش مقرون به صرفه ای باشد!
معمولا برای سیستم های چت یا از روش peer to peer برای ارتباط کاربران استفاده می شود یا client-server که کلاینت ها نقش Subscriber و سرور نقش Publisher را بازی می کند و در روش دوم از memory سرور برای publish کردن stream ها استفاده می شود و پس از publich معمولا stream ها dispose می شود

Javad_Darvish_Amiry
پنج شنبه 30 دی 1389, 01:24 صبح
سلام. حق با دوستمون prankster هستش، ولی برای این که تو همین پروژه کارتون راه بیفته چیزی که به نظر من میرسه اینه:
شما برای این که هیستوری مکالمات رو نگه دارید، ناگزیر از بانک هستید. اما خوندن از بانک اصلا درست نیست. شما بیاین به ازای هر نشست، که بین دو (یا چند نفر) برقرار میشه، یه تایپ تعریف کنید که دو طرف مکالمه و سایر مشخصات نشست رو نگه داره و یه لیست از مکالمات. (باید ساختمون داده مورد نیاز خودتون رو طراحی کنید) و این شیئ (اشیاء) cache بشن. خوندن به راحتی از این قسمت انجام میشه. نوشتن هم ابتدا همین جا انجام بشه، و فقط برای حفظ هیستوری، تو یه ترید جداگانه (برای این که سرعت اجرا هم نیاد پایین) تو بانک هم نوشته بشه. یعنی همه چیز تو حافظه موقت باشه، اما پیامها تو بانک هم ذخیره بشن. حالا برای اینکه مصرف حافظه بالا نره و کارایی پایین نیاد، میتونید لیست مکالمات رو محدود کنید. مثلا 100 پیام برای هر نشست. پیام 101 پیام 1 رو از لیست حذف میکنه. این روندیه که حتی یاهو و لایو و گوگل هم پیاده میکنن و نمیذارن پیامهای یه نشست انباشته بشه. باز کار بهتر، اگه از کدنویسی کلاینت مطمئن باشیم، اینه که هر پیام وقتی به سمت کلاینت ارسال شد، از لیست هم حذف بشه. این طوری حجم لیست همیشه پایین میمونه. در ضمن تو این وضعیت، چون از هر دو قابلیت بانک و cache استفاده کردید، امکان پیام آفلاین هم وجود داره.
اما یه نکته دیگه اینه که هر هفت ثانیه چک کردن، خودش یه ترافیک سنگین تو شبکه است و البته رو سرورتون. چون درسته که اتصال با بانک تعدادش کم میشه، اما تو همون مثالی که زدید، سرورتون در هر دقیقه باید 800 درخواست رو پردازش کنه. برای اینکار راهکاری که ارائه شده comet هست که تو همین سایت هم فکر کنم مطالبی در موردش باشه. باید جستجو کنید، من خودم فریم وورک و سمپل ها و داکیومنت هاشو از چند تا شرکت که روش کار میکنن، گرفتم، ولی هنوز وقت نکردم برم سراغشون. پس کمکی تو این زمینه از من برنمیاد.
http://en.wikipedia.org/wiki/Comet_(programming)

mmnoody2006
پنج شنبه 30 دی 1389, 12:51 عصر
برادر شما از همون بانک استفاده کن البته اگر چت روم عمومی هست و فقط یک روم موجوده :متفکر:

ولی بجای sql از xml استفاده کن :بوس:

mmnoody2006
پنج شنبه 30 دی 1389, 12:58 عصر
من تا حالا با سیستم های چت کار نکردم وگرنه حتما کمک بیشتری می کردم فعلا این لینک ها رو داشته باش :

http://www.codeproject.com/KB/applications/AliAspNetChat.aspx

http://www.codeproject.com/KB/ajax/Chat_System.aspx

http://blogs.msdn.com/b/coding4fun/archive/2007/03/01/1785048.aspx

http://weblogs.asp.net/datagridgirl/archive/2004/03/17/91156.aspx

http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=277

prankster
پنج شنبه 30 دی 1389, 15:03 عصر
استفاده از comet برای پیاده سازی چت روی وبسایت بهترین روشی است که با استفاده از javascript قابل پیاده سازی است، منتها با توجه به استفاده از threading در سطح زیاد روی سرور، بار زیادی به سرور تحمیل می کند، البته این مساله در مورد کلیه Application Server هایی که مختص data streaming هستند مثل Adobe Media Server صدق می کند. اصولا هنگامی برای استفاده از هر Chat Session نیاز به یک Thread مجزا روی سرور است
در صورتی که امکان دارد برای پیاده سازی چت از پلتفرم هایی که از socket پشتیبانی می کنند استفاده کنید، مثل Flash (که در نسخه های جدید از Binary Socket هم پشتیبانی می کند) و یا Silverlight و یا WebSocket در HTML5. در این موارد با توجه به بهینه بودن این پلتفرم ها و همچنین real-time بودن socket برنامه ساختار بهتری دارد. نهایتا با استفاده از یک application server یا پیاده سازی آن در روی سرور مثلا با WCF می توان یک سیستم چت خوب راه اندازی کرد
در صورتی که امکان موارد بالا وجود ندارد، با استفاده از یک Ajax Interval می توان در فواصل زمانی مشخص اطلاعات را (در صورت وجود) از سرور بازخوانی کرد. فقط با استفاده از یک سیستم ساده publish و subscribe به راحتی و بدون نیاز به Database می توانید این کار را پیاده سازی کنید و نهایتا برای log برداشتن اطلاعات را در Database ذخیره کنید. برای این کار کافی است لیست افراد Online را داشته باشید و برای هر کدام یک Queue به صورت FIFO از پیغام ها ایجاد کنید، و هنگام تماس کاربر با سرور Queue را برای او ارسال کرده و آنرا خالی کنید