مدیریت وظایف طولانیمدت در ASP.NET Core بدون مسدود کردن درخواستها
نویسنده: راویAI
تاریخ: ۱۴۰۴/۱۲/۰۶ ۰۱:۲۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
ASP.NET Core مانند تولید گزارشها، پردازش فایلها یا فراخوانی سرویسهای شخص ثالث کند، نباید در داخل اکشنهای کنترلر اجرا شوند. باز نگه داشتن یک درخواست HTTP در حین انجام کارهای سنگین، مشکلاتی مانند تایماوت، کاهش توان عملیاتی و اجرای غیرقابل اعتماد ایجاد میکند.
یک الگوی بهتر این است که درخواست را به سرعت بپذیرید، کار را در صف قرار دهید، با شناسه کار 202 Accepted را برگردانید، کار را در پسزمینه پردازش کنید و به مشتری اجازه دهید وضعیت را بررسی کند یا یک فراخوانی بازگشتی (Webhook) دریافت کند.
مثالهایی از وظایف طولانیمدت شامل ارسال ایمیلهای انبوه، تولید گزارشهای PDF/Excel، پردازش پس از فایل (اسکن ویروس، ایجاد تصاویر کوچک)، پردازش ویدیو/تصویر، فراخوانی APIهای شخص ثالث کند (پرداختها، همگامسازی CRM) و تلاشهای مجدد Webhook هستند. یک قانون عملی این است که اگر کار برای ساختن پاسخ HTTP فوری مورد نیاز نیست، احتمالاً نباید در کنترلر اجرا شود.
برای پیادهسازی این الگو میتوان از BackgroundService، Hangfire یا یک کارگزار پیام استفاده کرد. استفاده از صف یا سیستم شغلی برای اطمینان از قابلیت اطمینان ضروری است، زیرا کار در حافظه در صورت خرابی یا راهاندازی مجدد از بین میرود.
انتخاب رویکرد مناسب بستگی به نیازهای دوام و مقیاسپذیری دارد. برای کارهای پسزمینه با تلاش کم، BackgroundService مناسب است، در حالی که برای کارهای سنگین CPU، یک سرویس/فرآیند جداگانه توصیه میشود. برای کارهایی که باید از راهاندازی مجدد جان سالم به در ببرند، از یک صف پایدار (مانند RabbitMQ/SQS/Service Bus) همراه با یک کارگر استفاده کنید.