مبانی معماری نرم افزار - بخش دوم

در بخش اول، با مفاهیم کلی در حوزه architectural از قبیل quality attribute ،pattern ،style ،tactic و غیره آشنایی پیدا کردیم و در این بخش به جزئیات بیشتری می پردازیم.در مورد Quality Attributeها سه طبقه کلی را در نظر می گیریم. OperationalStructuralCross-Cuttingدر مورد Operational، دسته ای از quality attributeهایی هستند که در run-time و محیط های عملیاتی، نمود پیدا می کنند. برای مثال performance, availability, reliability, resiliency و هر آن چیزی که عمدتا مربوط به رفتار سیستم می باشد. quality attributeهای operational، عمدتا دارای اندازه گیری راحتی هستند. در مورد Structural، دسته ای از quality attributeهایی هستند که موضوع آن ها ساختاری و در سطح design یک نرم افزار است. برای مثال maintainability, evolvability, testability. در مورد Cross-Cutting، دسته ای از quality attributeهایی هستند که جاهای مختلفی از سیستم را درگیر می کنند. مانند security, learnability.بسته به context مساله، ماهیت quality attributeها در دو دسته Implicit و Explicit قرار می گیرند. برای مثال در فضای یک وبسایت presentation، مفهوم security به عنوان یک quality attribute در دسته implicit قرار می گیرد. اما در یک سیستم mission critical، از آنجایی که security به عنوان یک دغدغه است و در conversationهای مختلف در مورد آن صحبت می شود، بنابراین آن را در دسته explicit قرار می دهیم.در حوزه quality attributeها باید این جمله را در نظر بگیریم.Least wrong combination of trade-offs.بطور کلی، quality attributeها بطور مثبت و منفی بر روی هم تاثیر گذار هستند. برای مثال در رابطه security و availability، اگر security خوبی داشته باشیم availability بالایی نیز خواهیم داشت و برعکس. همچنین security ممکن است در performance نیز تاثیرگذار باشد. اگر قصد بالا بردن امنیت را داشته باشیم، ممکن است در performance تاثیر منفی داشته باشد. بنابراین trade-offها را باید از quality attributeها بدست آوریم که کمترین هزینه را در قبال بیشترین آورده داشته باشند.Availabilityیکی از quality attributeهای operational می باشد که به موضوع Fault و Failure می پردازد. fault یک خطا است که اتفاق می افتد و ممکن است internal یا external باشد. failure شکستی است که در اثر یک fault رخ می دهد. بنابراین failure به خاطر fault اتفاق می افتد و زمانی که fault دیده شود، به این معنی است که تبدیل به failure شده است.هر fault الزاما تبدیل به failure نمی شود. ما جلوی fault را می توانیم بگیریم اما جلوی failure را ممکن است که نتوانیم بگیریم.مجموعه راه حل هایی وجود دارند که برای جلوگیری و یا تحمل fault مورد استفاده قرار می گیرند.اولین کاری که می توان برای جلوگیری از fault انجام داد، Prevented کردن است. اقدام بعدی در مقابل fault، روشی برای Tolerated یا تحمل کردن آن است. برای مثال Idempotency، روشی برای تحمل fault است.راه حل بعدی Removed است. به این معنی که عامل fault در مساله را حذف کنیم. برای مثال server دارای اختلال را از مدار خارج می کنیم. و راه حل بعدی Forecast یا پیش بینی است. برای مثال زیر بار رفتن سیستم را می توانیم پیش بینی کنیم.در مورد fault، اولین و مهم ترین موضوع، مساله شناسایی آن ها می باشد. منظور از شناسایی این است که بدانیم چه نوع faultهایی ممکن است در سیستم اتفاق بیافتند. برای مثال، دیتابیس می تواند down شود یا network می تواند قطع شود. موضوعات بعدی، شناسایی Risk و Frequency هستند.طبقه بندی faultها در سه دسته Minor, Major, Critical انجام می شود. minor یعنی اتفاق کوچکی که باعث اذیت می شود و نه مشکلی که باعث از کار افتادن سیستم شود. major یعنی اتفاقی که در رفتار سیستم اختلال ایجاد کند. و critical زمانی که تبدیل به failure شود باعث از کار افتادن سیستم می شود.Availability General Scenarioموضوع Source در availability شامل عوامل بیرونی و درونی است که می توانند باعث failure شوند. مانند انسان ها، زیرساخت، شبکه و غیره که بعضی از آن ها نیز از کنترل ما خارج هستند.موضوع Stimulus یا محرک در availability همیشه fault است. یعنی چیزی که availability را تحت تاثیر قرار می دهد. موضوع Artifact در availability ممکن است تمام اجزای operational سیستم باشد. برای مثال زمانی که storage, processor, communication channel و غیره دارای مشکل باشند می توانند availability را تحت تاثیر قرار دهند.در مطالعه availability، به Environmentهایی باید توجه داشته باشیم که مساله availability در آن ها متفاوت می باشد.Normal Operationزمانی که سیستم با شرایط نرمالی کار می کند. Overloaded زمانی که بار بیش از حد روی سیستم می باشد.Special Occasionsزمان های خاص رفتاری سیستم است. مثل startup, shutdown, recover و غیره.Degraded Operationیک operation که سطح آن پایین تر آمده است. بخشی از کار را انجام می دهد یا آن را ساده تر انجام می دهد. اولین Tactic که در مورد availability به ذهن افراد می رسد مساله Redundancy است. ایده کلی آن، وجود نسخه مشابه برای جایگزین کردن instanceها در لحظه خارج شدن از دسترس است. ممکن است در سطح ها Database, Web Server, Application Server و غیره دیده شود.در ادامه به Reposenseهای availability می پردازیم.Prevent fault to become a failureیک رویکرد کلی این است که از تبدیل شدن fault به failure جلوگیری کنیم. به عبارتی مشکلاتی که ایجاد می شوند، تبدیل به خطا نشوند.Detecting the failureبا وجود تمام تلاشی که می شود، ممکن است failure در سیستم اتفاق بیافتد و باید دنبال این موضوع باشیم که چکار کنیم تا failure بر روی availability تاثیر کمتری داشته باشد. بنابراین رویکرد بعدی شناسایی failure است.در مورد Detection، مجموعه ای از تکنیک هایی هستند که به مساله شناسایی کردن می پردازند و ممکن است آن ها را در محیط های عملیاتی دیده باشیم. مثل Heartbeat, Monitoring, Ping.مجموعه تکنیک های دیگری به نام Condition Monitoring وجود دارند. مساله Assumptions زمانی که ما در مساله اِلمان هایی داریم که ممکن است به عنوان طراح هزینه آن را پرداخت نکرده باشیم. برای مثال پیش بینی حداکثر تعداد کاربر یا مقدار resource. مساله Edge-Cases در مواردی خاص که برای مثال ممکن است دو کاربر به طور همزمان بر روی یک داده تغییری ایجاد کنند.تکنیک های Tests, Checks, Validations نیز در detection وجود دارد که برای availability مورد استفاده قرار می گیرد و یک بررسی کلی در مورد functionality سیستم انجام می دهند.Recover from a failureوقتی در مورد Resiliency صحبت می کنیم، یعنی در صورت اتفاق افتادن failure، سیستم مجدد به مدار بر می گردد و شروع به کار می کند.