مقدمه
در این مقاله به بررسی کلی از تحلیل و طراحی سیستمهای نرم افزاری میپردازیم مباحثی شامل: CI/CD، اسکرام، مهارت کار تیمی و با ذهنیت طراحی یک سیستم صف پیامرسان مشابه Kafka و یا RabbbitMQ پیش میرویم.
به طور کلی یکی از ویژگی های مهندس نرمافزار فارغ از برنامه نویسی ، توانایی تجزیه و تحلیل سیستم و پیاده سازی آن است.
صف: در علوم کامپیوتر، صف مجموعه ای از موجودات است که در یک دنباله نگهداری می شوند و می توان آنها را با اضافه کردن موجودیت ها در یک انتهای دنباله و حذف موجودیت ها از انتهای دیگر دنباله تغییر داد که در یک دنباله نگهداری می شوند و می توان آنها را با اضافه کردن موجودیت ها در یک انتهای دنباله و حذف موجودیت ها از انتهای دیگر دنباله تغییر داد.
نمونههای از کاربرد صف در سیستمها:
۱- تعهد تحویل پیام: با توجه به معماری صف، هنگامی که با ناپایداری شبکه روبرو باشیم یا مصرف کننده با مشکل مواجه شود، صف این اطمینان را میدهد که پیام ها از دست نمیروند.
۲- تفکیک تسکها: صف به جداسازی مولفههای تولید کننده و مصرف کننده کمک میکند که این سبب میشود تا تغییرات رو هر بخش مستقل باشد و روی کل سیستم تاثیر نگذارد.
۳- تعادل بار: در سیستمهایی که ترافیک بالایی دارند صف به توزیع یکنواخت ریکوئستها بین سرور ها کمک میکند و بار کمتری بر روی یک سرور خاص دارد.
۴- پردازش غیر همزمان : اجرا شدن کارهای سنگین در پس زمینهی سیستم بدون تاثیرگذاری در عملکرد کلی.
سیستمهای صف
سیستم های صف انواع مختلفی دارند که باتوجه به نیاز هر پروژه یکی از آنها را انتخاب میکنیم.
در زیر ویژگی های دو تا از پرکاربرد ترین سیستم ها (Apache Kafka و RabbitMQ) را بررسی میکنیم:
۱- Apache Kafka
. پردازش پیام ها با سرعت بالا و حجم بالا
پلتفرم های بزرگی که از این سیستم استفاده میکنند میتوان به توییتر (ایکس) ، اوبر، نتفلیکس اشاره کرد
. استفاده از مکانیزم Replication سبب میشود تا حتی درصورت خرابی سرور ها دیتا ها از دست نروند
. کافکا از هر دو مدل پخش و صف پشتیبانی میکند. این امکان باعث میشود که تولید کننده و مصرف کننده به طور مستقل فعالیت کنند.
۲- RabbitMQ
. پشتیبانی از الگوهای مختلف پیام رسانی که نمایانگر انعطاف پذیر بودن این سیستم است یکی از ویژگی های مثبت RabbitMQ است.
ردیت و رابین هود دوتا از پلتفرم های مقیاس بزرگی هستند که از این سیستم استفاده میکنند.
. استفاده از مکانیزمهای تایید پیام و تراکنش استفاده میکنند تا از تحویل پیام مطمئن شود.
. مقیاس پذیر بودن با افزودن گره های بیشتر به خوشه ها
ربیت ام کیو بخاطر ویژگی های بالا معمولا در سیستم های هشدار و ارتباط بین سرویس های مختلف در یک سیستم توزیع شده گزینه مناسبی است.
نیازمندی های غیر عملکردی
در طراحی نرم افزار مقیاس پذیر یکی از مهمترین مفاهیم دنیای سیستم ها است که به طور ساده مقیاس پذیری به توانایی سیستم در در مدیریت کردن و افزایش لود کاری روی سرور گفته میشود.
این حالت ممکن است زمانی رخ دهد که کاربران جدیدی اضافه میشوند و یا تعداد ریکوئست ها بیشتر میشود.
یک سیستم مقیاس پذیر میتواند در شرایط خاص به راحتی منابع خود را گسترش دهد و کیفیت را مانند قبل حفظ میکند.
انواع مقیاس پذیری :
۱- مقیاس پذیری عمودی: یعنی با افزایش ظرفیت ماشین از طریق افزایش منابع مثل حافظه و پردازنده منجر به بهبود موقتی سرویس میدهیم ولی در نهایت با کاهش بازدهی روبرو هستیم.
۲- مقیاس پذیری افقی: یعنی اضافه کردن گره ها و ماشین های بیشتر به سیستم و توزیع لود کاری در چند گره. با اضافه کردن گره های بیشتر میتوان انتظار افزایش متناسب ظرفیت سیستم را داشت.
مقاوم بودن سیستم در برابر خطا
سیستم باید توانایی مقاومت در برابر مشکل را داشته باشد و تاحد امکان کاربر متوجه ضعف سیستم نشود.
اجماع
یکی از ویژگی هایی که در خوشه باید داشته باشیم Consensus است. یعنی هر خوشه از وضعیت خوشه باخبر باشد و با هم هماهنگ باشند.
دو روش برای هماهنگ نگه داشتن خوشه:
۱- leader-less
۲- leader-full
در روش اول گره master وجود ندارد و در واقع همه گرهها به نحوی اشتراک اطلاعات در رابطه با وضعیت خوشه دخیل هستند، الگوریتم های رایج در این روش : hash-ring و gossiping
در روش دوم یک گره به عنوان master انتخاب میشود و کارهای هماهنگی با سایر گره ها را عهده میگیرد. دو الگوریتم معروف برای این مکانیزم : kraft و raft که در هر دو یک گره رهبر انتخاب میشود و سایر گره ها را هماهنگ نگه میدارد.
مانیتورینگ
در یک سیستم نظارت و بررسی لحظهای و دخالت در جزئیات سیستم حائز اهمیت است.
در RabbitMQ میتوان از طریق پنل ها تعداد صف ها و تعداد پیام های هرکدام را در لحظه دید و پردازش موجود در صف ها را تحلیل کرد.
همچنین میتوان به کمک ابزاری مانند Prometheus به صورت پیوسته از زیرساخت و سرور اطلاعات جمع آوری کرد و با Grafana میتواند داده ها را بصری تحلیل کرد.
در مانیتورینگ باید قابلیت هشدار هنگام افزایش بیش از اندازه مصرف دیسک را داشته باشیم تا از درصدی بالاتر رفت به تیم فنی اطلاع دهد.
این هشدارها باید سمت کاربر هم صورت گیرد.
نمایش اعدا به صورت صرفا عددی کافی نیست و نیاز است برخی متریک ها با نمودار بصری سازی شود.
زیرساخت
سیستمی که پیاده سازی میکنیم باید قابل حمل باشد. قابل حمل بودن یعنی قابلیت اجرا در سیستم ها و محیط های مختلف نرم افزاری.
ابزار های این حوزه : Docker
خط لوله CI/CD
برای پیاده سازی این بخش به این مورد باید توجه کنیم که کانیتر ها باید به عنوان بخشی از لوله CI پیاده سازی شود.
ابزار های این حوزه : gitlab CI/CD ، Jenkins، Github Action
تنظیم Orchestrator
برای خودکار سازی در راه اندازی و مدیریت کانتینر ها و ارتباط بین آن ها لازم است.
ابزار های این حوزه: Docker swarm، Kubernetes
سادگی
فرایند متوازن کردن پروژه باید تا جای ممکن ساده باشد. یعنی از انجام کار اضافی جلوگیری شود.
منبع : دکتر آقامحمدی