پُرگویی در معماری نرم افزار

یک لغت برای مطالب زیاد اما کم عمق، "پُرگویی" است. این لغت به معنای گفتن زیاد بدون گفتن چیز خاصی است. مطالب پُرگویی معمولاً حاوی اطلاعات تکراری، کلیشه‌ای، یا سطحی هستند و به مخاطب کمکی نمی‌کنند تا دانش یا دیدگاه خود را در مورد موضوع گسترش دهد.هنگامی که برنامه‌های وب یا نرم‌افزاری می‌سازیم، دائماً به دنبال راه‌هایی برای بهبود کد خود و استفاده از ابزارهای بهتر برای به‌دست آوردن بهترین تجربه، عملکرد و بسیاری چیزهای دیگر هستیم، نه تنها در سمت مشتری نهایی، بلکه در فرآیند توسعه و استقرار.موضوعات موردنظر در این پُرگویی:Modular MonolithicAWSAPI-first Approach NoSQL DatabasesServerless ArchitectureDomain Driven DesignHexagonal architectureEvent SourcingLow code platformsBusiness Process Management Systems (BPMS)Message Queue (such as Kafka and RabbitMQ)Container orchestration (such as Kubernetes)Log Management Tools (such as ELK)Monitoring tools (such as Prometheus)Static Code Analysis (such as SonarQube)من تو این صفحه میخوام خدمتتون پُرگویی کنم . البته به نظرم میتونه برای دوستانی که دید کمی نسبت به حوزه مهندسی نرم افزار و معماری نرم افزار دارند مفید باشه . Modular Monolithic Architecture در ابتدا معماری مونولیتیکدر معماری مونولیتیک، کل برنامه به عنوان یک سیستم واحد طراحی و توسعه یافته است. این بدان معناست که تمام کد برنامه در یک پایگاه کد نگهداری می شود و همه اجزای برنامه به شدت با هم ادغام شده اند. معماری ماژولاردر معماری ماژولار، برنامه به عنوان مجموعه ای از ماژول های مستقل طراحی و توسعه یافته است. هر ماژول یک عملکرد خاص را انجام می دهد و از طریق رابط های تعریف شده به خوبی با ماژول های دیگر ارتباط برقرار می کند.سفر طراحی معماریدر طول دهه‌های توسعه نرم‌افزار، رویکردها و الگوهای زیادی تکامل یافته‌اند که همه آن‌ها مزایا و چالش‌های خاص خود را دارند.و اما معماری ماژولار - مونولیتیک (Modular-Monolithic Architecture) یک رویکرد ترکیبی است که ویژگی‌های هر دو معماری مونولیتیک و ماژولار را در خود جای داده است. این رویکرد سعی می‌کند تعادلی بین سادگی و انعطاف‌پذیری ایجاد کند.در معماری ماژولار - مونولیتیک، برنامه به عنوان یک سیستم واحد طراحی شده و توسعه یافته است، اما اجزای برنامه به صورت ماژول‌های مستقل سازماندهی و پخش شده‌اند. این بدان معناست که هر ماژول یک عملکرد خاص را انجام می دهد و از طریق رابط‌های تعریف شده به خوبی با ماژول های دیگر ارتباط برقرار می کند.مزایای معماری ماژولار - مونولیتیک ماژولار - مونولیتیک مزایای زیادی مانند موارد زیر را داراست: منطق کسب و کار را کپسوله کنید. مزیت اصلی ماژولار - مونولیتیک این است که منطق کسب و کار در ماژول ها محصور شده است و قابلیت استفاده مجدد را امکان پذیر می کند، در حالی که داده ها ثابت می مانند و الگوهای ارتباطی ساده هستند. کدهای قابل استفاده مجدد، به راحتی قابل بازگردانی هستند . برای تیم های توسعه نرم افزاری بزرگ، توسعه اجزای ماژولار یک برنامه کاربردی، قابلیت استفاده مجدد را افزایش می دهد. این منجر به توسعه سریعتر و سازگارتر می شود. همچنین تغییر یک ماژول روی ماژول های دیگر تاثیر کمتری دارد یا می تواند هیچ تاثیری نداشته باشد. وابستگی های سازمان یافته بهتر میشوند. با معماری ماژولار - مونولیتیک، وابستگی های برنامه بیشتر سازماندهی شده و قابل مشاهده خواهند بود. این به توسعه دهندگان کمک می کند تا به راحتی ارزیابی کنند که کدام بخش از برنامه به کدام وابستگی نیاز دارد. پیچیدگی کمتری نسبت به معماری Microservices دارد. مدیریت ماژولار - مونولیتیک به جای صدها ریزسرویس آسانتر است، زیرا ماژولار - مونولیتیک با زیرساخت های اساسی و هزینه های عملیاتی پایین همراه است. برای تیم ها بهتر است. کار کردن روی قسمت های مختلف کد برای توسعه دهندگان آسان تر است. همانطور که به یاد دارید که مشکل از تیم های تجاری است که باید برای ویژگی های جدید چابک باشند. بنابراین با معماری ماژولار - مونولیتیک، می‌توانیم تیم‌های توسعه‌دهنده خود را به طور مؤثر تقسیم کنیم و الزامات تجاری را با حداقل تأثیر بر یکدیگر پیاده‌سازی کنیم. چالش های معماری ماژولار - مونولیتیک ماژولار - مونولیتیک، همچنین دارای اشکالاتی مانند: نمی توان فناوری را متنوع کرد. ماژولار - مونولیتیک همه مزایای میکروسرویس ها را ارائه نمی دهند. اگر به تنوع در فناوری و انتخاب زبان نیاز دارید، نمی‌توانید با معماری ماژولار - مونولیتیک این کار را انجام دهید. این نوع پشته های فناوری چند زبانه نمی توانند با معماری ماژولار - مونولیتیک استفاده شوند. نمی تواند مقیاس و استقرار مستقل داشته باشد. از آنجایی که برنامه یک سیستم واحد است،قطعات جدا از هم نمی‌توانند مقیاس پذیر باشند یا مانند میکروسرویس‌ها به طور مستقل مستقر شوند. و این نوع برنامه‌ها به دلیل محدودیت‌های مقیاس‌پذیری و همچنین مشکلات عملکردی، باید به معماری میکروسرویس‌ رو کنند.سخنان پایانی این بخشما در مورد مزایا و معایب معماری ماژولار - مونولیتیک بحث کرده یم، اما می خواهم حقیقتی را بیان کنم که از همه مهمتر است . هنگام ساخت و یا طراحی نرم افزار، هیچ فرمولی یا قانون محکم و سریع الجوابی وجود ندارد که برای یک مورد استفاده(USECASE) X، ما نیاز به انتخاب یک معماری Y داشته باشیم.همیشه قاعده اهم و مهم وجود دارد و شما باید آنچه را که برای مورد استفاده (USECASE) شما بهترین است انتخاب کنید. من Stackoverflow.com را مثال میزنم. این سایت با معماری مونولیتیک شروع شد و هنوز هم مونولیتیک است، با 4 میلیارد درخواست در ماه، 3000 req/s پیک و 800M کوئری SQL در روز، 8500/s پیک. در چنین مقیاسی، مونولیتیک بودن برای آنها کار می کند. و این یک نمونه جالب و قابل تفکر است.AWS (Amazon Web Services)آم . AWS یا Amazon Web Services یک سرویس ابر مبتنی بر وب است که توسط شرکت آمازون ارائه می‌شود. این سرویس طیف گسترده‌ای از خدمات را در اختیار کاربران قرار می‌دهد، از جمله فضای ذخیره‌سازی، محاسبه، شبکه، پایگاه داده، هوش مصنوعی، اینترنت اشیا و موارد دیگر.آم . AWS در سال 2002 به عنوان پروژه داخلی در آمازون آغاز شد و در سال 2006 به عموم مردم عرضه شد. از آن زمان به بعد ، AWS به یکی از سریعترین رشد دهنده های فناوری در جهان تبدیل شده است و به صدها هزار مشتری در سراسر جهان خدمات ارائه می دهد.آم . AWS یک سرویس پُرگویی است، یعنی به کاربران این امکان را می‌دهد تا منابع مورد نیاز خود را فقط به میزان استفاده‌شان خریداری کنند. این امر باعث می‌شود که AWS برای کسب‌وکارهای کوچک و متوسط بسیار مقرون‌به‌صرفه باشد.آم . AWS طیف گسترده‌ای از خدمات را در اختیار کاربران قرار می‌دهد که می‌توان از آن‌ها برای راه‌اندازی و مدیریت انواع مختلف برنامه‌ها و وب‌سایت‌ها استفاده کرد. برخی از محبوب‌ترین خدمات AWS عبارتند از:آم . EC2 : یک سرویس محاسبه‌ای که به کاربران امکان می‌دهد تا سرورهای مجازی در ابر اجاره کنند.آم . S3 : یک سرویس ذخیره‌سازی که به کاربران امکان می‌دهد تا داده‌های خود را در ابر ذخیره کنند.آم . RDS : یک سرویس پایگاه داده که به کاربران امکان می‌دهد تا پایگاه‌های داده‌ی خود را در ابر اجرا کنند.آم . Lambda : یک سرویس محاسبه‌ای بدون سرور که به کاربران امکان می‌دهد تا کد خود را بدون نیاز به مدیریت سرورها اجرا کنند.آم . AI : یک سرویس هوش مصنوعی که به کاربران امکان می‌دهد تا از هوش مصنوعی برای حل مشکلات خود استفاده کنند.آم . IoT : یک سرویس اینترنت اشیا که به کاربران امکان می‌دهد تا دستگاه‌های اینترنت اشیا خود را در ابر مدیریت کنند.آم . AWS یک سرویس قدرتمند و انعطاف‌پذیر است که می‌تواند برای راه‌اندازی و مدیریت انواع مختلف برنامه‌ها و وب‌سایت‌ها استفاده شود. این سرویس برای کسب‌وکارهای کوچک و متوسط بسیار مقرون‌به‌صرفه است و به آن‌ها امکان می‌دهد تا بدون سرمایه‌گذاری زیاد در زیرساخت‌های خود، کسب‌وکار خود را توسعه دهند.قضیه ( آم .): دوستان و خوانندگان عزیز ، من نمی خوام بی احترامی کنم اما به مشکلی عجیب بر خوردم که قبلا وجود نداشت ... نمی تونم با کلمات انگلیسی شروع کنم به نوشتن درصورتی که کل پاراگراف چپ چین نشه ! قابل توجه ویرگولمنبع اول منبع دوم API-first Approachرویکرد API-first یک روش توسعه نرم‌افزار است که در آن ابتدا API‌های نرم‌افزار طراحی می‌شوند و سپس سایر اجزای نرم‌افزار، مانند رابط کاربری، بر اساس آن API‌ها طراحی می‌شوند. این رویکرد مزایای متعددی دارد، از جمله:تمرکز بر نیازهای کاربران: در این رویکرد، ابتدا نیازهای کاربران شناسایی می‌شوند و سپس API‌ها بر اساس آن نیازها طراحی می‌شوند. این امر باعث می‌شود که API‌ها پاسخگوی نیازهای واقعی کاربران باشند.قابلیت توسعه مجدد و استفاده مجدد: API‌ها می‌توانند به راحتی در سایر نرم‌افزارها استفاده شوند. این امر باعث می‌شود که نرم‌افزارها انعطاف‌پذیرتر و قابل توسعه مجدد باشند.کاهش هزینه و زمان توسعه: در این رویکرد، نیازی به طراحی مجدد API‌ها در صورت تغییر نیازهای کاربران یا نیاز به توسعه مجدد نرم‌افزار نیست. این امر باعث می‌شود که هزینه و زمان توسعه نرم‌افزار کاهش یابد.مراحل توسعه نرم‌افزار با رویکرد API-first به شرح زیر است:مشخص کردن نیازهای کاربران: در این مرحله، نیازهای کاربران شناسایی می‌شوند. این نیازها می‌توانند از طریق مصاحبه با کاربران، بررسی داده‌های موجود یا سایر روش‌ها شناسایی شوند.طراحی API‌ها: در این مرحله، API‌ها بر اساس نیازهای کاربران طراحی می‌شوند. این API‌ها باید به گونه‌ای طراحی شوند که پاسخگوی نیازهای واقعی کاربران باشند.توسعه نرم‌افزار: در این مرحله، نرم‌افزار بر اساس API‌های طراحی شده توسعه داده می‌شود. این نرم‌افزار می‌تواند شامل رابط کاربری، منطق کسب‌وکار یا سایر اجزای نرم‌افزار باشد.رویکرد API-first برای توسعه نرم‌افزارهای مبتنی بر وب، نرم‌افزارهای سرویس‌محور و نرم‌افزارهای موبایل بسیار مناسب است. این رویکرد می‌تواند باعث افزایش کیفیت، انعطاف‌پذیری و مقیاس‌پذیری نرم‌افزار شود.NoSQL Databasesپایگاه داده‌های NoSQL، یک نوع پایگاه داده است که از مدل‌های داده‌ای غیرروابطی مانند اشیاء، جفت کلید-مقدار، یا نمودارها استفاده می‌کند. این پایگاه داده‌ها در مقابل پایگاه داده‌های رابطه‌ای سنتی هستند که از مدل داده‌ای رابطه‌ای استفاده می‌کنند.پایگاه داده‌های NoSQL برای کاربردهایی که نیاز به مقیاس‌پذیری، عملکرد بالا، یا انعطاف‌پذیری بالایی دارند، مناسب هستند. این پایگاه داده‌ها می‌توانند برای ذخیره‌سازی انواع مختلف داده‌ها، از جمله داده‌های متنی، داده‌های عددی، و داده‌های ساختاریافته و غیرساختاریافته، استفاده شوند.پایگاه داده‌های NoSQL را می‌توان بر اساس مدل داده‌ای که از آن استفاده می‌کنند، طبقه‌بندی کرد. برخی از مدل‌های داده‌ای NoSQL عبارتند از:اشیاء: در این مدل، داده‌ها به صورت اشیاء ذخیره می‌شوند. هر شیء دارای یک مجموعه از ویژگی‌ها است.جفت کلید-مقدار: در این مدل، داده‌ها به صورت جفت‌های کلید-مقدار ذخیره می‌شوند. کلید یک مقدار منحصربه‌فرد است که برای شناسایی مقدار استفاده می‌شود.نمودارها: در این مدل، داده‌ها به صورت نمودارهای گراف ذخیره می‌شوند. نمودار گراف یک ساختار داده‌ای است که از گره‌ها و لبه‌ها تشکیل شده است.برخی از پایگاه داده‌های NoSQL محبوب که شاید عبارتند از:آم . MongoDB: یک پایگاه داده اشیاء است که برای ذخیره‌سازی داده‌های ساختاریافته و غیرساختاریافته استفاده می‌شود.آم . Cassandra: یک پایگاه داده توزیع‌شده است که برای ذخیره‌سازی داده‌های بزرگ استفاده می‌شود.آم . Redis: یک پایگاه داده جفت کلید-مقدار است که برای ذخیره‌سازی داده‌های سریع و مقیاس‌پذیر استفاده می‌شود.آم . Neo4j: یک پایگاه داده نمودار است که برای ذخیره‌سازی داده‌های مرتبط استفاده می‌شود.Serverless Architectureمعماری Serverless یا رایانش بدون سرور یک مدل پردازش ابری است که در آن توسعه‌دهندگان می‌توانند بدون نیاز به مدیریت سرور، کد خود را اجرا کنند. در این مدل، سرورها توسط ارائه‌دهنده خدمات ابری مدیریت می‌شوند و هزینه‌ها تنها بر اساس استفاده از منابع محاسباتی محاسبه می‌شوند.معماری Serverless از دو مفهوم اصلی تشکیل شده است:توابع به عنوان سرویس (FaaS): در این مدل، برنامه از مجموعه‌ای از توابع تشکیل شده است که وظیفه پاسخ‌گویی به درخواست‌ها را بر عهده دارند. تامین سرور و منابع لازم برای اجرای این توابع به هر تعدادی که فراخوانی شوند، برعهده تامین کننده زیرساخت است و هزینه‌ها به ازای هر فراخوانی تابع، منظور می‌شود.رویدادها (Events): در این مدل، توابع بر اساس رویدادهای خاصی اجرا می‌شوند. به عنوان مثال، یک تابع می‌تواند بر اساس دریافت یک پیام از یک سرویس پیام‌رسانی اجرا شود.معماری Serverless مزایای زیر را دارد:کاهش هزینه: در معماری Serverless، هزینه‌ها تنها بر اساس استفاده از منابع محاسباتی محاسبه می‌شوند. بنابراین، اگر برنامه شما از منابع محاسباتی زیادی استفاده نمی‌کند، می‌توانید با هزینه‌ای کمتر از معماری‌های سنتی، آن را اجرا کنید.مقیاس‌پذیری آسان: در معماری Serverless، تامین‌کننده خدمات ابری به طور خودکار منابع محاسباتی را بر اساس نیاز برنامه شما، افزایش یا کاهش می‌دهد. بنابراین، شما نیازی به نگرانی در مورد مقیاس‌پذیری برنامه خود ندارید.ساده‌سازی توسعه و مدیریت: در معماری Serverless، توسعه‌دهندگان تنها نیاز به نوشتن کد خود دارند و نیازی به مدیریت زیرساخت ندارند. بنابراین، توسعه و مدیریت برنامه‌ها آسان‌تر می‌شود.معماری Serverless برای برنامه‌هایی که از منابع محاسباتی زیادی استفاده نمی‌کنند یا نیاز به مقیاس‌پذیری آسان دارند، مناسب است. به عنوان مثال، برنامه‌های زیر می‌توانند از معماری سرورلس استفاده کنند:اپلیکیشن‌های وب و موبایلسرویس‌های APIپردازش داده‌های بزرگیادگیری ماشینبرخی از ارائه‌دهندگان خدمات ابری که از معماری Serverless پشتیبانی می‌کنند عبارتند از:AWS LambdaAzure FunctionsGoogle Cloud FunctionsIBM Cloud FunctionsHerokuDomain Driven Designطراحی دامنه محور (DDD) یک رویکرد طراحی نرم‌افزار است که تمرکز اصلی آن، مدل کردن نرم‌افزاری است که دامنه نرم‌افزار با دانش دریافتی از متخصصان آن دامنه، مطابقت داشته باشد. در این رویکرد طراحی، ساختار و زبان کد نرم‌افزار (نام کلاس‌ها، نام متدها، نام متغیرهای کلاس) باید با دامنه کسب و کار مطابق داشته باشد.آم . DDD توسط اریک ایوانز در کتاب خود با همین عنوان که در سال ۲۰۰۳ منتشر شد، ابداع شده‌است. ایوانز معتقد است که DDD یک رویکرد ضروری برای توسعه نرم‌افزار در دامنه‌های پیچیده است.آم . DDD شامل مجموعه‌ای از مفاهیم و تکنیک‌ها است که می‌توانند برای بهبود کیفیت نرم‌افزار، افزایش قابلیت نگهداری آن و تسهیل همکاری بین توسعه‌دهندگان و متخصصان دامنه استفاده شوند.مزایای DDDآم . DDD می‌تواند مزایای متعددی را برای توسعه نرم‌افزار به همراه داشته باشد، از جمله:کیفیت بالاتر: DDD می‌تواند به بهبود کیفیت نرم‌افزار کمک کند، زیرا باعث می‌شود نرم‌افزار دقیق‌تر و سازگارتر با دامنه کسب و کار باشد.قابلیت نگهداری بهتر: DDD می‌تواند قابلیت نگهداری نرم‌افزار را افزایش دهد، زیرا باعث می‌شود نرم‌افزار از پیچیدگی کمتری برخوردار باشد و درک آن برای توسعه‌دهندگان و متخصصان دامنه آسان‌تر باشد.همکاری بهتر: DDD می‌تواند همکاری بین توسعه‌دهندگان و متخصصان دامنه را تسهیل کند، زیرا باعث می‌شود هر دو گروه از یک زبان مشترک استفاده کنند.مفاهیم اصلی DDDآم . DDD شامل مجموعه‌ای از مفاهیم اصلی است که می‌توانند برای توسعه نرم‌افزار در دامنه‌های پیچیده استفاده شوند. برخی از این مفاهیم عبارتند از:دامنه: دامنه مجموعه‌ای از مفاهیم و قوانینی است که یک کسب و کار را تعریف می‌کنند.زبان مشترک: زبان مشترک مجموعه‌ای از کلمات و عباراتی است که برای توصیف مفاهیم دامنه استفاده می‌شود.مدل دامنه: مدل دامنه مدلی از دامنه است که در نرم‌افزار پیاده‌سازی می‌شود.منطق تجاری: منطق تجاری مجموعه‌ای از قوانین و رویه‌هایی است که کسب و کار را هدایت می‌کنند.واحدهای دامنه: واحدهای دامنه مجموعه‌ای از مفاهیم مرتبط در دامنه هستند که می‌توانند به صورت مستقل از یکدیگر توسعه یابند.تکنیک‌های DDDآم . DDD همچنین شامل مجموعه‌ای از تکنیک‌ها است که می‌توانند برای پیاده‌سازی مفاهیم اصلی آن استفاده شوند. برخی از این تکنیک‌ها عبارتند از:تجزیه و تحلیل دامنه: تجزیه و تحلیل دامنه فرآیندی است که برای درک مفاهیم و قوانین دامنه استفاده می‌شود.طراحی مدل دامنه: طراحی مدل دامنه فرآیندی است که برای ایجاد مدل دامنه استفاده می‌شود.تولید کد: تولید کد فرآیندی است که برای پیاده‌سازی مدل دامنه در نرم‌افزار استفاده می‌شود.منبع اولHexagonal architectureدر معماری شش ضلعی، نرم افزار به یک شش ضلعی و چندین پورت تقسیم می شود. شش ضلعی هسته نرم افزار است و پورت ها نقاط اتصال بین شش ضلعی و دنیای خارج هستند.شش ضلعی نماد یکپارچه سازی است. همه چیز در داخل شش ضلعی یکپارچه است و از تغییرات دنیای خارج جدا است.پورت ها نماد انعطاف پذیری هستند. هر پورت می تواند به هر چیزی در دنیای خارج متصل شود.در یک استعاره عامیانه، می توان گفت که شش ضلعی یک لانه زنبوری است. لانه زنبوری یک ساختار محکم و یکپارچه است که از تغییرات محیطی محافظت می کند. زنبورها می توانند از لانه زنبوری برای حمل و نقل غذا، تولید عسل و پرورش فرزندان خود استفاده کنند.در مورد نرم افزار، شش ضلعی می تواند برای حمل و نقل داده ها، ارائه خدمات و اجرای منطق تجاری استفاده شود.شش ضلعی یک ساختار هندسی است که از شش ضلع تشکیل شده است. هر ضلع نماد یک لایه یا بخش از نرم افزار است.شش ضلعی یک ساختار محکم است که می تواند در برابر تغییرات محیطی مقاومت کند. این بدان معناست که نرم افزاری که از معماری شش ضلعی استفاده می کند، می تواند در برابر تغییرات در دنیای خارج، مانند تغییرات در فناوری یا نیازهای کسب و کار، مقاوم باشد.شش ضلعی یک ساختار انعطاف پذیر است که می تواند به هر چیزی متصل شود. این بدان معناست که نرم افزاری که از معماری شش ضلعی استفاده می کند، می تواند به راحتی با سیستم های دیگر یا فناوری های جدید متصل شود.خلاصه اینکه ، معماری شش ضلعی یک الگو برای طراحی نرم افزار است که بر یکپارچه سازی، انعطاف پذیری و مقاومت تأکید دارد.Event Sourcingآم . Event Sourcing یک الگوریتم معماری نرم افزاره که در آن، تمام تغییراتی که در یک سیستم رخ میده، به صورت رویداد ثبت میشن. این رویدادها میتونن هر چیزی باشن، از یک تغییر ساده در مقدار یک فیلد تا یک اتفاق مهم مثل ثبت سفارش یا پرداخت پول.فرض کن که داریم یک سیستم فروشگاه اینترنتی می‌سازیم. در این سیستم، هر بار که یک کاربر محصولی رو سفارش میده، یک رویداد سفارش ثبت میشه. این رویداد شامل اطلاعاتی مثل شناسه کاربر، شناسه محصول، تعداد محصولات و ... هست.در سیستم‌های سنتی، معمولاً فقط آخرین وضعیت سیستم ذخیره می‌شه. یعنی اگر بخوایم ببینیم که در تاریخ فلان، فلان کاربر چه محصولاتی رو سفارش داده، باید تمام تغییراتی که از آن تاریخ تا الان در سیستم رخ داده رو دنبال کنیم.اما در Event Sourcing، تمام تغییراتی که در سیستم رخ میده، ذخیره می‌شن. بنابراین، برای اینکه ببینیم در تاریخ فلان، فلان کاربر چه محصولاتی رو سفارش داده، فقط کافیه رویدادها رو از ابتدای تاریخ تا تاریخ مورد نظر بخونیم.آم . Event Sourcing مزایای زیادی داره. از جمله این مزایا میشه به موارد زیر اشاره کرد:قابلیت بازیابی داده‌ها: در صورت بروز مشکل، می‌تونیم با استفاده از رویدادها، سیستم رو به حالت قبل از بروز مشکل برگردونیم.قابلیت بازسازی داده‌ها: با استفاده از رویدادها، می‌تونیم داده‌ها رو به شکل‌های مختلف بازسازی کنیم. مثلاً می‌تونیم یک گزارش از تاریخچه سفارشات کاربران تهیه کنیم.قابلیت مقیاس‌پذیری: Event Sourcing باعث می‌شه که سیستم‌های نرم افزاری مقیاس‌پذیرتر بشن.البته Event Sourcing معایبی هم داره. از جمله این معایب میشه به موارد زیر اشاره کرد:پیچیدگی: Event Sourcing یک الگوریتم پیچیده‌ایه که پیاده‌سازیش نیاز به دانش و تجربه کافی داره.هزینه: پیاده‌سازی Event Sourcing می‌تونه هزینه‌بر باشه.در کل، Event Sourcing یک الگوریتم معماری نرم افزاره که مزایای زیادی داره. اما پیاده‌سازیش نیاز به دانش و تجربه کافی داره.حالا می‌خوام یه مثال عامیانه از Event Sourcing بزنم. فرض کن که داری یه دفترچه خاطرات داری و هر روز یه اتفاقی که افتاده رو توش می‌نویسی. وقتی می‌خوای ببینی که در تاریخ فلان، فلان اتفاقی افتاده، فقط کافیه دفترچه خاطرات رو از اول بخونی.آم . Event Sourcing هم همینطوره. تمام تغییراتی که در سیستم رخ میده، میشه به عنوان یه اتفاق در نظر گرفت. بنابراین، Event Sourcing شبیه یه دفترچه خاطرات برای سیستم نرم افزاریه.Low code platformsآم . Low code platforms یه جور نرم‌افزاریه که به آدم‌ها کمک می‌کنه بدون اینکه کدنویسی بلد باشن، نرم‌افزار بسازن. این نرم‌افزارها با یه رابط کاربری گرافیکی (GUI) کار می‌کنن و به آدم‌ها اجازه می‌دن که اجزای نرم‌افزار رو مثل لوپ، شرط، دکمه و ... رو به هم وصل کنن و نرم‌افزار رو بسازن.فرض کن که می‌خوای یه سایت فروشگاهی بسازی. بدون استفاده از Low code platforms، باید کدهای زیادی بنویسی تا سایت رو بسازن. ولی با استفاده از Low code platforms، فقط کافیه که اجزای سایت رو مثل لوپ، شرط، دکمه و ... رو به هم وصل کنی و سایت رو بسازی.آم . Low code platforms مزایای زیادی داره. اول اینکه، ساخت نرم‌افزار رو برای آدم‌هایی که کدنویسی بلد نیستن، آسون می‌کنه. دوم اینکه، زمان و هزینه ساخت نرم‌افزار رو کاهش می‌ده. سوم اینکه، انعطاف‌پذیری نرم‌افزار رو افزایش می‌ده.آم . Low code platforms در حال حاضر داره خیلی محبوب می‌شه. شرکت‌های بزرگ و کوچک زیادی از Low code platforms استفاده می‌کنن.حالا یه مثال عامیانه از استفاده از Low code platforms بزنم. فرض کن که تو یه فروشگاه اینترنتی کار می‌کنی. می‌خوای یه قابلیت جدید به فروشگاه اضافه کنی. مثلاً می‌خوای یه بخش نظرات برای محصولات اضافه کنی. بدون استفاده از Low code platforms، باید کدهای زیادی بنویسی تا این قابلیت رو اضافه کنی. ولی با استفاده از Low code platforms، فقط کافیه که یه سری اجزا رو به هم وصل کنی و قابلیت نظرات رو اضافه کنی.آم . Low code platforms یه ابزار قدرتمندیه که می‌تونه به همه کمک کنه تا نرم‌افزار بسازن. اگر کدنویسی بلد نیستی، Low code platforms یه گزینه عالی برای ساخت نرم‌افزاره.Business Process Management Systems (BPMS)آم . BPMS مخفف Business Process Management Systems هست که میشه گفت یه نرم افزاره که به سازمان ها کمک میکنه فرآیندهای کاری خودشون رو بهتر مدیریت کنن.فرض کن یه شرکتی داره یه محصولی رو تولید میکنه. از سفارش مشتری تا تحویل محصول، یه سری فرآیند هست که باید طی بشه. این فرآیندها شامل کارهایی مثل ثبت سفارش، تولید محصول، بسته بندی و ارسال محصول هستن.حالا فرض کن که شرکت از BPMS استفاده میکنه. این نرم افزار به شرکت کمک میکنه تا این فرآیندها رو به صورت دقیق و قابل پیش بینی مدلسازی کنه. یعنی مشخص میکنه که هر کار توسط چه کسی و در چه زمانی باید انجام بشه.استفاده از BPMS یه سری مزایا داره. اول اینکه باعث میشه فرآیندها به صورت موثرتری انجام بشن. یعنی زمان کمتری صرف میشن و خطاها کمتر میشن. دوم اینکه باعث میشه شرکت دید بهتری نسبت به فرآیندهاش داشته باشه. یعنی میتونه نقاط ضعف فرآیندها رو شناسایی کنه و اونها رو بهبود بده.حالا بیا یه مثال از BPMS توی زندگی روزمره بزنم. فرض کن که تو یه تاکسی سوار شدی. راننده تاکسی از نرم افزار BPMS استفاده میکنه. این نرم افزار به راننده کمک میکنه تا مسیر رو به صورت بهینه طی کنه و از ترافیک دوری کنه. همچنین به راننده کمک میکنه تا اطلاعات تماس مشتری رو به صورت خودکار ثبت کنه.خلاصه اینکه BPMS یه ابزار مفید برای سازمان ها و کسب و کارهاست که میتونه به بهبود فرآیندهای کاری و افزایش بهره وری کمک کنه.چند تا مثال دیگه از کاربرد BPMS:بانک ها برای پردازش تراکنش های مالیبیمارستان ها برای مدیریت پرونده های پزشکیمدارس برای مدیریت فرآیند ثبت نام و آموزشدولت ها برای مدیریت خدمات عمومیدر کل، BPMS یه ابزار قدرتمنده که میتونه به سازمان ها کمک کنه تا فرآیندهای کاری خودشون رو بهینه و موثرتر کنن.Message Queue (such as Kafka and RabbitMQ)فرض کن یه برنامه داری که هر چند وقت یه بار یه پیامی رو به یه برنامه دیگه میفرسته. مثلا یه برنامه که وضعیت دمای هوا رو در شهر تهران جمع آوری میکنه و هر چند دقیقه یه بار این اطلاعات رو به یه برنامه دیگه که وضعیت هوا رو در همه شهرهای ایران نشون میده، میفرسته.حالا فرض کن که اون برنامه دیگه، یه برنامه بزرگ و پیچیده باشه که همزمان با دریافت پیام های زیادی از برنامه های مختلف سر و کار داره. اگه برنامه اول پیام رو مستقیما به برنامه دوم بفرسته، ممکنه که برنامه دوم در لحظه دریافت پیام، مشغول انجام کار دیگه ای باشه و پیام رو دریافت نکنه. یا ممکنه که برنامه دوم ظرفیت لازم برای دریافت پیام رو نداشته باشه.در این حالت، میشه از Message Queue استفاده کرد. Message Queue یه برنامه واسطه هست که پیام های برنامه اول رو دریافت میکنه و اونها رو در صفی نگه میداره. بعدا، برنامه دوم میتونه به Message Queue مراجعه کنه و پیام های مورد نیاز خودش رو از صف دریافت کنه.آم . Message Queue مزایای زیادی داره. یکی از مزایای اصلی اون اینه که باعث افزایش کارایی برنامه میشه. چون برنامه اول دیگه لازم نیست نگران این باشه که پیامش رو درست دریافت میکنه یا نه. همچنین، Message Queue باعث افزایش انعطاف پذیری برنامه میشه. چون برنامه دوم میتونه در هر زمان و مکانی به Message Queue مراجعه کنه و پیام مورد نیاز خودش رو دریافت کنه.در زبان عامیانه، Message Queue رو میشه یه جعبه پستی تصور کرد. برنامه اول پیامش رو توی جعبه پستی میذاره و برنامه دوم میره از جعبه پستی پیام رو برمیداره.بعضی از Message Queue های معروف عبارتند از:KafkaRabbitMQAmazon SQSAzure Queue Storageآم . Kafka یه Message Queue محبوب برای پردازش داده های جریانی هست. RabbitMQ یه Message Queue محبوب برای برنامه های کاربردی هست. Amazon SQS و Azure Queue Storage Message Queue های ابری هستن که توسط شرکت های آمازون و مایکروسافت ارائه میشن.Container orchestration (such as Kubernetes)فرض کن که تو یه رستوران بزرگ داری که توش یه عالمه ظرف و وسایل مختلف داری. حالا فرض کن که تو می‌خوای یه غذای جدید درست کنی که نیاز به یه سری از این ظرف‌ها و وسایل داره. اگه خودت بری و هر کدوم از این ظرف‌ها و وسایل رو یکی‌یکی پیدا کنی و کنار هم بذار، کار خیلی سخت و زمان‌بری میشه. حالا اگه یه آدم دیگه رو بگیری که بهت کمک کنه، کار کمی راحت‌تر میشه. ولی بازم کار خیلی دقیق و منظمی نیست.حالا فرض کن که یه سیستم کامپیوتری داشته باشی که این کار رو برای تو انجام بده. این سیستم کامپیوتری می‌دونه که کدوم ظرف‌ها و وسایل برای درست کردن غذای مورد نظرت لازمه. این سیستم می‌تونه به صورت خودکار این ظرف‌ها و وسایل رو پیدا کنه و کنار هم بذاره. این سیستم همچنین می‌تونه تعداد این ظرف‌ها و وسایل رو متناسب با تعداد غذای مورد نظرت تنظیم کنه.آم . Container orchestration هم دقیقاً همین کار رو انجام میده. این سیستم کامپیوتری می‌دونه که کدوم containerها برای درست کردن یه برنامه یا سرویس مورد نیازه. این سیستم می‌تونه به صورت خودکار این containerها رو روی سرورها یا کامپیوترها پخش کنه و تعدادشون رو متناسب با نیاز برنامه یا سرویس تنظیم کنه.به زبان عامیانه، Container orchestration یه سیستم کامپیوتری هست که کار مدیریت containerها رو برای ما آسون‌تر می‌کنه. این سیستم می‌تونه کارهای زیر رو انجام بده:پیدا کردن و راه‌اندازی containerهامدیریت شبکه بین containerهامدیریت منابع بین containerهامقیاس‌پذیر کردن containerهامدیریت سلامت containerهاآم . Container orchestration برای توسعه‌دهندگان و تیم‌های عملیاتی خیلی مفید هست. این سیستم می‌تونه کار توسعه و نگهداری برنامه‌ها و سرویس‌ها رو خیلی ساده‌تر کنه.یه مثال از کاربرد Container orchestration اینه که فرض کن که شما یه وب‌سایت دارید که تعداد بازدیدکنندگانش خیلی زیاده. اگه شما به صورت دستی containerها رو برای این وب‌سایت راه‌اندازی کنید، کار خیلی سخت و زمان‌بری میشه. ولی اگه از Container orchestration استفاده کنید، این سیستم به صورت خودکار containerها رو برای شما راه‌اندازی می‌کنه و تعدادشون رو متناسب با تعداد بازدیدکنندگان تنظیم می‌کنه.یه مثال دیگه از کاربرد Container orchestration اینه که فرض کن که شما یه برنامهٔ پردازش داده دارید که نیاز به منابع زیادی داره. اگه شما به صورت دستی containerها رو برای این برنامه راه‌اندازی کنید، ممکنه که منابع کافی برای این برنامه فراهم نباشه. ولی اگه از Container orchestration استفاده کنید، این سیستم به صورت خودکار منابع مورد نیاز برنامه رو برای شما فراهم می‌کنه.در کل، Container orchestration یه ابزار قدرتمند هست که می‌تونه کار توسعه و نگهداری برنامه‌ها و سرویس‌ها رو خیلی ساده‌تر کنه.Log Management Tools (such as ELK)ابزارهای مدیریت لاگ، مثل ELK، مثل یک اتاق نگهبانی برای سیستم‌های کامپیوتری هستند. این اتاق نگهبانی، لاگ‌هایی که از سیستم‌های مختلف تولید می‌شن رو جمع می‌کنه و اونا رو نگه می‌داره.لاگ‌ها، گزارش‌هایی از فعالیت‌های سیستم‌ها هستند. به عنوان مثال، لاگ‌های سیستم‌عامل، گزارش‌هایی از فعالیت‌های کاربران، برنامه‌ها و سخت‌افزارها هستند. لاگ‌های برنامه‌های کاربردی، گزارش‌هایی از فعالیت‌های کاربران و برنامه‌ها هستند. لاگ‌های شبکه، گزارش‌هایی از فعالیت‌های شبکه هستند.ابزارهای مدیریت لاگ، این لاگ‌ها رو جمع می‌کنن و اونا رو ذخیره می‌کنن. این کار به مدیران سیستم کمک می‌کنه تا فعالیت‌های سیستم‌ها رو نظارت کنن و مشکلات احتمالی رو شناسایی کنن.فرض کن که یک کاربر سعی کنه به سیستم‌های شبکه‌ی سازمان شما نفوذ کنه. ابزار مدیریت لاگ، این فعالیت رو در لاگ‌های شبکه ثبت می‌کنه. مدیر سیستم می‌تونه با استفاده از ابزار مدیریت لاگ، این لاگ رو بررسی کنه و متوجه بشه که یک کاربر سعی داشته به سیستم‌ها نفوذ کنه.ابزارهای مدیریت لاگ، کاربردهای مختلفی دارند. از جمله کاربردهای این ابزارها می‌تونیم به موارد زیر اشاره کنیم:نظارت بر عملکرد سیستم‌هاشناسایی مشکلات احتمالیتجزیه و تحلیل رفتار کاربرانپیگیری فعالیت‌های امنیتیابزارهای مدیریت لاگ، ابزارهای مهمی هستند که می‌تونن به مدیران سیستم کمک کنن تا سیستم‌ها رو به‌طور موثرتری مدیریت کنن.حالا بیایید کمی درباره‌ی ELK صحبت کنیم. ELK یک مجموعه‌ی نرم‌افزاری رایگان و متن‌باز برای مدیریت لاگ است. این مجموعه‌ی نرم‌افزاری از سه ابزار زیر تشکیل شده است:آم . Elasticsearch: یک موتور جستجوی متنی که برای ذخیره و جستجو در لاگ‌ها استفاده می‌شود.آم . Logstash: یک ابزار جمع‌آوری و تجزیه لاگ است.آم . Kibana: یک ابزار بصری‌سازی داده‌ها که برای نمایش لاگ‌ها استفاده می‌شود.آم . ELK یک ابزار قدرتمند و انعطاف‌پذیر است که می‌تونه برای انواع مختلفی از سیستم‌ها استفاده بشه. این ابزار برای مدیران سیستم‌های کوچک و متوسط تا سازمان‌های بزرگ مناسب است. منبع اولMonitoring tools (such as Prometheus)مانیتورینگ ابزاریه که بهت میگه سیستمت چطور کار میکنه.فرض کن یه ماشین داری. مانیتورینگ مثل اینه که یه سنسور روی ماشینت نصب کنی که دمای موتور، سرعت چرخ‌ها، میزان بنزین و چیزای دیگه رو اندازه بگیره. با این اطلاعات میتونی ببینی که ماشینت چطور کار میکنه و اگه مشکلی پیش اومد، سریع متوجه بشی.مانیتورینگ در سیستم‌های کامپیوتری هم همین کارو میکنه. به‌طور کلی، مانیتورینگ دو تا هدف داره:تشخیص مشکلات: با مانیتورینگ میتونی ببینی که سیستمت چطور کار میکنه و اگه مشکلی پیش اومد، سریع متوجه بشی. اینجوری میتونی قبل از اینکه مشکل باعث خرابی سیستم بشه، جلوشو بگیری.بهینه‌سازی عملکرد: با مانیتورینگ میتونی ببینی که سیستمت چطور کار میکنه و نقاط ضعفش رو شناسایی کنی. با رفع این نقاط ضعف، میتونی عملکرد سیستمتو بهبود ببخشی.آم . Prometheus یه ابزار مانیتورینگ متن‌باز و محبوبه. Prometheus از چیزی به اسم "متریک" برای جمع‌آوری اطلاعات استفاده میکنه. متریک یه عدده که وضعیت یه چیز رو نشون میده. مثلاً دمای موتور یه متریکه.آم . Prometheus از طریق HTTP با منابع مختلف ارتباط برقرار میکنه و اطلاعاتشون رو جمع‌آوری میکنه. این منابع میتونن یه سرور، یه برنامه، یه دیتابیس یا هر چیز دیگه‌ای باشن.آم . Prometheus اطلاعات جمع‌آوری‌شده رو در یه پایگاه داده ذخیره میکنه. این پایگاه داده رو میتونی از طریق وب‌سایت Prometheus یا از طریق API Prometheus بررسی کنی.آم . Prometheus برای سیستم‌های بومی ابری خیلی مناسبه. سیستم‌های بومی ابری معمولاً پویا و پیچیده هستن و مانیتورینگشون کار سختیه. Prometheus به‌خاطر انعطاف‌پذیری و سهولت استفاده، برای این سیستم‌ها خیلی مناسبه.اگر میخوای سیستمت رو به‌طور موثر مانیتور کنی، Prometheus یه گزینه عالیه. Prometheus متن‌باز و رایگانه و یادگیریش هم خیلی راحته.چند تا مثال از کاربردهای Prometheus:مانیتورینگ سرورها: Prometheus میتونه اطلاعات مختلفی مثل دمای CPU، میزان استفاده از حافظه، سرعت شبکه و غیره رو از سرورها جمع‌آوری کنه.مانیتورینگ برنامه‌ها: Prometheus میتونه اطلاعات مختلفی مثل تعداد درخواست‌های برنامه، زمان پاسخگویی برنامه و غیره رو از برنامه‌ها جمع‌آوری کنه.مانیتورینگ دیتابیس‌ها: Prometheus میتونه اطلاعات مختلفی مثل میزان استفاده از دیتابیس، تعداد تراکنش‌ها و غیره رو از دیتابیس‌ها جمع‌آوری کنه.در کل، Prometheus یه ابزار مانیتورینگ قدرتمند و انعطاف‌پذیره که میتونه بهت کمک کنه سیستمت رو به‌طور موثر مانیتور کنی.Static Code Analysis (such as SonarQube)تحلیل کد ایستا (Static Code Analysis) یه روشه که بدون اجرای کد، مشکلات احتمالی رو توی کد شناسایی میکنه. این مشکلات میتونه شامل باگ‌ها، آسیب‌پذیری‌ها، و مشکلات امنیتی باشه.آم . SonarQube یکی از ابزارهای تحلیل کد ایستاست که از محبوبیت زیادی برخورداره. این ابزار میتونه کد رو به زبان‌های مختلف، از جمله جاوا، سی++، سی#، و جاوا اسکریپت، بررسی کنه.نحوه کار تحلیل کد ایستا به این صورته که:ابزار تحلیل کد ایستا، کد رو به صورت متنی بررسی میکنه.ابزار از قوانین و الگوریتم‌های خاصی برای شناسایی مشکلات استفاده میکنه.ابزار مشکلات رو به صورت گزارشی ارائه میده.گزارش تحلیل کد ایستا میتونه شامل موارد زیر باشه:باگ‌های منطقیآسیب‌پذیری‌های امنیتیمشکلات عملکردیمشکلات خوانایی کدتحلیل کد ایستا میتونه مزایای زیادی داشته باشه، از جمله:کاهش هزینه‌های توسعه نرم‌افزارافزایش کیفیت نرم‌افزاربهبود امنیت نرم‌افزاردر حالت عامیانه، تحلیل کد ایستا مثل اینه که شما یه ساختمان رو قبل از ساختش از نظر استحکام و ایمنی بررسی کنید. اگر مشکلی توی ساختمان باشه، میتونید قبل از اینکه هزینه‌های زیادی بکنید، مشکل رو برطرف کنید.آم . SonarQube مثل یه مهندس ناظره که به شما کمک میکنه تا کیفیت ساختمان رو بررسی کنید. این ابزار میتونه مشکلات احتمالی رو به شما هشدار بده تا بتونید قبل از اینکه مشکل بزرگی پیش بیاد، اون رو برطرف کنید.تحلیل کد ایستا یه ابزار ارزشمند برای توسعه‌دهندگان نرم‌افزاره. این ابزار میتونه به شما کمک کنه تا نرم‌افزاری با کیفیت و ایمن تولید کنید.آم . بالاخره تموم شد . حدود 6 هفته به طول انجامید . این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است.