View Full Version : قدرت Indy ؟
مهران رسا
جمعه 24 اردیبهشت 1389, 19:54 عصر
با سلام .
Indy دقیقاً برای چه مقاصدی طراحی شده ؟ از بحث توانایی سخت افزاری که بگذریم ، مثلاً یک TCPServer این قابلیت رو داره که به تعداد 1 میلیون درخواست در ثانیه پاسخ بده ؟
Indy از پس همه کارها بر میاد یا اینکه برای انجام کارهای سنگین تر باید با API درگیر بشیم ؟
vcldeveloper
جمعه 24 اردیبهشت 1389, 20:47 عصر
Indy دقیقاً برای چه مقاصدی طراحی شده ؟
پیاده سازی پروتکل های رایج اینترنت به صورت Blocking Mode.
مثلاً یک TCPServer این قابلیت رو داره که به تعداد 1 میلیون درخواست در ثانیه پاسخ بده ؟
پاسخ دهی همزمان به چند درخواست مطرح هست، نه در واحد ثانیه. اینکه به چند درخواست همزمان میتونه پاسخ بده، بستگی به نوع پردازشی که برای هر درخواست لازم هست، هم داره؛ یعنی سرور باید به ازاء هر کدام از اون درخواست ها چه کاری انجام بده؟ Indy به ازاء هر کلاینت از یک Thread استفاده میکنه، پس اگر فرض بگیریم که 1 میلیون درخواست همزمان دریافت بشه، 1 میلیون Thread هم ایجاد میشه. البته دقت کنید که اصولا 1 میلیون درخواست همزمان حتی برای بهترین نرم افزارهای موجود هم حجم بسیار بالایی هست، و پاسخگویی به همچین حجمی احتیاج به سخت افزار بسیار قوی، و پهنای باند بالایی داره.
ایجاد و بستن Threadها کار پر هزینه ایی هست، Indy میتونه به جای ایجاد Thread برای هر Connection، از یک Thread Pool استفاده کنه، به این ترتیب تعدادی از Threadها یک بار ایجاد میشند، و وقتی Connection ایی ایجاد میشه، به یکی از این Threadها اختصاص پیدا میکنه. اینطوری هزینه های ایجاد و بستن Thread به ازاء هر Connection از بین میره.
Indy 10 در نسخه های Nightly build خودش (نه نسخه ایی که به طور پیش فرض با دلفی 2010 عرضه میشه)، امکان استفاده از Fiber را هم داره. Fiberها از Threadها سبک تر هستند، و برای سرورهای با حجم درخواست بالا، مناسب تر هستند.
در صورتی که حجم درخواست های بالا باشه، استفاده از روش های Non-blocking معمولا به صرفه تر هست، چون یک Thread میتونه چندین درخواست را پاسخ بده، و لزومی نداره برای هر درخواست یک Thread یا Fiber داشته باشید. البته در این حالت، کار شما خیلی پیچیده تر میشه، چون باید خودتان Threadها را مدیریت کنید. مثلا اگر فقط یک برنامه Non-blocking بنویسید که با استفاده از یک Event به درخواست ها پاسخ بده، این کارها همگی در یک Thread انجام میشه، و در صورت بالا بودن حجم درخواست ها، اون یک Thread پاسخگوی نیازهای شما نخواهد بود، و باید خودتان Threadهای مختلفی ایجاد کنید، و برخی از درخواست ها را به آنها محول کنید.
در هر حال، حتی در یک سرور پر ترافیک هم شما معمولا بیش از چند هزار Connection همزمان نخواهید داشت. در حالت های معمولی تر تعداد Connectionهای همزمان شما که فعال باشند، چند صد Connection خواهند بود. برای موارد با حجم بالا، باید برید به سمت استفاده از Fiber، یا اینکه از شیوه های Non-blocking استفاده کنید.
کتابخانه هایی هم وجود دارند، که Non-blocking هستند، و می تونید از اونها به جای استفاده مستقیم از توابع WinSock، استفاده کنید؛ مثل ICS (http://www.overbyte.be/frame_index.html?redirTo=/products/ics.html).
حمیدرضاصادقیان
جمعه 24 اردیبهشت 1389, 20:48 عصر
سلام.در این سایت قبلا یکی از دوستان به نام gladiator مقاله کاملی در مورد indy نوشته توصیه میکنم یک نگاهی به اون بندازید.
tdkhakpur
جمعه 24 اردیبهشت 1389, 20:50 عصر
مثلاً یک TCPServer این قابلیت رو داره که به تعداد 1 میلیون درخواست در ثانیه پاسخ بده ؟
چرا نداره! بستگی به سخت افزار و قابلیتهای سیستم شما دارد و این قابلیت باید با الگوریتم و تحلیل پیچیده تحت یک برنامه به سیستم داده شود.
Indy از پس همه کارها بر میاد یا اینکه برای انجام کارهای سنگین تر باید با API درگیر بشیم ؟
api مثل این میماند که شما برنامه مینویسید و اخرش باید کد باینری داشته باشید و اگر برای برنامه نویس نوشتن یک برنامه بوسیله کد های باینری راحت بود کامپایلرهای جدید سطح بالا بوجود نمی آمدند. حالا شما هم اگر با indy برنامه بنویسید حین کامپایل توابع api که داخل indy پیاده سازی شده است دیکد میشود و از این طریق exe که همان کدهای باینری هست را برای شما میسازد.
مهران رسا
جمعه 24 اردیبهشت 1389, 21:14 عصر
برای موارد با حجم بالا، باید برید به سمت استفاده از Fiber، یا اینکه از شیوه های Non-blocking استفاده کنید.
آیا استفاده از روش های Non-blocking در افزایش سرعت هم تاثیر گذاره ؟
vcldeveloper
جمعه 24 اردیبهشت 1389, 23:00 عصر
آیا استفاده از روش های Non-blocking در افزایش سرعت هم تاثیر گذاره ؟
افزایش سرعت چی؟ پاسخگویی سرور؟ اگر منظور پاسخگویی سرور هست، non-blocking بودن به خودی خود افزایش سرعتی ایجاد نمیکنه. البته دقت کنید که هر چی بار روی سرور بیشتر باشه، زمان پاسخگویی اون هم کاهش پیدا میکنه.
مهران رسا
جمعه 24 اردیبهشت 1389, 23:35 عصر
سوال جدید : در پروتکل TCP حداکثر اطلاعاتی که میشه با IOHandler ارسال کرد چند بایت هست ؟
البته دقت کنید که هر چی بار روی سرور بیشتر باشه، زمان پاسخگویی اون هم کاهش پیدا میکنه.
اینجا منظور Indy هست ؟ در صورتی که سرور از نظر سخت افزاری به اندازه کافی قدرتمند باشه چی ؟ و یک سوال دیگه اینکه علاوه بر پیاده سازی سرور خوشه ای ، روش های خاصی برای بالا بردن قدرت پاسخ گویی سرور (Indy) وجود داره ؟
vcldeveloper
شنبه 25 اردیبهشت 1389, 03:06 صبح
سوال جدید : در پروتکل TCP حداکثر اطلاعاتی که میشه با IOHandler ارسال کرد چند بایت هست ؟
ارتباطی به موضوع این تاپیک نداره.
اینجا منظور Indy هست ؟ در صورتی که سرور از نظر سخت افزاری به اندازه کافی قدرتمند باشه چی ؟
فرقی نمیکنه، هر سروری متناسب با میزان باری که بهش وارد میشه، توان پاسخ دهی اش هم کاهش پیدا میکنه.
روش های خاصی برای بالا بردن قدرت پاسخ گویی سرور (Indy) وجود داره ؟
تا اونجایی که به Indy مربوط میشه، همون استفاده از Thread Pool و استفاده از Fiber مطرح هست. مابقی داستان به طراحی و پیاده سازی نرم افزار شما مربوط میشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.