
Concurrency در ASP.NET Core | راهنمای کامل مدیریت همزمانی در برنامهنویسی بکاند
Concurrency یا «مدیریت همزمانی» یکی از مهمترین مفاهیم در توسعه سیستمهای بکاند مدرن است. اگر با ASP.NET Core کار میکنید، درک صحیح Concurrency برای جلوگیری از باگهای خطرناک و طراحی سیستمهای مقیاسپذیر کاملاً ضروری است.
Concurrency چیست؟
Concurrency به توانایی سیستم برای مدیریت چندین عملیات بهصورت همزمان گفته میشود. در یک وباپلیکیشن، زمانی که صدها کاربر بهصورت همزمان درخواست HTTP ارسال میکنند، سرور باید بتواند این درخواستها را بدون تداخل و تخریب دادهها مدیریت کند.
تفاوت Concurrency و Parallelism
- Concurrency: مدیریت چند کار بهصورت همزمان (ممکن است روی یک هسته اجرا شود).
- Parallelism: اجرای واقعی چند کار بهصورت همزمان روی چند هسته CPU.
در ASP.NET Core تمرکز اصلی روی Concurrency است نه Parallelism.
چرا Concurrency در ASP.NET Core اهمیت دارد؟
- چندین درخواست همزمان به سرور ارسال میشود
- چند کاربر ممکن است یک رکورد دیتابیس را همزمان ویرایش کنند
- چند Thread ممکن است به یک منبع مشترک دسترسی داشته باشند
در صورت مدیریت نادرست، مشکلات زیر رخ میدهد:
- Race Condition
- Deadlock
- Data Corruption
- کاهش شدید Performance
Race Condition چیست؟
Race Condition زمانی رخ میدهد که نتیجه اجرای برنامه به ترتیب اجرای Threadها وابسته باشد. اگر چند Thread همزمان مقدار یک متغیر مشترک را تغییر دهند، نتیجه غیرقابل پیشبینی خواهد بود.
Deadlock چیست؟
Deadlock زمانی رخ میدهد که دو یا چند Thread منتظر آزاد شدن منابع یکدیگر باشند و هیچکدام نتوانند ادامه دهند. این وضعیت باعث قفل شدن کامل سیستم میشود.
مدل Concurrency در ASP.NET Core چگونه کار میکند؟
ASP.NET Core از Thread Pool استفاده میکند. هر درخواست HTTP روی یک Thread پردازش میشود. همچنین این فریمورک از async/await و Non-blocking I/O پشتیبانی میکند که باعث افزایش مقیاسپذیری سیستم میشود.
نکته مهم: ASP.NET Core بهصورت پیشفرض Thread-safe نیست. مدیریت همزمانی بر عهده توسعهدهنده است.
اشتباهات رایج در مدیریت Concurrency
۱. استفاده از متغیرهای static
متغیرهای static بین تمام کاربران مشترک هستند. اگر state داخل آنها نگهداری شود، خطر Race Condition بسیار بالا خواهد بود.
۲. استفاده نادرست از Singleton
اگر سرویسی به صورت Singleton ثبت شود و داخل آن state نگهداری شود، همه کاربران به یک نمونه مشترک دسترسی دارند.
۳. اشتراکگذاری DbContext
DbContext باید به صورت Scoped استفاده شود. اشتراک آن بین چند Thread میتواند منجر به خطاهای غیرقابل پیشبینی شود.
روشهای صحیح مدیریت Concurrency
استفاده از async/await
همیشه از async/await استفاده کنید و از استفاده از .Result یا .Wait() خودداری کنید، زیرا میتواند باعث Deadlock شود.
استفاده از Interlocked
برای عملیات ساده عددی، Interlocked راهحل بهتری نسبت به lock است زیرا باعث بلاک شدن Thread نمیشود.
استفاده از Concurrent Collections
برای دادههای اشتراکی از کلاسهایی مانند ConcurrentDictionary استفاده کنید تا Thread Safety تضمین شود.
Optimistic Concurrency در Entity Framework Core
در برنامههای وب، رایجترین روش مدیریت همزمانی دیتابیس، Optimistic Concurrency است.
در این روش از یک فیلد نسخه (RowVersion) استفاده میشود. اگر دو کاربر همزمان یک رکورد را تغییر دهند، سیستم هنگام ذخیره تغییرات خطای Concurrency ایجاد میکند.
سپس میتوان این خطا را مدیریت کرد و به کاربر اطلاع داد که داده قبلاً تغییر کرده است.
Best Practices برای Concurrency در ASP.NET Core
- همیشه async برنامهنویسی کنید
- از shared mutable state پرهیز کنید
- Singleton فقط برای سرویسهای Stateless استفاده شود
- از RowVersion برای موجودیتهای حساس استفاده کنید
- از Concurrent Collections استفاده کنید
- هیچگاه Task.Result استفاده نکنید
جمعبندی
Concurrency یکی از مهمترین مهارتهای یک Backend Developer حرفهای است. درک صحیح مدیریت همزمانی در ASP.NET Core باعث میشود سیستمهای پایدار، مقیاسپذیر و بدون باگ طراحی کنید.
اگر قصد دارید در سطح حرفهای وارد بازار کار شوید، تسلط بر مفاهیمی مانند Race Condition، Deadlock و Optimistic Concurrency یک مزیت رقابتی جدی برای شما خواهد بود.