عامل ۸-  همروندی (Concurrency)
برنامه را از طریق مدل پردازش (process model) مقیاس‌پذیر و بزرگ کنید

هر برنامه کامپیوتری پس از اجرا با یک یا چند پردازش (process) در سیستم عامل نمایش داده می‌شود. برنامه‌های وب شکل‌های مختلفی برای اجرای پردازش پیدا کرده‌اند. به عنوان مثال پردازش‌ها یا برنامه‌های PHP می‌توانند به عنوان فرزندی از پردازش‌های آپاچی اجرا می‌شوند البته در صورت نیاز (on demand) و بسته به میزان حجم درخواست (request). پردازش‌های جاوا رویکردی متضادی دارند، این رویکرد به کمک JVM و ابتدا با استفاده از پردازش غول‌پیکری که بخش بزرگی از منابع سیستم مانند CPU و حافظه را در ابتدا در اختیار می‌گیرد و سپس با مدیریت داخلی همروندی (concurrency) به کمک ریسمان‌ها(thread) انجام می‌شود. در هر دو نمونه یعنی PHP و جاوا، امکانِ دسترسی و مشاهده‌‌ی پردازش‌های در حال اجرا برای توسعه‌دهندگان برنامه در پایین‌ترین میزان خود قرار دارد.

پردازش‌ها در برنامه دوازده عاملی اهمیت زیادی دارند و شهروندان درجه‌ یک به حساب می‌آیند. (مترجم؛ در زبان‌های برنامه نویسی، شهروند درجه یک عنصری از زبان است که از تمام عملیات موجود که برای سایر عناصر زبان پشتیبانی می‌کند). خط مشی پردازش‌ها در برنامه دوازده عاملی به شدت از مدل پردازش یونیکس (unix) برای دیمن‌های (deamon) سرویس‌های در حال اجرا اقتباس شده است. (مترجم؛ دیمن، پردازشی از نوع سرویس (service process) که در پس‌زمینه (background) اجرا می‌شود و وظیفه‌ی آن نظارت و رسیدگی به سیستم یا فراهم‌سازی خدماتی برای سایر پردازش‌هاست). توسعه‌دهندگان به کمک این مدل می‌توانند معماری برنامه خود را برای مدیریت اجرای کارهای متنوع و متفاوت به گونه‌ای طراحی کنند که هر نوعی از کارها را به یک نوع پردازش (process type) ویژه‌ محول کنند. به عنوان نمونه، درخواست‌های HTTP توسط یک پردازش وب (web process) مدیریت می‌شود و کاری که در پس‌زمنیه برای طولانی‌مدت باید اجرا شود توسط یک پردازش کارگر(worker process) انجام می‌شود.

چنین رویکردی در مورد تقسیم زمان و تسهیم منابع (multiplexing) داخلیِ پردازش‌های مستقل استثنا قائل نمی‌شود. (مترجم؛ ایجاد منابع متعدد منطقی از یک منبع فیزیکی را مالتی پلکس گویند) . این کار معمولا به کمک ریسمان‌های (thread) داخل ماشین مجازی (VM) یا به کمک مدل async/evented که در ابزارهایی مانند EventMachine، Twisted یا Node.js وجود دارند مدیریت می‌شوند. نکته مهم این است که اندازه‌ی ماشین مجازی می‌تواند تا حد مشخصی افزایش یابد (افزایش عمودی)، بنابراین برنامه باید بتواند با چندین پردازش که روی چندین ماشین فیزیکی در حال اجرا هستند نیز کار کند.

وقتی که زمان مقیاس‌پذیری افقی (scale out) فرا برسد تازه اهمیت مدل پردازش نمایان می‌شود (مترجم؛ scale in به معنای افزایش عمودی منابع و scale out به معنای افزایش افقی آنها است.). اصل «اشتراک‌گذاری صفر»(share-nothing) و ماهیت تقسیم‌پذیری افقیِ پردازش‌های برنامه دوازده عاملی به این معنی است که افزایش همروندی (concurrency) عملیاتی ساده و قابل اتکا است. آرایه ای از نوع پردازش (Process type) و تعداد پردازش‌های موجود از هر نوع با نام شکل گیری پردازش (process formation) شناخته می‌شود.

پردازش‌‌ها در برنامه دوازده عاملی هرگز نباید دیمن‌سازی کنند (daemonize) یا فایل‌های PID (process identifier) را دست کاری کنند (مترجم؛ دیمن‌سازی یک برنامه یا اسکریپت به معنای آماده‌سازی آنها برای اجرا در پس‌زمینه (background) و تبدیل کردن آنها به یک دیمن است).. در عوض، برای مدیریت خروجی‌ها، رسیدگی به پردازش‌های از کار افتاده و مدیریت راه‌اندازی‌های مجدد و خاموش‌ کردن‌هایی که توسط کاربر انجام می‌شوند، باید از مدیریت پردازش‌های سیستم عامل استفاده کنند. از جمله‌ی این ابزارهای مدیریت پردازش‌ می‌توان به systemd در لینوکس، مدیر پردازش توزیع‌شده در پلتفرم‌های ابری یا ابزارهایی که برای توسعه‌دهندگان ساخته‌ شده‌اند مانند Foreman اشاره کرد.

نوشته‌های قبلی:
قسمت هشتم: عامل هفتم: اتصال به پورت

مترجم: حمید آقای خاتمی

گزیده:
«از اژدهای هفت‌سر مترس، از مردم نمام بترس که هرچه وی به ساعتی بشکافد، به سالی نتوان دوخت.» قابوسنامه

Share