PDA

View Full Version : سوال: انجام عملیات اتوماتیک در لایه کلاسهای وب سایت



amirvanica
سه شنبه 14 اردیبهشت 1389, 15:36 عصر
با سلام .

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

حالا مشکل من اینه که من این کار رو (چک کردن لایه زیرین) باید کجا انجام بدم ؟ و چجوری ؟ آخه اینکار باید جایی انجام بشه که همیشه در حال اجراست و برای همه ی صفحه ها یکسان عمل میکنه .
راستی من از ASP.NET 3.5 استفاده می کنم.


باتشکر.

alireza_s_84
سه شنبه 14 اردیبهشت 1389, 17:30 عصر
سلام:
یک) شما میتونید درون یک thread و در یک حلقه نامتناهی با شروع application-start اینکار رو انجام بدی.
برای اینکه هر نیم ساعت یا یک ساعت اینکار تکرار بشه میتونی در انتهای هر عملیات thread رو به همین مقدار زمان sleep کنی.
دو) شما یک متغیر عمومی application تعریف کن که مدت زمان آخرین بار انجام این عملیات رو ذخیره کنه بعد با هر درخواستی که صورت میگیره Request-Begin شما چک کن ببین این عملیات آخرین باری که اجرا شده کی بوده اگر بیشتر از مدت زمان بود دوباره انجام بده .
موفق باشید

Alireza_Salehi
سه شنبه 14 اردیبهشت 1389, 17:57 عصر
سلام:
یک) شما میتونید درون یک thread و در یک حلقه نامتناهی با شروع application-start اینکار رو انجام بدی.
برای اینکه هر نیم ساعت یا یک ساعت اینکار تکرار بشه میتونی در انتهای هر عملیات thread رو به همین مقدار زمان sleep کنی.
دو) شما یک متغیر عمومی application تعریف کن که مدت زمان آخرین بار انجام این عملیات رو ذخیره کنه بعد با هر درخواستی که صورت میگیره Request-Begin شما چک کن ببین این عملیات آخرین باری که اجرا شده کی بوده اگر بیشتر از مدت زمان بود دوباره انجام بده .
موفق باشید
عملا این کاری که گفتی انجام دادی؟

alireza_s_84
سه شنبه 14 اردیبهشت 1389, 18:34 عصر
عملا این کاری که گفتی انجام دادی؟
هر دو تاشو انجام دادم مورد دوم به نظرم بهتر جواب میده چون اگر شما هیچ بازدید کننده ای نداشته باشی در روش اول باز عملیات صورت میگیره ولی در روش دوم تنها زمانی اینکار صورت میگیره که شما بازدید کننده داشته باشی.
ضمنا در روش اول هر استثنایی در ترد صورت بگیره اگر هندل نشه یعنی تا زمانیکه Application دوباره راه اندازی نشه شما دیگه نمیتونی اونو اجرا کنی.(هرچند من تا حالا برام اینمورد پیش نیومده)
موفق باشید

Alireza_Salehi
سه شنبه 14 اردیبهشت 1389, 20:02 عصر
عجب...
روی سرعت اثر منفی نداره؟

alireza_s_84
سه شنبه 14 اردیبهشت 1389, 20:20 عصر
عجب...
روی سرعت اثر منفی نداره؟
عجب...
شما راه حلی بهتری داری ارائه بده ما هم استفاده میکنیم:چشمک:

Alireza_Salehi
سه شنبه 14 اردیبهشت 1389, 22:19 عصر
معروفترین و موثر ترین راه حل استفاده از cache هستش ...
http://www.codeproject.com/KB/aspnet/ASPNETService.aspx
http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

تنها چیزی که در ASP.NET به زمانبندی ربط مستقیم دارد کش است چون سر یک زمان مشخص و نسبتا دقیق یک رویداد را فراخوانی می کند. و ادامه ماجرا...

استفاده از Thread اولین راهی هست که به ذهن میرسه.که البته در مواردی اجراش با مشکل مواجه میشود. روش cache را من تست کردم و 100 درصد و با سربار بسیار پائین جواب می دهد. در سرور اشتراکی هم جواب میده.

البته NET 4. هم خودش یک راه حلی ارائه کرده.
System.Threading.Tasks.TaskScheduler
البته به علت عدم پشتیبانی روی هاست ها فعلا نظری ندارم، روی لوکال که خوبه.

alireza_s_84
سه شنبه 14 اردیبهشت 1389, 22:34 عصر
معروفترین و موثر ترین راه حل استفاده از cache هستش ...
تنها چیزی که در ASP.NET به زمانبندی ربط مستقیم دارد کش است چون سر یک زمان مشخص و نسبتا دقیق یک رویداد را فراخوانی می کند. و ادامه ماجرا...
دوست عزیز کش تنها زمانی میتونه مفید باشه که حجم اطلاعاتی که توش قرار میگیره زیاد نباشه و گرنه نه فقط سبب کاهش بار نمیشه بلکه خود کش به عنوان سربار اضافی به سرور تلقی میشه.
با فرض اینکه زمان مناسب برای اقلام نگهداری در cache رو برابر 30 دقیقه قرار بدیم بعد از اتمام زمان و انقضای cache دو مرحله رو پیشرو داریم:
1) بروز رسانی حراج های منقضی شده
2) استخراج داده ها و پر کردن cache
حال اگر تعداد اقلام موجود در cache بیش از اندازه زیاد باشد خوب میدونیم که کمبود حافظه چه مشکلاتی رو بوجود میاره.
در صورتیکه روش دومی که من مثال زدم با هر درخواست ابتدا با یک شرط کوچک آخرین زمان بروزرسانی اطلاعات رو چک میکنه و تنها زمانی اقدام به بروزرسانی میکنه که این کار طی نیم ساعت گذشته صورت نگرفته باشه .
حال من از شما یک سوال دارم: با شروع درخواست یک شرط if چقدر از زمان را میگیرد که ما با کاهش سرعت مواجه شویم؟
همیشه باید به یاد داشته باشیم caching زمانی مفید و کاراست که اولا برای نگهداری اقلامی صورت بگیرد که مدت بروزرسانی آنها دیر به دیر انجام میگرد ثانیا تعداد آنها زیاد نباشد.
با توجه به استدلالی که من گفتم دوست دارم نظر شما رو بدونم.:لبخندساده:

Alireza_Salehi
چهارشنبه 15 اردیبهشت 1389, 05:20 صبح
دوست عزیز کش تنها زمانی میتونه مفید باشه که حجم اطلاعاتی که توش قرار میگیره زیاد نباشه و گرنه نه فقط سبب کاهش بار نمیشه بلکه خود کش به عنوان سربار اضافی به سرور تلقی میشه.
با فرض اینکه زمان مناسب برای اقلام نگهداری در cache رو برابر 30 دقیقه قرار بدیم بعد از اتمام زمان و انقضای cache دو مرحله رو پیشرو داریم:
1) بروز رسانی حراج های منقضی شده
2) استخراج داده ها و پر کردن cache
حال اگر تعداد اقلام موجود در cache بیش از اندازه زیاد باشد خوب میدونیم که کمبود حافظه چه مشکلاتی رو بوجود میاره.
در صورتیکه روش دومی که من مثال زدم با هر درخواست ابتدا با یک شرط کوچک آخرین زمان بروزرسانی اطلاعات رو چک میکنه و تنها زمانی اقدام به بروزرسانی میکنه که این کار طی نیم ساعت گذشته صورت نگرفته باشه .
حال من از شما یک سوال دارم: با شروع درخواست یک شرط if چقدر از زمان را میگیرد که ما با کاهش سرعت مواجه شویم؟
همیشه باید به یاد داشته باشیم caching زمانی مفید و کاراست که اولا برای نگهداری اقلامی صورت بگیرد که مدت بروزرسانی آنها دیر به دیر انجام میگرد ثانیا تعداد آنها زیاد نباشد.
با توجه به استدلالی که من گفتم دوست دارم نظر شما رو بدونم.:لبخندساده:
نکته اینه که در اینجا حجم اطلاعات قرار گرفته در کش بسیار ناچیزه، فقط و فقط یک آیتم به کش اضافه می گردد و در آن یک یا دو متغییر جهت ردیابی وضعیت قرار داده می شود که بسیار حجم ناچیزی دارد.
در ASP.NET تنها سیستمی که به صورت تو کار زمان بندی دارد همین کش است چون مثلا اگر شما یک آیتم با زمان 5 دقیقه در کش قرار دهید ASP.NET منقضی شدن آن را در 5 دقیقه تضمین می کند و حتما سر 5 دقیقه یک رویداد را فراخوانی می کند. ولی سایر روش ها تضمینی در دقت زمانی ندارد.

در این روش داده ای در کش قرار نمی گیرد از کش صرفا به خاطر خاصیت زمانبدی آن استفاده می شود.

مثلا می خواهید به 1000 نفر در فواصل 10 دقیقه ای ایمیل ارسال نمائید، یعنی هر 10 دقیقه به 100 نفر،
1.یک آیتم (داخلش چیزی لازم نیست قرار دهید) با زمان 10 در کش ایجاد می کنید
2. 10 دقیقه تمام می شود
3. رویداد منقضی شدن کش اجرا می گردد
4. در این رویداد لیست 100 نفربعدی را از دیتابیس استخراج و به آنها ایمیل ارسال می کنید.
5. یک آیتم دیگر در کش ایجاد می کنید
6. ادامه ماجرا

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

alireza_s_84
چهارشنبه 15 اردیبهشت 1389, 09:18 صبح
در ASP.NET تنها سیستمی که به صورت تو کار زمان بندی دارد همین کش است چون مثلا اگر شما یک آیتم با زمان 5 دقیقه در کش قرار دهید ASP.NET منقضی شدن آن را در 5 دقیقه تضمین می کند و حتما سر 5 دقیقه یک رویداد را فراخوانی می کند. ولی سایر روش ها تضمینی در دقت زمانی ندارد.
1) خوب به نظر شما asp.net این مدت زمان رو جوری محاسبه و مدیریت میکنه؟
2) حال اگر در نیمه های شب که بازدید وجود نداره یا اصلا روزی وب سایت بازدید نداشت یا کلا یک ساعتی بازدیدی وجود نداشت آیا باز هم لازمه که این عملیات صورت بگیره؟
ممنون میشم این دو سوال رو پاسخ بدین.

amirvanica
چهارشنبه 15 اردیبهشت 1389, 15:55 عصر
دوستان ممنون از راهنمایی های خوبتون .

راستش با cash و thread عملی کار نکردم ولی فکر کنم الان زمان مناسبی باشه . حالا اگه مشکلی بود باز مزاحمتون میشم.

بازم ممنون .

Alireza_Salehi
چهارشنبه 15 اردیبهشت 1389, 20:23 عصر
1) خوب به نظر شما ASP.NET این مدت زمان رو جوری محاسبه و مدیریت میکنه؟
2) حال اگر در نیمه های شب که بازدید وجود نداره یا اصلا روزی وب سایت بازدید نداشت یا کلا یک ساعتی بازدیدی وجود نداشت آیا باز هم لازمه که این عملیات صورت بگیره؟
ممنون میشم این دو سوال رو پاسخ بدین.
1. چه جوریش رو فکر کنم باید از تیم ASP.NET بپرسی، مدیریت کش جزو پروسه های داخلیشه، ولی زمانش منقضی شدن کش تقریبا دقیقه.

2. کدوم عملیات؟ صرفا یک رویداده توی اون رویداد چک میکنی اگر لازم بود کار مورد نظر را انجام میدی، فراخوانی یک رویداد اصلا در یک سایت حساب نمیاد! حالا هر موقع از روز.

alireza_s_84
چهارشنبه 15 اردیبهشت 1389, 20:33 عصر
1. چه جوریش رو فکر کنم باید از تیم ASP.NET بپرسی، مدیریت کش جزو پروسه های داخلیشه، ولی زمانش منقضی شدن کش تقریبا دقیقه.
خوب به همین دلیله که شما بلافاصله منطق استفاده از Thread رو رد کردید. اگر شما از این جریان مطلع بودید که کلاس cache برای محاسبه زمان از تایمر و رویدادهای آن استفاده میکنه هیچوقت منطق استفاده از یک Thread رو رد نمی کردید.
نیازی به پرسیدن از تیم Asp.Net نیست من برای شما عکسی رو ضمیمه میکنم که نشون میده در پشت ظاهر استفاده از کش چه چیزی نهفته است.
از زمانیکه شما درخواست قرار دادن شی رو در کش میکنید این کلاس با راه اندازی تایمری شروع به اندازه گیری زمان میکنه دقیقا همانند استفاده از یک تایمر در یک برنامه دستکتاپ ویندز .
با کنترل رویدادهای این تایمر زمان انقضا و بروزرسانی اشیای موجود در کش مدیریت میشه.
همه خوب میدونیم که یک تایمر برای کار خود از thread استفاده میکنه و این یعنی استفاده از کش نسب به استفاده از یک thread بطور مستقیم از سرعت بسیار پایینتری برخورداره.
شما استدلال من رو بخاطر استفاده از Thread رد میکنید حال اینکه متوجه نیستید که این کلاس cache خود از یک تایمر برای مدیرت زمان استفاده میکنه.
راه حلی که من ارائه کردم بی شک بهتر از استفاده از کشینگ خواهد بود چون از ایجاد اشیای اضافی و درگیر شدن در لایه های داخلی آن مصون است و در واقه میانبری برای اینکار محسوب میشود.
عکس رو ضمیمه می کنم شما خودتون بهتر متوجه میشید.

2. کدوم عملیات؟ صرفا یک رویداده توی اون رویداد چک میکنی اگر لازم بود کار مورد نظر را انجام میدی، فراخوانی یک رویداد اصلا در یک سایت حساب نمیاد! حالا هر موقع از روز.
میتونم بپرسم منظورتون از اصلا بحساب نمیاد یعنی چی؟؟؟
موفق باشید

Alireza_Salehi
پنج شنبه 16 اردیبهشت 1389, 00:05 صبح
:لبخندساده:
منظور من از چه جوریش نحوه (کیفیت) سرکشی پروسه ASP.NET به آیتم های کش بود و نه عملکرد داخلی کلاس کش. خوب معلومه که برای زمانبندی از تایمر استفاده میشه.
سه نوع تایمر داریم:
System.Windows.Forms.Timer
System.Timers.Timer (http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx)
System.Threading.Timer (http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx)

اولی برای ویندوز فرم ها طراحی شده خارج از بحث ماست.
دومی تایمر سیستمیه که معمولا توی ویندوز سرویس ها استفاده میشه. مبتنی بر رویداد های سیستمی.
سومی که مد نظر ماست تایمری هست که در ThreadPool ایجاد میشه و Callback های اون در thread دیگر اجرا می شوند

سه تایمر فوق شبیه هم کار نمی کنند، و توانائی و کارائی و محل استفاده آنها با هم متفاوت است.
فرق اساسی تایمری که در ویندوز فرم ساخته میشه با تایمری که در ThreadPool قرار داده میشه اینه که در ویندوز فرم callback مربوط به تایمر در همان thread برنامه ایجاد میشه ولی در حالت دوم متد callback در همان thread صدا کننده اش اجرا نمی شود.
فرق این دوتا از زمین تا آسمونه. اولی پشت event های دیگه گیر میکنه و ممکنه 10 دقیقه شما بشه 100 دقیقه ولی در دومی به محض صدا شدن اجرا میشه. دقیق بودن کش به خاطر نوع timer هستش.

در روش thread
اولا یک حلقه نامتناهی داریم
احتیاج به sleep کردن و مدیریت thread داریم
دائم باید یک شرطی چک بشه و زمان رو محاسبه کنه
وابستگی به درخواستها از سرور داره (بازدید نداشته باشیم؟.....)

در روش کش
حلقه نامتناهی نداریم
هیچ کاری به مدیریت thread ها نداریم
احتیاج به چک کردن و محاسبه زمان نیست
وابستگی به درخواست ها از سرور به صفر میرسه (فقط در صورتی که Application ری استارت بشه نیاز به یک و فقط یک درخواست هست)

در روش استفاده از thread شما درگیر مدیریت thread هستید که بر هر برنامه نویسی واضح و مبرهن است که جزئیات و پیامد های زیادی داره، در روش کش همه چیز آماده است، همه چیز مدیریت شده است، شما فقط یک آیتم کش اضافه میکنید، و ASP.NET با اولویت سر زمان لازم callback ها را صدا میزند ومدیریت اش به عهده پروسه ASP.NET است.


سربار این روش اینقدر کمه که اصلا در محاسبه زمان درگیر بودن cpu ناچیزه:
1. آیتم کش اضافه میشود
2. برنامه آزاده، کاری هم به thread ها نداریم ،
3. کش منقضی میشه
4. یک درخواست مصنوعی ایجاد و کش مجددا بروز میشه
5. کار موردنظر انجام میشه

ضمن این که با افزودن thread توسط برنامه نویس از ظرفیت thread های سایت (که محدوده) کاسته میشه ، با توجه به این که ASP.NET چه کش افزوده شده باشد چه نباشد وظیفه سرکشی به صف تایمرها را انجام میدهد، بهتر است از قابلیتی که هم ساده تر و هم درحال انجام است استفاده شود به جای این که خودمان از اول همه چیز را مدیریت کنیم.
ضمن این که با هر نسخه جدیدتر دات نت بهینه ساز هایی در عملکرد سرکشی ASP.NET انجام می شود و هر نسخه سریع تر از نسخه قبلی است.

از همه اینها که بگذریم من با این که با thread آشنائی داشتم ولی خیلی دنبال این قضیه زمانبندی گشتم اکثر قریب به اتفاق سایتها کش را به برای این کار معرفی کرده اند.

اصلا یک از قابلیت های کش این است:
Time-Based Caching

Another technique for caching is based on time. For example, the cache can expire on a certain date, or it will only be available for a certain period of time. There are two ways in which you can use time-based caching:



Absolute Expiration. The cache is set to expire on a particular date and time.
Sliding Expiration. The cache is set to expire after a certain period of inactivity.