۱۳۸۷/۰۸/۰۵

مديريت دانلود‌هاي همزمان از يك سايت و بحث تايم آوت

يك سرويس ويندوز ان تي با سي شارپ نوشته‌ام كه كارش مراجعه به يك سري آدرس RSS و ذخيره سازي آنها به صورت آناليز شده در يك ديتابيس SQL server است (اين مورد ضعفي است كه اكثر برنامه‌هاي فيدخوان دارند و پس از مدتي كار با آنها اين احساس را داريد كه اطلاعات گذشته را از دست داده‌ايد).
در طي آزمايش اوليه اين سرويس، به مشكل عجيب timeout پس از باز كردن براي مثال سومين يا چهارمين thread همزمان براي دانلود كردن اطلاعات بر خوردم. همه چيز درست بود، از كلاس‌ها، دريافت اطلاعات از وب و غيره، اما برنامه كار نمي‌كرد. اين مشكل فقط هم با feedburner.com رخ مي‌داد (همانطور كه مطلع هستيد feedburner.com سرويسي را جهت پيگيري آمار مشتركين فيدهاي شما ارائه مي‌دهد كه بسيار جالب است. براي مثال چند نفر مشترك داريد، يا يك سري نمودار و غيره. به همين جهت رسم شده است كه اكثر سايت‌ها فيدهاي خودشان را در اين سايت نيز ثبت مي‌كنند).
پس از مدتي جستجو به نكته جالب زير برخوردم كه شايد براي شما هم در آينده مفيد باشد:
مطابق RFC2068 - Hypertext Transfer Protocol -- HTTP/1.1 ، شما تنها مجازيد 2 كانكشن فعال به يك سايت باز كنيد. اين علت تايم آوت در سومين thread ايجاد شده بود. براي مثال IE اين مورد را محترم مي‌شمارد. در دات نت نيز به صورت پيش فرض اين محدوديت قرار داده شده است كه به‌سادگي مي‌توان آنرا تغيير داد. براي اين منظور بايد يك فايل app.config به پروژه اضافه كرد و سپس خطوط زير را به آن افزود:

<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
</configuration>


بعد از اين تغيير مشكل timeout برنامه حل شد.

براي مديريت چندين ترد همزمان دانلود كننده و در صف قرار دادن آنها در اين پروژه، از كتابخانه سورس باز زير استفاده كردم:
http://www.codeplex.com/smartthreadpool

مآخذ:
http://msdn.microsoft.com/en-us/library/fb6y0fyc.aspx
http://www.faqs.org/rfcs/rfc2068.html
http://vahidnasiri.blogspot.com
http://odetocode.com/Blogs/scott/archive/2004/06/08/272.aspx

پ.ن.
براي اينكه در بلاگر بتوانيد متون حاوي xml را ارسال كنيد بايد از سرويس زير استفاده كنيد
http://www.elliotswan.com/postable/