فاکتور هشتم: Concurrency
فاکتور هشتم در 12-Factor App بر مقیاسپذیری از طریق مدل فرآیندها (Process Model) تمرکز دارد. هر برنامه کامپیوتری که اجرا میشود، بهصورت یک یا چند فرآیند نشان داده میشود. وب اپلیکیشنها روشهای مختلفی برای مدیریت فرآیندها دارند.
مثالها:
- PHP: فرآیندهای جداگانه به عنوان child process از Apache، که در صورت نیاز و با حجم درخواست ایجاد میشوند.
- Java: یک فرآیند بزرگ JVM که منابع سیستم (CPU و حافظه) را رزرو میکند و concurrency از طریق threads مدیریت میشود.
در هر دو حالت، فرآیندهای در حال اجرا به طور مستقیم برای توسعهدهندگان اپلیکیشن قابل مشاهده نیستند.

مدل 12-Factor برای Concurrency
در اپلیکیشنهای 12-Factor، فرآیندها اولویت بالایی دارند و از مدل فرآیندهای یونیکس برای اجرای سرویسها الهام گرفتهاند. هر نوع کار میتواند به یک نوع فرآیند (Process Type) اختصاص یابد. برای مثال:
- درخواستهای HTTP توسط فرآیندهای web پردازش میشوند.
- کارهای طولانی و پسزمینه توسط فرآیندهای worker انجام میشوند.
این روش اجازه میدهد اپلیکیشن بتواند چندین فرآیند روی چند ماشین فیزیکی اجرا کند (Horizontal Scaling) و افزایش concurrency به صورت ساده و قابل اعتماد انجام شود. مجموعه نوع فرآیندها و تعداد هر نوع، Process Formation نامیده میشود.
نکات اجرایی
- فرآیندهای 12-Factor نباید daemonize شوند یا فایل PID بنویسند.
- به جای آن، از Process Manager سیستمعامل استفاده میشود:
- systemd در محیط لینوکس
- Distributed Process Manager در پلتفرمهای ابری
- ابزارهایی مانند Foreman در محیط توسعه
- Process Manager مسئول مدیریت خروجیها، پاسخ به فرآیندهای کرش کرده و اجرای مجدد فرآیندها است.
نمونه عملی: مقیاسپذیری با فرآیندها
تصور کنید یک اپلیکیشن فروشگاه آنلاین دارید که هم درخواستهای HTTP کاربران را پردازش میکند و هم وظایف پسزمینه مانند ارسال ایمیل و پردازش سفارشها را انجام میدهد.
- Web Process: چندین فرآیند web برای پاسخ به درخواستهای HTTP ایجاد میکنید. اگر تعداد کاربران افزایش پیدا کند، با افزودن فرآیند web جدید، میتوانید بار را بین آنها تقسیم کنید.
- Worker Process: فرآیندهای worker برای پردازش صفهای پسزمینه مانند ارسال ایمیل یا تولید گزارشهای تحلیلی اختصاص داده میشوند. تعداد workerها را میتوان بسته به حجم کار افزایش داد تا وظایف سریعتر انجام شوند.
همه این فرآیندها stateless و share-nothing هستند، بنابراین هر فرآیند جدید بدون مشکل به مجموعه اضافه میشود و نیازی به تغییر کد نیست. مدیریت crashها، restartها و logها بر عهده Process Manager است، بنابراین اپلیکیشن میتواند به صورت پایدار و مقیاسپذیر عمل کند.