<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های هانیه محمدی ارزنق</title>
        <link>https://virgool.io/feed/@hanieMA</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-19 01:49:54</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/10692/avatar/2ok4f8.jpeg?height=120&amp;width=120</url>
            <title>هانیه محمدی ارزنق</title>
            <link>https://virgool.io/@hanieMA</link>
        </image>

                    <item>
                <title>معماری نرم افزار در سیستم‌های پردازش کلان داده(Big Data)</title>
                <link>https://virgool.io/@hanieMA/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%AF%D8%B1-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%87%D8%A7%DB%8C-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%DA%A9%D9%84%D8%A7%D9%86-%D8%AF%D8%A7%D8%AF%D9%87big-data-sikt0yndcqlm</link>
                <description>چکیدهامروزه سیستم‌های پردازش کلان داده در صنعت‌های متنوعی و برای تامین مقاصد مختلفی استفاده می‌شود. هر یک از این سیستم‌ها با وجودی که مقاصد مختلفی را دنبال می‌کنند به دلیل سر و کار داشتنن با کلان داده‌ها دارای بخش‌های مشترکی در معماری نرم‌افزارشان هستند.در این مقاله ابتدا به بررسی این‌که مفهوم کلان داده چیست و چه نیازی به تحلیل کلان داده‌ها هست پرداخته‌ایم.سپس ضرورت وجود معماری برای سیستم‌های پردازش کلان داده از این دید که هر کدام از این سیستم‌ها داتا یک نرم‌افزار هستند بررسی کردیم.در بخش بعدی با توجه اشتراکاتی که این سیستم‌ها در معماری‌شان با یکدیگر دارند ، به بررسی ویژگی‌های کیفی که تمامی این معماری‌ها به دنبال تامین آن‌ها هستند، پرداختیم. در ادامه به بررسی معماری ۷ قسمتی که برای تمامی سیستم‌های پردازش کلان داده وجود دارند و هر کدام با توجه به نیازمندی‌هایشان می‌توانند شامل بخش‌هایی از این معماری باشند پرداختیم.در بخش بعدی به بررسی ویژگی‌ها و تفاوت‌های معماری‌های معروف حوزه‌‌ی سیستم‌های پردازش کلان داده  شامل Lambda و  Kappa پرداختیم و مزیت‌ها و ضعف‌های هریک را بررسی کردیم.در انتها با بررسی معماری Netflix که یکی ازمعماری‌های برتر در حوزه‌ی سیستم‌های پردازش کلان داده است، نتایج این تحقیق را بیان کردیم.کلید واژه‌ها:Big Data,Big Data Architecture,Big Data Analytics,Quality Attribute,Big Data Tools۱- مقدمهکلان داده به حجم عظیمی از داده‌ها اطلاق می شود که با ابزارهایی سنتی موجود در صنعت نرم‌افزار قابل ذخیره سازی، پردازش یا تحلیل نیست. امروزه میلیون‌ها منبع داده وجود دارند که با نرخ سرعت بسیار بالا در حال تولید داده هستند.این منابع داده در سراسر جهان توزیع شده‌اند.بعضی از بزرگترین منابع تولید داده را می‌توان شبکه‌های اجتماعی، حسگر‌ها، تلفن های هوشمند، رایانه ها، سیستم های موقعیت یاب جهانی، معاملات تجاری، بازی ها، شبکه‌ها، فایل‌های لاگ، اپلیکیشن‌های تراکنشی و وب دانست. علاوه بر این داده‌ها در قالب‌های مختلفی تولید می شوند:۱- داده‌های ساختارمند (Structured Data):‌ این داده‌ها همان داده‌های ذخیره شده در پایگاه داده‌های رابطه‌ای (ٍRDBMS) هستند.۲- داده های نیمه ساختارمند (Semi-Structured Data): داده های نیمه ساختار مند می‌توانند به شکل ساختارمند دیده شوند اما نمی توان آن ها را به صورت یک جدول رابطه ای در پایگاه داده در نظر بگیریم. مانند ایمیل، فایل‌های XML و …۳- داده های بدون ساختار (Unstructured Data): هر داده ای با فرمت و ساختار ناشناخته، به عنوان داده‌هایی بدون ساختار طبقه بندی می‌شود. نمونه بارز داده‌های بدون ساختار، یک منبع داده ی ناهمگون است که شامل ترکیبی از تصاویر، ویدئوها و غیره است.این حجم عظیم داده‌های خام به خودی خود ارزشی ایجاد نمی‌کنند. در دنیای امروز ذخیره سازی کارآمد کلان داده و تجزیه و تحلیل  موثر آن، یک عامل کلیدی برای موفقیت در بسیاری از حوزه‌های کسب و کار است. به طور معمول در طی فرآیند تحلیل داده‌ها، بینش‌های معناداری از داده‌های جمع آوری شده استخراج می‌شود؛این بینش‌ها می‌توانند الگو‌های مخفی، ارتباطات ناشناخته، ترند‌های مارکت و ترجیحات مشتریان باشد.تحلیل کلان داده‌ها مزیت‌های فراوانی دارد؛برای مثال می‌تواند برای کمک به روند تصمیم گیری، پیشگیری از اقدامات کلاهبردارانه و … استفاده شود.صنایع و کسب و کارها می توانند در حوزه‌های زیر از مزیت‌های تحلیل کلان داده‌ها استفاده کنند. این حوزه ها عبارتند از:۱- مدیریت ریسک: Banco de Oro یک شرکت فیلیپینی در حوزه‌ی بانکی است.این شرکت از تحلیل کلان داده‌ها برای تشخیص فعالیت‌های کلاهبردارانه و ایجاد لیستی محدود از مظنونین یا دلایل اصلی ایجاد مشکلات استفاده می‌کند.۲-توسعه‌ی‌محصولات و نوآوری‌ها: رولز رویس یکی از بزرگترین تولید کنندگان موتور‌های جت و تجهیزات نظامی در جهان، از تحلیل کلان‌داده‌ها برای بررسی میزان کارایی طراحی موتورها و نیاز آن ها به بهبود استفاده می‌کند.۳-تصمیم گیری سریع‌تر و بهتر درون سازمانی :استارباکس از تحلیل کلان‌داده‌ها برای تصمیم‌های استراتژیک درون سازمانی‌اش استفاده می‌کند.به عنوان مثال برای تصمیم گیری درباره‌ی این‌که آیا مکانی که در نظر دارد برای شعبه‌ی جدید مناسب است یا خیر.آن‌ها برای این تصمیم گیری، فاکتور‌های مختلفی مانند جمعیت، جمعیت شناسی، دسترسی مکان و … را تحلیل می‌کنند.۴-بهبود تجربه‌ی کاربر:Delta Air Lines از تحلیل کلان‌داده‌ها برای بهبود تجربه‌ی  مشتریانش استفاده می‌کند.آن‌ها توییت‌ها را بازبینی می‌کنند تا از تجربه‌ی سفر مشتریانشان، تاخیر‌ها و … مطلع شوند. هواپیمایی‌ آن‌ها توییت‌‌های منفی را مشخص می‌کنند و پس از آن پیگیری‌های لازم را جهت رفع مشکلات مطرح شده انجام می‌دهند. مطرح کردن مشکلات به شکل عمومی و راه‌حل‌های پیشنهادی به این هواپیمایی کمک می‌کند تا رابطه‌ی خوبی با مشتریانش داشته باشد.با توجه به موارد مطرح شده لزوم وجود ساختاری برای معماری سیستم های پردازش کلان داده مشخص می شود.در این مقاله ابتدا به اهمیت معماری نرم افزار در سیستم های پردازش کلان داده، ویژگی های کیفی مورد نیاز در سیستم های پردازش کلان داده ها، بررسی مولفه های مشترک در ساختار معماری کلان داده ها و معرفی معماری های مطرح در این حوزه می پردازیم.۲-اهمیت معماری نرم‌افزار در سیستم‌های پردازش کلان دادهاغلب سیستم‌های پردازش کلان داده از بخش‌های مختلفی مانند استخراج اطلاعات(Data Extraction)، پیش پردازش(Pre Processing)، پردازش(Processing)، دریافت و ادغام(Ingestion &amp; Integration)، تجزیه و تحلیل داده(Data Analysis) و اجزای مربوط به گزارش‌گیری و مصورسازی(Visualization) تشکیل شده‌اند.سیستم‌های پردازش کلان‌داده‌ها با توجه به کاربرد‌های خاصی که دارند، نیازمندی‌های متفاوتی نیز دارند؛ برای مثال ممکن است یک سیستم پردازش کلان داده به عنوان پلتفرمی برای گوش دادن موسیقی(Spotify) و یا به عنوان شبکه‌ی اجتماعی(twitter)به کار رود. با توجه به این موضوع،معماری‌های نرم افزار گوناگونی برای این سیستم‌ها نیاز است.هر یک از سیستم‌های پردازش داده کلان یک نرم‌افزار در حوزه‌ی کامپیوتر محسوب می‌شوند؛بنابراین تمام ویژگی‌های ذاتی نرم افزار و دغدغه‌های مربوط به آن در این سیستم‌ها نیز وجود دارند.۲-۱- دلایل اهمیت معماری نرم‌افزار در این سیستم‌هابرخی از دلایل اهمیت معماری نرم افزار در سیستم های پردازش کلان داده عبارتند از:۱- تعیین کننده‌ی ویژگی‌ها کیفی سیستم به صورت کمی با توجه به نیازمندی‌هااین که سامانه‌ی پردازش کلان‌داده‌ی مورد نظربا توجه به محدودیت‌های تجاری حوزه‌ی تعریفش ، کارکرد‌های مورد نظر ذی‌نفعان و نیازمندی‌ها مطرح شده، باید چه ویژگی‌های کیفی داشته باشد و میزان اهمیت کمی هرکدام، توسط معماری نرم افزارتعیین می شود.۲- بررسی دلایل ایجاد تغییر در سیستم و مدیریت تغییرهابا توجه به ذات تغییر پذیر نرم‌افزار و با توجه به آمار می ‌توان گفت که ۸۰ درصد هزینه‌های نرم افزارمربوط به پس از استقرار اولیه‌ی نرم‌افزار است چرا که باگ‌های موجود در آن شناسایی می‌شود و نیازمندی های کاربران تغییر می کند.بنابراین در سیستم‌ها پردازش کلان‌داده‌ها که سیستم های بسیار بزرگی محسوب می‌شوند،این تغییرات با نرخ سرعت خیلی بیشتری به دست توسعه دهندگان می‌رسد، به همین دلیل این سیستم‌ها نیازمند معماری نرم‌افزار دقیقی هستند که این تغییرات را مدیریت کند تا تیم توسعه تغییرات مورد نیاز را ایجاد کند و نظم و دیسیپلین تیم‌ها در ارائه‌ی تغییرات ایجاد شده حفظ شود و رضایت مندی مشتریان افزایش پیدا کند.مثلا وجود CI/CD ،تعیین تست کیس‌ها ، نوع معماری که در کل سامانه به کار می‌رود (به طور معمول مایکروسرویس) … تعیین کننده ی  نحوه‌ی مدیریت تغییرات است.۳-برقراری ارتباط بهتر میان ذینفعانتمامی ذینفعان سیستم‌های پردازش کلان داده افراد فنی نیستند و دانش فنی کافی برای درک تمامی موضوعات مرتبط با توسعه ندارند.برای ارتباط مناسب میان تمامی ذینفعان با هر سطحی از دانش،وجود معماری یک الزام است چرا که زبان مشترک میان ذینفعان است وبنابراین افراد به خوبی می‌توانند درباره‌ی آینده‌ی سیستم پردازش کلان داده با توجه به معماری مطرح شده تصمیم گیری کنند.۴-تصمیماتی که خیلی زود باید درباره‌ی نرم افزار گرفته شوند.هنگامی که تصمیم به ساخت یک سیستم پردازش کلان داده گرفته می‌شود، تصمیماتی وجود دارند که باید پیش از شروع توسعه‌ی سیستم گرفته شوند تا سیستم برمبنای آن‌ها ساخته شود؛ هریک از این تصمیمات باعث ایجاد محدودیت‌هایی در ادامه‌ی کار می‌شود، بنابراین تصمیمات مهمی برای آینده‌ی سیستم هستند. برای مثال وابستگی سامانه به یک سیستم عامل، سخت افزارو یا نرم افزار خاص و تعیین زبان برنامه نویسی مورد نظر برای پیاده سازی سیستم وابسته به یک می تواند از جمله ی این تصمیمات مهم باشد.۵-تعریف محدودیت‌های پیاده سازیعناصر موجود در سیستم باید طبق روشی از پیش تعیین شده با یکدیگر تعامل داشته باشند. بنابرای محدودیت‌هایی برای توسعه‌دهنده در پیاده سازی ایجاد می‌شود تا روش‌های مورد نظر معماری  پیاده شوند.علاوه برموارد گفته شده معماری نرم‌افزار از ابعاد دیگری نیز برای نرم‌افزار‌ها حائز اهمیت است.نرم‌افزار هرچه بزرگتر باشد نیاز آن به معماری بسیار بیشتر می‌شود چرا که با بزرگ شدن نرم‌افزار دغدغه‌های کیفی جدی‌تر و پیچیده‌تری مطرح می‌شوند که باید مدیریت شوند و درصورتی که معماری جدی گرفته نشود هزینه‌های هنگفتی به وجود می‌آید که احتمالا قابل جبران نیستند و می‌توانند منجر به شکست کامل پروژه ی نرم‌افزاری شوند.۳- ویژگی‌های کیفی کلی برای سیستم‌های پردازش کلان داده فارغ از حوزه‌ی تجاری آن‌هابا بررسی سیستم‌های پردازش داده‌ی کلان به طور کلی با چند ویژگی کیفی مشترک رو به رو می‌شویم که معماری تمامی این سیستم‌ها به دنبال تامین آن‌ها هستند:Scalabilityاین ویژگی کیفی به این معناست که سیستم‌های پردازش کلان داده باید قابلیت پشتیبانی از مجموعه‌های بزرگی از داده را چه الان و چه در آینده داشته باشند؛همچنین تمام مولفه های این سیستم‌ها با افزایش پیچیدگی داده‌ها باید گسترش پیدا کنند.مقیاس پذیری در واقع به توانایی حفظ کیفیت سرویس‌ها توسط سیستم‌های پردازش کلان‌داده وقتی که کاربران وحجم داده‌هاس دریافتی افزایش می یابد، اشاره دارد.برای  داشتن یک جریان مداوم از کلان داده‌، سیستم‌های پردازش،سیستم‌های ذخیره‌سازی و…سیستم‌های پردازش کلان داده باید داده‌ها را به نحوی مقیاس پذیر مدیریت کنند.Performanceاین ویژگی به کارایی سیستم پردازش کلان داده می‌پردازد مانند زمان پاسخ.کارایی در واقع توانایی سیستم‌های پردازش کلان داده برای فراهم کردن به موقع سرویس‌هااست به خصوص در سه زمینه‌ی میانگین زمان پاسخ، تعداد تراکنش‌ها در هر واحد زمانی و توانایی حفظ پردازش‌ با نرخ سرعت بالا.به خاطر حجم بالای داده‌ها، کارایی یک موضوع کلیدی در سیستم‌های پردازش کلان داده‌ها است.دلیل اصلی تمرکز بر کارایی در این سیستم‌ها را می‌توان مدیریت کردن حجم عظیمی از داده با میزان محدودی از منابع دانست. اگر بخواهیم دقیق‌تر باشیم، کارایی پردازش در سیستم‌های پردازش کلان داده با وجود حجم عظیمی از داده را می‌توان نقطه‌ی موفقیت این سیستم ها در نظر گرفت.Availabilityاین ویژگی میزان در دسترس بودن سیستم پردازش کلان داده  را در صورتی که خطایی رخ دهد بررسی می‌کند.دسترس پذیری به معنای توانایی سیستم‌های پردازش کلان داده برای اجرای یک Function تحت شرایط مشخصی است.رشد سریع داده‌ها، دسترس پذیری را به یک ویژگی کیفی واجب برای سیستم‌های پردازش کلان داده مبدل کرده است چرا که باید جریان و حجم تاثیر گذاری از داده ها با تنوع بالا را مدیریت کنند؛بنابراین پردازش این عملیات ممکن است مشکلات فراوانی را به وجود بیاورد.Reliabilityاین ویژگی میزان دوام سیستم‌های پردازش کلان داده را زمانی که Functionality موردنظر در یک بازه‌ی زمانی خاص و تحت شرایط خاصی اجرا می‌شود، اندازه می‌گیرد.قابلیت اطمینان در واقع به توانایی سیستم‌های پردازش کلان داده برای اعمال Function های مشخص شده در شرایط مشخص شده و در مدت زمان مشخص شده اشاره دارد. مشکلات قابلیت اطمینان معمولا به خاطراستثناهای غیرمنتظره در طراحی و نقص‌های موجود در کد که شناسایی نشده‌اند؛ ایجاد می‌شوند.Correctnessاین ویژگی کیفی برای اندازه‌گیری میزان صحت سیستم‌های پردازش کلان داده استفاده می‌شود.صحت، این احتمال را می سنجد که برنامه های کلان داده می توانند کارها را درست انجام دهند. در صورتی که سیستم پردازش کلان داده نتواند صحت را ضمانت کند، در آن صورت این سیستم فاقد ارزش است.برای مثال یک سیستم پیش‌بینی هوا که همیشه وضعیت آب و هوا را به اشتباه نشان می‌دهد قطعا به هیچ دردی نمی‌خورد. بنابراین می‌توان گفت صحت اولین ویژگی کیفی است که باید در سیستم‌های پردازش کلان داده در نظر گرفته شود.در صورتی که سیستم پردازش کلان داده به شکل نادرستی کار کنند، می‌توانند باعث ناراحتی و یا حتی از دست رفتن کاربران شود.۴- مولفه‌های مشترک میان معماری‌های سیستم‌های پردازش کلان داده‌هاتمامی معماری‌های موجود برای نرم‌افزار‌های پردازش داده حجیم با توجه به نیاز‌هایی که برای آن طراحی شده‌اند می‌توانند شامل بخش‌های زیر باشند:۱- منابع داده:تمامی راه‌حل‌‌های مرتبط با کلان داده شامل یک یا چندین منبع داده هستند؛مانند:منابع داده‌ی برنامه‌های کاربردی مثل پایگاه داده‌های رابطه‌ای،فایل‌های استاتیک که توسط برنامه‌های کاربردی تولید می‌شوند مثل فایل‌های لاگ و منابع داده بلادرنگ مثل دستگاه‌های IOT۲- ذخیره سازی داده:داده‌ها برای عملیات پردازش دسته‌ای  در یک مخزن فایل توزیع شده که حجم بالایی از داده‌ها با هر فرمتی را می‌تواند ذخیره کند،ذخیره می‌شوند.۳- پردازش دسته ای:از آنجایی که مجموعه‌ ی داده‌ها حجیم هستند،هر راه‌حلی که برای کلان داده‌ها وجود دارد بخشی را برای پردازش فایل‌های داده با استفاده از کار‌های دسته‌ای طولانی مدت (long-running batch jobs) درنظر می‌گیرند تا داده‌ها فیلتر،تجمیع و در نهایت برای تحلیل آماده شوند.معمولا این کار‌های دسته‌ای شامل خواندن فایل های منبع،پردازش آن ها و نوشتن خروجی در فایل‌های جدید است.۴- دریافت پیام بلادرنگ: درصورتی که منابع بلادرنگ دریافت داده داشته باشیم در این صورت معماری باید راهی برای دریافت و ذخیره‌ی پیام‌های بلادرنگ جهت پردازش جریانی(Stream Processing) داشته باشد.ممکن است ازیک مخرن داده‌ی ساده استفاده کنیم تا پیام‌های ورودی برای پردازش درون یک فولدر گذاشته شوند.البته ناگفته نماند که بسیاری از معماری‌ها به یک مخزن دریافت پیام احتیاج دارند تا بتوانند از آن به عنوان بافر استفاده کنند.۵- ذخیره سازی داده‌های تحلیلی: بسیاری از معماری‌ها،داده‌ ها را برای تحلیل آماده می‌کنند و داده‌های پردازش شده را در یک فرمت ساختار‌مند ارائه می‌کنند تا ابزار‌های تحلیل بتوانند برای query از آن‌ها استفاده کنند.۶- تحلیل و گزارش: هدف اکثر نرم‌افزار‌های کلان داده ایجاد کردن یک بینش از طریق تحلیل و گزارش داده‌های دریافتی است.برای این‌که کاربر توانایی تحلیل داده‌ها را داشته باشد،معماری می‌تواند شامل یک لایه‌ی مدلسازی داده مانند مکعب چند بعدی OLAP باشد.۷- همنواسازی:مدیریت اعمال تکراری در پردازش‌ و جریان‌های کاری موجود و همنواسازی کانتینر‌های موجود در سیستم پردازش کلان داده.معماری کلی موجود برای سیستم‌های پردازش کلان داده۵- معماری‌های مشهور این حوزه۵-۱- لامبداتولید انبوه داده ها در دنیای امروز و نیاز به پایش لحظه ای اطلاعات و ذخیره ی آن ها برای انجام تحلیل های بعدی، ما را به ساختاری هدایت می کند که بتواند  این نیازمندی ها یعنی پردازش جریان های داده به صورت لحظه ای و بدون تاخیر و پردازش های انبوه و زمان مند را پاسخگو باشد. البته پردازش کاملا بلادرنگ و بدون تاخیر در سامانه های توزیع شده ی امروزی غیر قابل دستیابی است و هدف بیشتر این است که با کمترین تاخیر ممکن و نه لزوما بدون هیچ تاخیری به پردازش داده ها و استخراج اطلاعات مورد نیاز بپردازیم. در واقع یکی از مهمترین چالش هایی که کسب و کارهای داده  محور با آن دست و پنجه نرم می کنند، عدم داشتن استراتژی صحیح به منظور پیاده سازی معماری فضای مدیریت داده در سازمان های مقیاس وسیع تلقی می شود. معماری لامبدا با همین پیش زمینه توسط Nathan Marz از متخصصین داده شرکت توییتر پیشنهاد شده است.معماری Lambda از سه لایه مختلف تشکیل شده است:لایه ی پردازش انبوه یا Batchلایه ی سرعت بخشی یا Speedلایه ی سرویس دهی یا Servingلایه ی Batch:‌ این لایه وظیفه ی مدیریت مجموعه داده اصلی را بر عهده دارد. داده ها در مجموعه ی داده ی اصلی خام و تغییر ناپذیر هستند. حتی اگر تمام مجموعه داده های لایه ی speed و serving از دست برود، می توانیم داده ها را از این مجموعه داده ی اصلی که در این لایه است، بازیابی کنیم. همچنین در این لایه مجموعه ی داده ها به شکل batch view نگهداری می شوند تا با سرعت بیشتری بتوان به پرس و جوها پاسخ داد.همچنین از آنجایی که مجموعه ی داده ها دائما در حال رشد است، ما باید یک استراتژی برای مدیریت نماهای دسته ای (batch view) در هنگام اضافه شدن داده های جدید به سیستم داشته باشیم. این کار به دو صورت انجام می شود:‌۱- الگوریتم های محاسبه مجدد (Re-Computation algorithms):‌ حذف batch view های قدیمی و محاسبه ی مجدد توابع در کل مجموعه داده اصلی۲- الگوریتم های افزایشی (Incremental algorithms):‌به روز رسانی مستقیم view ها هنگام ورود داده های جدیدبه طور کلی  می توان گفت در این لایه بسته به نیاز کاربر به صورت موردی و یا در زمان های مشخص اقدام به پردازش انبوه داده های ذخیره شده می شود و نتایج مورد نیاز کاربر تولید می شود. تکنولوژی هایی مثل Hadoop و Hive در این لایه مورد استفاده قرار می گیرند که قابلیت مقیاس پذیری افقی را نیز دارد مثل استخراج آمار روزانه خرید یک دوره آموزشیلایه ی Speed: این لایه batch view ها را برای کوئری  های موقت و سریع، ایندکس گذاری می کند. Real time view ها را ذخیره می کند و جریان داده های دریافتی را پردازش می کند تا این نماها را به روز کند. از آنجایی که تاخیری بین زمان ورود داده های جدید به سیستم و زمان لازم برای اینکه ممکن باشد روی آن ها کوئری بزنیم، وجود دارد (به دلیل زمان لازم برای ایجاد batch view از داده های جدید) این موضوع به لایه ی speed بستگی دارد که این gap را کوتاه کند. این لایه با داده های real time در ارتباط است و سربار محاسباتی کمتری دارد.به طور کلی این لایه مجموعه پردازش های مبتنی بر یادگیری ماشین یا تحلیل های لحظه ای را پشتیبانی می کند. مثال:‌ محاسبه ی آمار لحظه ای یک وب سایت، پیشنهاد در لحظه یک محتوای مرتبط با پست آموزشی به کاربر بر اساس سوابق مطالعاتی اولایه ی Service: این لایه  دسترسی به نتایج محاسبات انجام شده روی داده های اصلی را با تاخیر کم فراهم می کند. این لایه می تواند دیتاها را به منظور برطرف کردن اشکالات کد نویسی reindex کند. یا برای use case های مختلف، ایندکس های مختلف ایجاد کند. نیاز کلیدی در این لایه این است که پردازش به شکل گسترده ای موازی انجام شود تا زمان لازم برای ایندکس گذاری در مجموعه داده به حداقل برسد. همچنین این لایه با دو لایه ی قبلی در ارتباط است. ارتباط با ابزارهای هوش تجاری مانند Power BI در این لایه صورت می گیرد. داده هایی که در دو لایه Batch و Speed قبلا ذخیره شده اند، توسط سرویس هایی که در این لایه ایجاد می شوند، در اختیار کاربران مختلف که هرکدام قالب و شکل خاصی از داده ها و گزارشات را نیاز دارند قرار می گیرد.معماری Lambda۵-۱-۱- مزایا و معایب معماری لامبدامزایای استفاده از این معماری به شرح زیر است:۱- تحمل خطا (Fault Tolerance): این معماری قابلیت تحمل خطای انسانی را فراهم می کند زیرا در صورت مرتکب شدن اشتباه، می توانیم الگوریتم ها را دوباره اجرا کرده و view ها را اصلاح کنیم.۲- کوئری های ad hoc:‌ لایه ی batch امکان پرس و جوهای ad hoc را فراهم می کند.۳- مقیاس پذیری:‌ همه ی لایه های batch، speed و service  به راحتی مقیاس پذیر هستند.۴- توسعه پذیری:‌ افزودن view های جدید به مجموعه داده ها آسان است.۵- سازگاری داده ها:‌ یکی از ویژگی های اصلی معماری لامبدا این است که ریسک ناهماهنگی داده ها که در اغلب سیستم های توزیع شده وجود دارد را از بین می برد. در یک پایگاه داده توزیع شده احتمال خرابی داده ها و وجود دیتای ناسازگار وجود دارد. در واقع ممکن است یک کپی از داده ها به روز شده باشد اما کپی دیگر مقدار قبلی را داشته باشد. در معماری لامبدا از انجایی که داده ها به صورت متوالی پردازش می شوند، در فرایند indexing می توان مطمئن بود که آخرین وضعیت داده ها از لایه های batch و speed دریافت شده است.همچنین استفاده از این معماری در سازمان منجر به چابکی کسب وکار به دلیل پاسخ در لحظه نسبت به سناریوهای سازمان می شود.از چالش های این معماری می توان به موارد زیر اشاره کرد:۱- به دلیل وجود لایه های مختلف و نیاز به مدیریت این لایه ها پیچیدگی داریم که همین موضوع خطایابی را دشوار می کند.۲- نگهداری و پشتیبانی این معماری به دلیل وجود لایه های متمایز و توزیع شده ی batch و speed سخت تر است.۳- استفاده از این معماری برای فناوری های متن باز می تواند دشوار باشد و اگر بخواهد در فضای ابری پیاده سازی شود، مشکل بیشتر می شود.۵-۲- کاپاچالش‌های معماری لامبدا باعث شد تا معماری دیگری به نام کاپا مطرح شود که در آن لایه‌ی Batch عملا حذف می‌شود. در این معماری برای ساده‌ترشدن مدیریت سامانه و عدم نیاز به دو بخش جداگانه پردازشی، تمام پردازش‌ها در لایه‌ی سریع انجام می‌گیرد و هر کاری که قرار است روی داده‌ی ورودی انجام شود، به صورت لحظه‌ای و بلادرنگ صورت خواهد پذیرفت.اگر در آینده و به خاطر تغییر در منطق سازمانی و قوانین، نیاز به پردازش جدیدی روی داده‌ها باشد، این کار به صورت جداگانه و موردی انجام خواهد شد. در این معماری داده‌ها در یک گذرگاه پیام‌رسانی (messaging bus) مانند کافکا ذخیره می شوند. یک موتور پردازش جریانی (stream processing engine) مانند Apache Spark، Apache Flink و غیره داده‌ها را از سیستم messaging می‌خواند و پردازش‌های لازم مانند transformation را روی آن‌ها انجام می‌دهد و سپس آن‌ها را به سیستم پیام‌رسانی منتشرمی‌کند و برای تجزیه و تحلیل بلادرنگ (real time) در دسترس قرار می‌دهد.معماری کاپا بر چهار اصل استوار است:۱- هرچیزی، یک جریان است:‌ با این اصل پردازش انبوه هم جزئی از سامانه‌ی پردازش جریان قرار می گیرد با این تفاوت که داده‌های غیر لحظه‌ای جریان‌های موردی تولید خواهند کرد که نیاز به پردازش دارد.۲- تمام داده‌ها به صورت پایدار ذخیره می‌شوند:‌ این اصل تضمین می‌کند که داده‌ای از دست نمی‌رود و می‌توان در صورت نیاز، تمام محاسبات را از ابتدا روی داده‌ها انجام داد.۳- تنها یک چارچوب برای پردازش مورد نیاز است:‌ با توجه به اصل ساده سازی امور (Keep it Simple, Stupid)، در این معماری تنها یک سامانه‌ی پردازشی خواهیم داشت که مدیریت و توسعه‌ی آن بسیار ساده‌تر است.۴- تکرار پذیری عملیات پردازش داده:‌ محاسبات و نتایج می توانند با ورود داده‌های جدید و ترکیب آن‌ها با داده‌های قبلی به روز شود.بنابراین این معماری بیشتر برای کاربرد‌هایی مناسب است که منطق سازمانی حاکم بر آن‌ها کاملا مشخص و بدون تغییر است. مثلا برای بررسی و پردازش خطا‌های نرم افزار، پایش شبکه‌های اجتماعی و همچنین پایش وضعیت سرو‌ها می‌توان از این معماری استفاده کرد چون غالب تصمیمات باید در لحظه گرفته شود و آمار مورد نیاز هم در همان حین دریافت اطلاعات قابل استخراج و ذخیره سازی است. در واقع این معماری محدودیت بیشتری دارد و شکل خلاصه شده‌ی معماری لامبدا است.معماری Kappa۵-۲-۱ مزایا و معایب معماری کاپااین معماری چند مزیت دارد که عبارتند از :۱- با استفاده از یک معماری واحد می توانیم هم پردازش جریانی (streaming) و هم دسته ای(batch) انجام دهیم.۲- با تضمین درستی ترتیب داده‌ها کیفیت داده‌ها را بهبود می‌بخشد.۳- برای موارد کاربرد جدید نیاز به معماری جدید نخواهیم داشت.۴- برای انجام پردازش‌های machine learning در این معماری نیاز به منابع کمتری داریم.یکی از معایب این معماری این است که ممکن است در هنگام پردازش داده یا به روز‌رسانی پایگاه داده به دلیل عدم وجود لایه‌ی batch خطا رخ دهد.۵-۲-۲ موارد کاربرد معماری کاپا۱- گزارش دهی و داشبورد بلادرنگ (real time reporting and dashboarding):‌ این نیاز عمدتا در تولید و به عنوان مثال صنعت نفت و گاز مشاهده می‌شود که در آن نیاز  به روز رسانی وضعیت دستگاه‌های خط مونتاژ برای گزارش دهی بلادرنگ وجود دارد.۲- پردازش قوانین و هشدار دهی بلادرنگ (real time rules processing and alerting):‌ کاربرد این مورد در تجارت الکترونیک و مخابرات دیده می‌شود. در واقع در جاهایی که نیاز به اجرای قوانین پیچیده ی پردازش رویداد‌ها در جریان‌های داده‌های سامانه های خرید آنلاین وجود دارد.۳- عملیاتی کردن مدل‌های بلادرنگ یادگیری ماشین:‌ این امر در صنعت خدمات مالی استفاده می‌شود که در آن مدل‌های ML برای شناسایی تقلب بر روی داده‌های تراکنش و شناسایی تراکنش‌های تقلبی و هشدار به مشتری به کار گرفته می‌شوند.۶-  بررسی معماری نتفلیکسنتفلیکس سال‌هاست که یکی از بهترین سرویس‌های پخش ویدئو مبتنی بر اشتراک آنلاین در جهان است و بیش از ۱۵ درصد از ظرفیت پهنای باند جهان را به خود اختصاص داده است. طبق آمارهای ارائه شده در سال ۲۰۱۹ نتفلیکس بیش از ۱۶۷ میلیون مشترک داشته‌است که در هر سه ماهه پنج میلیون مشترک جدید نیز اضافه می شده است. مشترکین نتفلیکس بیش از ۱۶۵ میلیون ساعت را صرف تماشای فیلم در روز می‌کنند. این آمار چشمگیر به ما نشان می‌دهد که که تیم‌های فنی نتفلیکس چنین سیستم پخش ویدئویی شگفت انگیزی را با availabilty و scalability بالا طراحی کرده‌اند تا به مشتریان خود در سطح جهانی خدمات ارائه کنند.معماری نتفلیکس به شرح زیر است:​​نتفلیکس از AWS cloud برای نگه داری زیر ساخت‌های فناوی اطلاعات خود استفاده می‌کند. نتفلیکس با استفاده از این فضای ابری، مقیاس پذیری و در دسترس بودن خود را به طور قابل توجهی افزایش داده است. همچنین این شرکت برای پیاده سازی سیستم خود از الگوی Microservice بهره می‌برد که این مساله باعث شده هر سرویسی قابل تغییر، استقرار سریع و ردیابی راحت‌تر مشکلات باشد.۶-۱- بخش‌های مختلف معماری نتفلیکساز نظر معماری، نتفلیکس شامل سه بخش اصلی Client،Backend و Content Delivery Network است.Client هر مرورگر پشتیبانی شده در لپ تاپ، گوشی هوشمند یا اپلیکیشن نتفلیکس در تلویزیون‌های هوشمند است. اپلیکیشن مربوط به کلاینت دو نوع ارتباط با backend برقرار می کند. یک ارتباط مربوط به کشف محتوا و دیگری مربوط به موارد مربوط به امنیت است. همچنین در حین پخش ویدئ‌ها اپلیکیشن مربوط به کلاینت به طور هوشمند کیفیت را کاهش می‌دهد یا در صورت لزوم به سرو‌های دیگری سوییچ می‌کند.Backend شامل سرویس‌های داده، پایگاه داده و … است. Backend از بخش‌هایی مانند فضا‌ی ذخیره‌سازی مقیاس پذیر (AWS S3)، میکروسرویس‌های مربوط به منطق کسب و کار (Business logic)، پایگاه داده‌های توزیع شده‌ی مقیاس پذیر( مانند AWS DynamoDB و Cassandra)، ابزار‌ها و تکنولوژی‌های مربوط به پردازش و تحلیل کلان داده‌ها (مانند AWS EMR Spark، Flink، Kafka، Hadoop و سایر ابزارهای ساخته شده توسط خود نتفلیکس برای این هدف) و پردازش و رمز گذاری ویدئوها اشاره کرد.به طور خاص‌تر به بررسی مولفه های موجود در بکند می پردازیم:۱- API Gateway Service:‌ یکی از سرویس‌هایی که در backend وجود دارد، API Gateway است. این مولفه با AWS Load Balancer برای پاسخگویی به تمام درخواست‌های کاربران ارتباط برقرار می‌کند.۲- Application API:‌ این مولفه نقش یک لایه همنواساز (orchestration) را برای میکروسرویس‌های Netfliix ایفا می کند. Application API با عملکردهای اصلی کسب و کار Netflix در ارتباط است و باید مقیاس پذیر باشد و در حجم درخواست بسیار بالا در دسترس باشد. در حال حاضر، APIهای برنامه به سه دسته تقسیم می شود: Signup API برای درخواست‌های مانند ثبت نام و تست رایگان و غیره، Discovery API برای جستجو و Play API برای پخش.۳- میکرو سرویس:‌ هر میکرو سرویس در این سامانه می تواند data store مخصوص به خود را داشته باشد و نتایج حاصل از اجرا را در کش ذخیره کند. EVCache یک انتخاب اصلی برای کش کردن نتایج میکرو سرویس‌ها در نتفلیکس است.۴-  Data Stores: اگر بخواهیم به طور خاص‌تر در مورد ذخیره‌سازی دیتا در نتفلیکس صحبت کنیم، نتفلیکس از هر دو نوع SQL و NoSQL برای اهداف مختلف استفاده کرده است. از MySQL برای ذخیره‌ی عناوین فیلم‌ها و همچنین صورتحساب تراکنش‌های مالی، از Hadoop برای پردازش کلان داده‌ها، از Elastic Search برای جستجو‌ی عناوین فیلم‌ها و از Cassandra که یک پایگاه داده‌ی توزیع شده‌ی NoSQL است، برای پاسخگویی به حجم زیاد درخواست ها استفاده می شود.۵- Stream Processing Pipeline:‌ این pipeline بخش اصلی این سیستم برای تجزیه و تحلیل کسب و کار را تشکیل می دهد. مسئولیت تولید، جمع آوری، پردازش، تجمیع و انتقال همه‌ی رویدادهای میکروسرویس‌ها را به پردازشگر‌های داده در زمانی نزدیک به real time بر عهده دارد. پلتفرم Stream processing روزانه تریلیون‌ها رویداد و چندین پتابایت داده را پردازش می‌کند. علاوه بر این با افزایش تعداد کاربران، این پلتفرم به طور خودکار scale می شود.در این سیستم از Open Connect به عنوان CDN استفاده شده است که مسئول ذخیره و ارائه ی فیلم ها به مشترکان خود در سراسر جهان است. نتفلیکس Open Connect را به طور کارامدی با نزدیک کردن محتوایی که مردم می خواهند تماشا کنند به جایی که میخواهند تماشا کنند، ساخته و عملیاتی کرده است.۷- نتیجه‌گیریامروزه سیستم‌های پردازش کلان داده بخش قابل توجهی از صنعت نرم‌افزار را تشکیل می‌دهند. این سیستم‌ها سود قابل توجهی را می‌توانند برای ذی‌نفعانشان تولید کنند؛اما این سود به راحتی به دست نمی‌آید.نرم‌افزارخود  ذاتا موجودیتی پیچیده است که مدیریت آن نیازمند دانش قابل توجهی است حال که با گذشت زمان ،این صنعت روز به روز بیشتر به سمت سیستم‌های پردازش کلان داده می‌رود اهمیت معماری نیز برای تولید نرم‌افزاری با کارایی بالا که رضایتمندی مشتریان را به همراه داشته باشد، به شکل روز افزونی بیشتر می‌شود.در این مقاله دلایل اهمیت معماری را به طور کلی بررسی کردیم و معماری‌های مشهوری که در این حوزه برای تامین ویژگی‌های کیفی مورد نیاز وجود دارند، بررسی کردیم و در نهایت معماری  به کار رفته در نتفلیکس را به عنوان یکی از معماری‌های برتر حوزه‌ی سیستم‌های پردازش کلان داده شرح دادیم.«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»تهیه و تدوین این مطلب با همکاری دوست عزیز خانم زیبا امیدوار انجام شده است .مراجع[1] I. Samizadeh, &quot;A brief introduction to two data processing architectures - Lambda and Kappa for Big Data&quot;, Towards Data Science, 2020. [Online]. Available: https://towardsdatascience.com/a-brief-introduction-to-two-data-processing-architectures-lambda-and-kappa-for-big-data-4f35c28005bbd. [Accessed: 20- Dec- 2021]. (1)[2] C. Nguyen, &quot;A Design Analysis of Cloud-based Microservices Architecture at Netflix&quot;, Medium, 2020. [Online]. Available: https://medium.com/swlh/a-design-analysis-of-cloud-based-microservices-architecture-at-netflix-98836b2da45f. [Accessed: 25- Dec- 2021]. (2)[3] D. Vaz, &quot;When and How to Leverage Lambda Architecture in Big Data - Cuelogic Technologies Pvt. Ltd.&quot;, Cuelogic Technologies Pvt. Ltd., 2020. [Online]. Available: https://www.cuelogic.com/blog/lambda-architecture-in-big-data. [Accessed: 11- Jan- 2022]. (3)[4] V. BELUR, &quot;Kappa Architecture – Easy Adoption with Informatica End-to-End Streaming Data Management Solution&quot;, Informatica, 2020. [Online]. Available: https://www.informatica.com/blogs/adopt-a-kappa-architecture-for-streaming-and-ingesting-data.html. [Accessed: 20- Dec- 2021]. (4)[5] Feick M, Kleer N, Kohn M. Fundamentals of real-time data processing architectures lambda and kappa. SKILL 2018-Studierendenkonferenz Informatik. 2018. (5)[6] Avci C, Tekinerdogan B, Athanasiadis IN. Software architectures for big data: a systematic literature review. Big Data Analytics. 2020. (6)[7] Ji S, Li Q, Cao W, Zhang P, Muccini H. Quality Assurance Technologies of Big Data Applications: A Systematic Literature Review. Applied Sciences. 2020. (7)[8] Zhang P, Zhou X, Li W, Gao J, editors. A survey on quality assurance techniques for big data applications. 2017 IEEE Third International Conference on Big Data Computing Service and Applications (BigDataService); 2017. (8)[9] Folberth, J., Buck, A., Harvey, B. and Price, E., 2021. Big data architectures - Azure Architecture Center. [online] Docs.microsoft.com. Available at: https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/&amp;amp;lt;br/&amp;amp;gt;[Accessed 30 December 2021].[10]E. Price, A. Buck, D. Kshirsagar and T. Petersen, &quot;Batch processing - Azure Architecture Center&quot;, Docs.microsoft.com, 2021. [Online]. Available at: https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/batch-processing. [Accessed: 30- Dec- 2021].[11]&quot;What is Big Data Analytics and Why It is Important?&quot;, https://www.simplilearn.com/, 2022. [Online]. Available: https://www.simplilearn.com/what-is-big-data-analytics-article. [Accessed: 08- Jan- 2022].[12]L. Bass, P. Clements and R. Kazman, Software Architecture in Practice, 4th ed. 2021.</description>
                <category>هانیه محمدی ارزنق</category>
                <author>هانیه محمدی ارزنق</author>
                <pubDate>Mon, 07 Feb 2022 13:30:00 +0330</pubDate>
            </item>
                    <item>
                <title>احراز هویت یکپارچه(SSO) به عنوان بخشی از مدیریت هویت و دسترسی(IAM)</title>
                <link>https://virgool.io/@hanieMA/%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87%D9%88%DB%8C%D8%AA-%DB%8C%DA%A9%D9%BE%D8%A7%D8%B1%DA%86%D9%87sso-%D8%A8%D9%87-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%D8%A8%D8%AE%D8%B4%DB%8C-%D8%A7%D8%B2-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D9%87%D9%88%DB%8C%D8%AA-%D9%88-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8Ciam-dup2waxlij8z</link>
                <description>مقدمههمه‌ی ما عضوی از جامعه‌ی کاربران اینترنت هستیم و روزانه از اپلیکیشن‌ها و سایت‌های مختلفی استفاده می‌کنیم.اکثر این سایت‌ها برای این‌که خدمات مورد نظرمان را به ما ارائه دهند نیاز دارند تا ما را احراز هویت کنند.اگر به چند سال پیش برگردیم احتمالا یادمان هست که به ازای هر سایت و اپلیکیشنی که می‌خواستیم از آن استفاده کنیم یک حساب کاربری مجزا با نام کاربری و رمز عبور باید برای خودمان ایجاد می‌کردیم و پیشنهاد تمامی این سایت‌ها و اپلیکیشن‌ها انتخاب یک رمز قوی به این که رمز عبورمان حداقال ۸ کاراکتر داشته باشد و از حروف بزرگ و کوچک انگلیسی به همراه اعداد و علائم تشکیل شده باشد.از یک جایی به بعد دیگر رمز‌هایی که برای حساب‌های کاربری مختلفمان گذاشته‌بودیم فراموش می‌شدند و مدیریت آن‌ها خیلی دشوار می‌شد و احتمالا بارها بر روی گزینه‌ی فراموشی رمز عبور کلیک می‌کردیم و رمز جدیدی می‌اشتمی که احتمالا ساده تر از رمز قبلی‌مان بود تا راحت تر بتوانیم آن را به یاد بیاوریم؛اما خوب زهی خیال باطل:) باز هم همین دور باطل را طی می‌کردیم تا رمز فراموش شده‌مان را تغییر دهیم.البته این مشکل فقط در سطح اینترنت و شبکه‌ی جهانی نبوده و نیست!خیلی از شرکت‌ها در شبکه‌ی داخلی خودشان نیاز به احراز هویت کارمندانشان دارند تا کارمندان بتوانند از سرویس‌های مختلف استفاده کنند و کار‌هایشان را انجام دهند.با روش گفته شده احتمالا کارمندان برای استفاده از هر سرویسی باید بار دیگر اطلاعات هویتی‌شان را وارد کنند!SSO چیست؟Single Sign-on (SSO) یک ابزار احراز هویت کاربر است که کاربران را قادر می سازد تا به طور ایمن به چندین برنامه و خدمات تنها با استفاده از یک حساب کاربری (نام کاربری و رمز عبور) دسترسی داشته باشند.همانطور که احتمالا در استفاده‌ی روزانه‌ی خودمان دیدیم،زمانی که وارد جیمیلمان می‌شویم دیگر نیازی به وارد کردن اطلاعاتمان برای سایر سرویس‌های گوگل از یوتیوب،گوگل درایو،گوگل داکز و... را نداریم.در واقع با یک بار ورود و احراز هویت در یکی از سرویس‌های گوگل دیگر نیازی به احراز هویت بریا سایر سرویس‌های گوگل را نداریم.این کار با استفاده از پروتکل دستیابی سبک و استفاده از سیستم ذخیره سازی در پایگاه داده ها روی سرورهای خاص انجام می‌شود. این فرایند در اینترنت با استفاده از ابزارهایی به نام کوکی انجام می‌شود.می‌توانیم خوشحال باشیم که با ورود SSO روز‌های طاقت فرسای به یادآوردن رمز عبور و بازیابی مدارم آن تمام شدند.تاریخچه‌ی SSOفن آوری SSO ریشه در ابزارهای هویت داخلی دارد که به سازمان ها کمک می کرد در اواسط تا اواخر دهه 1990 به طور ایمن رایانه ها، شبکه ها و سرورهای خود را به یکدیگر متصل کنند.در این زمان، سازمان‌ها شروع به مدیریت هویت کاربران خود از طریق سیستم‌های اختصاصی مانند Active Directory (AD) و Lightweight Directory Access Protocol (LDAP) کردند، سپس دسترسی امن را از طریق SSO یا ابزارهای مدیریت دسترسی وب (WAM) در محل انجام دادند.از آنجایی که IT با حرکت به سمت ابر، پراکندگی در چندین دستگاه و مواجهه با تهدیدات سایبری پیچیده‌تر به تکامل خود ادامه می‌دهد، این ابزارهای مدیریت هویت سنتی به سختی می‌توانند با پیشرفت‌های حاصل در حوزه‌ی IT خود را تطبیق دهند. تیم‌های IT اکنون به راه‌حلی نیاز دارند که دسترسی سریع و ایمن SSO به هر برنامه یا سرویسی را برای کاربران فراهم کند.SSOچگونه کار می‌کند؟SSO بر اساس مفهوم هویت فدرال(federated identity) ساخته شده است، که به معنی اشتراک گذاری ویژگی های هویتی در بین سیستم های قابل اعتماد اما مستقل است. هنگامی که یک کاربر توسط یک سیستم مورد اعتماد قرار می گیرد، به طور خودکار به سایر سیستم‌هایی که یک رابطه قابل اعتماد با سیستم اولیه برقرار کرده‌اند دسترسی پیدا می کند. این توضیح، اساس راه حل های مدرن SSO را فراهم می کند که از طریق پروتکل هایی مانند OpenID Connect و SAML 2.0 فعال می شوند.هنگامی که یک کاربر با استفاده از SSO به یک سرویس وارد می شود، یک توکن احراز هویت ایجاد شده و در مرورگر او یا در سرورهای راه حل SSO ذخیره می شود. هر برنامه یا وب‌سایتی که کاربر پس از این بخواهد به آن دسترسی پیدا کند، با سرویس SSO بررسی می شود یعنی سرویس SSO توکن کاربر را برای تأیید هویت او ارسال می‌کند و به کاربر دسترسی می‌دهد.SSO یک سرویس ارائه شده روی یک سرور است. این سرور مورد اعتماد سایر سرورها و سایت ها است و اگر شما به این سرور وارد شوید اطلاعات شما به‌صورت کاربر مورد اعتماد به سایت های مورد نیاز ارسال می‌شود. به این ترتیب دیگر نیازی نیست که در سایت های مختلف هر دفعه نام کاربری خود را وارد کنید.بنابراین اگر سرور SSO به دیگر برنامه و سرویس‌ها وابسته اعلام کند که کاربر وارد شده احراز هویت شده و مورد اعتماد است،برای استفاده از سرویس‌ها و برنامه‌های وابسته نیازی به وارد کردن نام کاربری و رمز عبور نیستتقریبا می‌توان گفت که مطرح‌ترین سرور‌های دنیا در زمینه‌ی SSO گوگل و فیسبوک هستند؛مثلا برای عضویت در همین ویرگول می‌توانیم بر روی گزینه‌ی ورود با اکانت گوگل بزنیم و عضو ویرگول شویم.فرآیند لاگین با استفاده از SSO معمولا دارای مراحل زیر است:۱) کاربر به برنامه یا وب‌سایتی که می‌خواهد به آن دسترسی داشته باشد، یا همان ارائه‌دهنده خدمت(Service Provider)، متصل می‌شود.۲) ارائه‌دهنده خدمت(Service Provider) توکنی را که حاوی اطلاعاتی درباره کاربر است، مانند آدرس ایمیل او و... را به عنوان بخشی از درخواست احراز هویت کاربر به سیستم SSO یا همان Identity Provider ارسال می‌کند.Identity Provider ابتدا بررسی می کند که آیا کاربر قبلاً احراز هویت شده است یا خیر، در این صورت به کاربر اجازه دسترسی به برنامه Service Provider را می دهد و به مرحله 5 می رود.۳) اگر کاربر وارد سیستم نشده باشد، Identity Provider از کاربر می‌خواهد تا با ارائه موارد اعتباری مورد نیاز وارد سیستم شود. این موارد اعتباری می تواند به سادگی یک نام کاربری و رمز عبور باشد یا ممکن است شامل نوعی دیگر از احراز هویت مانند یک رمز عبور یک بار مصرف (OTP) باشد.۴) هنگامی که Identity Provider اعتبار ارائه شده را تأیید کرد، توکنی را برای تأیید احراز هویت موفق به ارائه دهنده خدمت(Service Provider) ارسال می کند.۵) این توکن معمولا به شکل کوکی از طریق مرورگر کاربر به ارائه دهنده خدمت(Service Provider) ارسال می شود.۶) اعتبار سنجی توکنی که ارائه‌دهنده خدمت(Service Provider) دریافت می‌کند، بر اساس رابطه اعتمادی است که بین ارائه‌دهنده خدمت(Service Provider) و ارائه‌دهنده هویت(Identity Provider) در طول پیکربندی اولیه تنظیم شده است.۷) به کاربر اجازه دسترسی به ارائه دهنده خدمت(Service Provider) داده می شود.توکن SSO چیست؟توکن SSO مجموعه‌ای از داده‌ها یا اطلاعاتی است که در طی فرآیند SSO از یک سیستم به سیستم دیگر منتقل می‌شود.داده‌ها می توانند شامل آدرس ایمیل کاربر و اطلاعاتی در مورد سیستمی باشد که توکن را ارسال می‌کند.توکن‌ها باید به‌صورت دیجیتالی امضا شوند تا گیرنده توکن مطمئن شود که توکن از یک منبع قابل اعتماد می‌آید. گواهی‌ای که برای این امضای دیجیتال استفاده می شود در طی فرآیند پیکربندی اولیه مبادله می شود.باور‌های غلطی که درباره‌ی SSO وجود داشت۱)SSO باعث کاهش سرعت تیم IT می‌شود و بار کاری اضافه به آن‌ها تحمیل می‌کند:SSO در واقع به تیم‌های IT کمک می‌کند تا با افزایش اتوماسیون، ایجاد امنیت و دید بهتر و فعال کردن گردش‌های کاری بهتر، مؤثرتر باشند.۲) مستقر کردن SSO کار دشواری است:ابزارهای قدیمی ممکن است در زمان خود پیچیده بوده باشند، اما SSO سریع و ساده مستقر می‌شود. ابزارهای SSO امروزی دارای اتصالات از پیش ساخته شده برای هزاران برنامه محبوب هستند که باعث می‌شود تیم‌های IT مجبور به ساخت دستی این اتصالات نشوند. سازمان‌ها می‌توانند علاوه بر اتصال کاربر،آن‌ها را بدون نیاز به پیکربندی، نصب، یا پشتیبانی سخت‌افزار یا ایجاد تغییرات در فایروال خود، از دایرکتوری‌های موجود وارد کنند. SSO به راحتی قابل استقرار است، ورود کاربران و برنامه های جدید را متمرکز می کند، بسیار در دسترس است و هزینه ها را به حداقل می رساند و دسترسی ساده و در عین حال ایمن را تضمین می کند.۳) SSO یک نقطه شکست(Single Point of Faliure) ایجاد می کند، بنابراین امنیت کمتری دارد:می‌توان این طور فرض کرد که چون SSO فقط به یک رمز عبور احتیاج دارد احتمالا بستر مناسبی برای حملات سایبری خواهد بود؛اما واقعیت این است که این نقطه‌ی شکست همین الان هم وجود دارد و این نقطه‌ی شکست همان کاربر است.چرا که کاربر مجبور به مدیریت کردن تعداد زیادی از رمز‌های عبور است و اغلب این مدیریت با شکست رو به رو می‌شود و کاربر به شکل مداوم در حال بازیابی رمز‌های عبورش و احتمالا هر سری رمز‌های عبور ساده‌تری برای خودش انتخاب می‌کند تا یادآوری آن‌ها برایش راحت‌تر باشد!همین روند تکراری و تضعیف شدن رمز‌های عبور یک تهدید امنیتی جدی برای سازمان‌ها محسوب می‌شود.با حذف شدن نیاز به چندین رمز عبور و اعتبار سنجی،SSO این امکان را به تیم‌های IT می‌دهد که:۱) قوانینی برای رمز عبور داشته باشند که مطابق با پروتکل‌های امنیتی استاندار باشد،۲) برنامه‌ها،کاربران،دستگاه‌ها،مکان‌ها و شبکه را برای هر درخواست دسترسی مانیتور کنند.۴)SSO همان Password Manager است:Password Manager ها مانند یک گاو صندوق هستند که  رمز‌های عبور سایت‌ها و اپلیکیشن‌های مختلف کاربر را ذخیره  و یادآوری می‌کند.این گاو صندوق خودش دارای یک رمز اولیه است.با این حال، آنها بر محافظت از رمزهای عبور تمرکز می کنند، که بیش از ۸۰٪ از تمام موارد نقض امنیتی را تشکیل می دهد و به هکرها یک نقطه ورود بالقوه به یک سازمان یا هویت ارائه می دهد.در حالی که SSO دسترسی را از طریق اعتماد موجود میان ارتباطات  و ساختن یک دامنه که محل انجام احراز هویت است،کنترل می‌کند.معرفی ابزار‌های متن باز برای SSO۱) IdentityServer:یک SSO متن باز رایگان در اختیار شما قرار می‌دهد.یک فریم ورک کراس پلتفرم بر مبنای OpenID Connect و OAuth2 است.علاوه بر این، این نرم افزار متن باز قابلیت احراز هویت مرکزی و مجوز را برای چندین برنامه کاربردی فراهم می کند.از هویت های فدرال، جریان های متعدد و مجوز API پشتیبانی می کند. علاوه بر این، این نرم افزار این نرم‌افزار Self Hosting به کاربران اجازه می‌دهد تا با یک مجموعه از نام کاربری و رمز عبور از تعداد زیادی از برنامه‌های کاربردی استفاده کند.این نرم افزار به زبان C# نوشته شده و  تمام داکیومنت‌ها و سورس کدهایش در گیتهاب در دسترس است.از مزایای اصلی این برنامه می‌توان به موارد زیر اشاره کرد:Claim-based ProviderCross-PlatformUI CustomizationAccess Control for APISingle Sign-on /Sign-out۲) CAS:CAS یک نرم افزار متن باز SSO با احراز هویت واگذار شده است. علاوه بر این، چند زبانه است و با استفاده از پروتکل مبتنی بر ticket، خدمات مجوز مرکزی را ارائه می دهد. این نرم افزار رایگان بر اساس معماری Client-Server ساخته شده است. Central Authentication Service (CAS) از بسیاری از پروتکل ها مانند OpenID، OAuth، OpenID Connect، REST، WsFederation و SAML پشتیبانی می کند.از همه مهمتر، یک سیستم جامع برای ادغام با برنامه های third-party وجود دارد. این نرم افزار single sign-onبه زبان جاوا نوشته شده است.سورس کد آن با تمام اسناد مربوط به توسعه و استقرار در گیتهاب موجود است.از مزایای اصلی این برنامه می‌توان به موارد زیر اشاره کرد:MultilingualMultifactor authenticationMany Authorization Mechanisms (e.g. ABAC, Time/Date, REST )UI To Manage Monitoring And StatsPassword Managementشرکت‌های ارائه دهنده‌ی خدمات SSO در ایران۱) شرکت فناوران هویت الکترونیکی امن(هویتا):سامانه احراز هویت ParsSSO، سرویس ‌های احراز هویت و امضای دیجیتال مبتنی بر PKI را ارائه می ‌دهد.این سامانه از دو زیرسامانه Identity Provider و Digital Signature Gateway تشکیل شده است:زیرسامانه Identity Providerاین زیرسامانه که به اختصار IdP نامیده می ‌شود، مؤلفه‌‌ ارائه دهنده‌ خدمات AAA شامل احراز هویت، کنترل دسترسی و حسابرسی است. تمامی Service Provider ها می‌توانند با ثبت ‌نام در این زیرسامانه، خدمات AAA را به آن محول کنند. از ویژگی ‌های اصلی این زیرسامانه ارائه‌ خدمات به صورت Single Sign-On با ضریب امنیتی بالا است. همچنین این زیرسامانه از جانب Service Provider مسئولیت Policy Enforcement را بر عهده دارد.زیرسامانه Digital Signature Gatewayاین زیرسامانه که به اختصار DSG نامیده می ‌شود، مؤلفه‌‌ ارائه دهنده‌ درگاه امضای دیجیتال است. تمامی Service Provider ها می‌ توانند با ثبت ‌نام در این زیرسامانه، از درگاه امضای دیجیتال در سامانه احراز هویت متمرکز SSO به صورت امن استفاده کنند.ویژگی های سامانه احراز هویت متمرکز ParsSSOپشتیبانی از الگوریتم های HASH شامل MD5, SHA-1, SHA-2احراز هویت بر اساس چارچوب OAuth2.0 و به صورت Single Sign-Onپشتیبانی از انواع احراز هویت شامل نام کاربری و رمز عبور، توکن امضای دیجیتال سخت افزاری پارس کی، سرویس امضای همراه و OTPمدیریت یکپارچه کاربران، نقش ‌ها، سازمان ‌ها، فراهم کنندگان خدمت و نشست‌ هابرخورداری از پشتوانه حقوقی و قانونی، به دلیل قابلیت استفاده از گواهی الکترونیکی(استفاده از گواهی الکترونیکی معتبر، در محاکم قضایی از پشتوانه حقوقی و قانونی برخوردار است.)راه‌ اندازی سریع و آسان، زیرا تنها کافی است وب‌ سرویس‌ های موردنیاز توسط فراهم ‌کننده کاربرد فراخوانی شود و نیاز به هیچگونه عملیات پیاده‌ سازی زمان‌ بر و پیچیده‌ ای نیست.۲) پارسو:پارسو (Parsso) یک سامانه احراز هویت متمرکز و جامع جهت ارائه خدمات single sign-on (SSO) می‌باشد. این سامانه از تمامی پروتکل‌های رایج و استاندارد احراز هویت از جمله CAS، SAML، OAuth و OpenID و نیز از زبان‌های برنامه‌نویسی رایج پشتیبانی کرده و قابلیت اتصال به تمامی محصولات CMS را دارا می‌باشد. از برتری‌های این محصول می‌توان به پیاده‌سازی احراز هویت دو مرحله‌ای، احراز هویت مبتنی بر ویژگی‌های بیومتریک، احراز هویت با استفاده از توکن سخت‌افزاری و واسط کاربری ساده با پشتیبانی همزمان از زبان‌های فارسی و انگلیسی اشاره کرد. با این سامانه، مدیریت حساب‌های کاربری، سیاست‌های امنیتی رمزهای عبور، کنترل و پیگیری عملیات احراز هویت به صورت متمرکز فراهم می‌شود.این مطلب،بخشی از تمرین‌های درس معماری نرم‌افزار در دانشگاه شهید بهشتی است.
منابعhttps://www.okta.com/blog/2021/02/single-sign-on-sso/https://www.okta.com/identity-101/what-is-identity-management-and-access-control/https://www.onelogin.com/learn/how-single-sign-on-workshttps://itbaz.net/9989/what-is-sso/https://blog.containerize.com/2021/01/29/top-5-open-source-single-sign-on-software-in-the-year-2021/</description>
                <category>هانیه محمدی ارزنق</category>
                <author>هانیه محمدی ارزنق</author>
                <pubDate>Fri, 24 Dec 2021 22:20:19 +0330</pubDate>
            </item>
                    <item>
                <title>Container &amp; Container Orchestration in Software Development</title>
                <link>https://virgool.io/@hanieMA/container-container-orchestration-in-software-development-qig4mzfzo1ld</link>
                <description>کانتینر چیست؟با شنیدن اسم کانتینر احتمالا یاد کانتینر‌های حمل بار میفتیم!یعنی محفظه‌هایی که هر یک مجموعه کالاهای متفاوتی را حمل می‌کنند اما همگی از یک کشتی برای انتقال استفاده می‌کنند.اما کانتینر چه ربطی به توسعه‌ی نرم افزار دارد؟می‌توان گفت پیش از حضور و معرفی کانتینر‌ها در حوزه‌ی نرم‌افزار،دولوپر‌ها زندگی سختی داشتند!چرا؟دولوپر‌ها همیشه با این مشکل دست و پنجه نرم می‌کردند که نرم افزاری را بر روی سیستم خودشان کدنویسی،دیباگ،تست و اجرا می‌کردند و از صحت عملکر آن کاملا مطمئن می‌شدند ولی با انتقال نرم افزار به یک محیط یا پلتفرم دیگر مانند سرور جهت استقرار،با ارور‌ها و باگ‌های زیادی رو به رو می‌شدند و باید تمام کتابخانه‌ها و فریمورک‌ها و وابستگی‌های دیگر را دستی چک می‌کردند تا از یکسان بودن آن‌ها با محیط سیستم خودشان مطمئن شوند و باگ‌ها و ارور‌های مربوطه رفع شوند.اما پس از معرفی کانتینر، دولوپر‌ها دیگر نگرانی درباره‌ی Deploy کردن نرم افزار‌ها پس از اطمینان از صحت عملکردشان بر روی سیستم خودشان نداشتند.چرا؟کانتینر یک واحد استانداردسازی شده از نرم افزار است که بسته های کد و هر آن چه به آن نیاز دارد تا اپلیکیشن به سرعت و پایدار اجرا شود و از یک واحد پردازش به واحد دیگر منتقل گردد را در خود گنجانده است؛بنابراین هر یک از نرم افزار‌ها در کانتینر خود ایزوله می‌شوند.کانتینر این اطمینان را ایجاد می‌کند که نرم‌افزار روی هر پلتفرمی از جمله سیستم دولوپر، محیط تست و... که اجرا شود عملکرد کاملا درستی داشته باشد.چه دلیلی دارد که نرم‌افزار پس از حصول اطمینان از عملکردش هنگام دیپلوی در محیط‌های مختلف دچار مشکل شود؟فرض کنید دولوپر از ورژنی بالاتر از .NET  نسبت به .NET موجود بر روی سرور بریا کد زدن استفاده کرده‌ است و از عملکرد نرم‌افزار بر روی سیستم خودش اطمینان دارد،زمانی که این برنامه بدون استفاده از کانتینر بر روی سرور دیپلوی می‌شود، مسلما به مشکل می‌خورد.کانتینر درواقع یک محیط اجرای کامل است که نرم‌افزار به همراه تمامی وابستگی‌هایش مانند لایبرری‌ها، فریمورک‌ها، فایل‌های پیکره‌بندی و غیره را شامل می‌شود که در قالب یک پکیج ارائه می‌شود؛ بنابراین این توانایی را به دولوپر می‌دهد تا نرم‌افزار درون کانتینر را فارغ از محیط یا زیرساختی که می‌خواهد در آن اجرا شود،به راحتی بین محیط‌ها مختلف حرکت دهد و نرم‌افزار عملکرد کاملا درستی داشته باشد.کانتینر مانند یک حباب یا محیط محاسباتی است که دور نرم‌افزار را گرفته و آن را از محیط اطرافش جدا می‌کند.اساسا یک محیط کاملا کاربردی  و قابل حمل است.کانتینر‌ها یک جایگزین برای کد زدن بر روی یک پلتفرم یا سیستم عامل هستند که باعث سختی انتقال نرم‌افزار به محیط‌ها و پلتفرم‌های دیگر می‌شد چرا که با آن‌ها تطابق نداشتند؛در نتیجه باعث هدر رفت زمان زیادی می شد و بهره وری کاهش پیدا می‌کرد.با بسته‌بندی یک نرم‌افزار در یک کانتینر که می‌توان آن را در میان پلتفرم‌ها و زیرساخت‌ها جابه‌جا کرد، آن نرم‌افزار را می‌توانیم در هر کجا که آن را جابه‌جا کنیم مورد استفاده قرار دهیم زیرا همه چیزهایی را که برای اجرای موفقیت‌آمیز در آن محیط نیاز دارد، دارد.جالب است بدانیم ایده جداسازی فرآیند‌ها برای مدت طولانی وجود داشت، اما زمانی که Docker موتور Docker را در سال 2013 معرفی کرد، استانداردی را برای استفاده از کانتینر با ابزارهایی که استفاده از آن‌ها برای دولوپر‌ها آسان بود معرفی کرد همچنین یک رویکرد جهانی برای بسته‌بندی(Packaging) تعیین کرد که باعث تسریع پذیرش و استفاده از کانتینر‌ها شد.امروزه دولوپر‌ها می‌توانند با توجه به نیازمندی‌هایشان از میان پلتفرم‌های Cotainerization و ابزار‌هایی که از استانداردهای تعیین شده توسط داکر یعنی Open Container Initiative بهره می‌برند،استفاده کنند.کانتینرها اغلب به عنوان &quot;سبک وزن&quot; شناخته می شوند، به این معنی که هسته سیستم عامل(Kernel) دستگاه را به اشتراک می گذارند و نیازی به هزینه سربار نصب یک سیستم عامل به ازای هر برنامه ندارند؛ بنابراین کانتینرها از نظر ظرفیت به فضای کمتری نسبت به یک ماشین مجازی نیاز دارند(ماشین‌های مجازی فضایی از اوردر گیگابایت نیاز دارند واین در حالیست که نیاز کانتینر‌ها در حد مگابایت است) علاوه بر این به زمان راه اندازی کمتری نیاز دارند. در مقایسه با تعداد ماشین‌های مجازی که می‌توانند همزمان با هم بر روی منابع سخت افزاری موجود اجرا شوند،کانتینر‌ها به دلیل کم حجم بودن از همان میزان منابع با بهره وری بالاتری استفاده می‌کنند و تعداد بیشتری کانتینر به صورت همزمان می‌توانند بر روی سرور اجرا شوند. این کار باعث افزایش راندمان سرور می شود و به نوبه خود هزینه های سرور و مجوز را کاهش می دهد.ایزوله بودن کانتینر‌های مختلف از یکدیگر احتمال اینکه کد مخرب موجود در یک کانتینر روی کانتینرهای دیگر تأثیر بگذارد یا به سیستم میزبان حمله کند را کاهش می‌دهد.بنابراین می توان متوجه شد که چرا شرکت ها به سرعت از کانتینرسازی به عنوان یک رویکرد برتر برای توسعه و مدیریت برنامه استفاده می کنند. Containerization به دولوپر‌ها این امکان را می دهد که برنامه ها را سریعتر و ایمن تر ایجاد و استقرار دهند، خواه برنامه یکپارچه سنتی(traditional monolith) (یک برنامه نرم افزاری تک لایه) باشد یا یک میکروسرویس ماژولار (مجموعه ای از خدمات با اتصال آزاد(loosely coupled)). نرم افزار‌های جدید مبتنی بر ابر را می‌توان از ابتدا به‌عنوان میکروسرویس‌های کانتینری ساخت و یک برنامه پیچیده را به مجموعه‌ای از خدمات تخصصی و قابل مدیریت کوچک‌تر تقسیم کرد. برنامه های موجود را می توان در کانتینر‌ها(یا میکروسرویس های کانتینری) که از منابع  به شکل کارآمدتری استفاده می کنند، دوباره بسته بندی کرد.مزایای کانتینر با جزئیات بیشترContainerization مزایای قابل توجهی را برای توسعه دهندگان و تیم های توسعه ارائه می دهد. از جمله‌ی آن‌ها می‌توان به موارد زیر اشاره کرد:قابلیت حمل(Portability):یک کانتینر یک بسته اجرایی از نرم‌افزار ایجاد می‌کند که جدا از سیستم عامل میزبان انتزاع شده (به آن وابسته نیست)، و از این رو، قابل حمل است و می‌تواند در هر پلتفرم یا ابری عملکرد کاملا درستی داشته‌باشد.چابکی(Agility): Docker Engine متن باز برای اجرای کانتینرها، یک استاندارد صنعتی را برای کانتینرها با استفاده از ابزارهای توسعه دهنده ساده و یک رویکرد بسته بندی جهانی که در لینوکس و ویندوز کار می کند،شروع کرد. اکوسیستم کانتینر‌ها به موتورهای مدیریت شده توسط Open Container Initiative (OCI) منتقل شده است. توسعه دهندگان نرم افزار می توانند به استفاده از ابزارها و فرآیندهای چابک یا DevOps برای توسعه و بهبود سریع برنامه ادامه دهند.سرعت(Speed):کانتینرها اغلب به عنوان &quot;سبک وزن&quot; شناخته می شوند، به این معنی که هسته سیستم عامل (OS) دستگاه را به اشتراک می گذارند و با این هزینه اضافی که برای هر نرم‌افزار یک سیستم عامل جداگانه بالا بیاورند، گرفتار نمی شوند. این نه تنها بازده سرور را افزایش می دهد، بلکه هزینه های سرور و مجوز را کاهش می دهد و در عین حال سرعت شروع کار را افزایش می دهد زیرا سیستم عاملی برای راه اندازی وجود ندارد.ایزوله سازی اشتباه(Fault Isolation):هر برنامه کانتینری ایزوله شده است و مستقل از دیگران عمل می کند. خرابی یک کانتینر بر ادامه کار سایر کانتینرها تأثیر نمی گذارد. تیم‌های توسعه می‌توانند هرگونه مشکل فنی را در یک کانتینر بدون هیچ‌گونه خرابی در کانتینرهای دیگر شناسایی و تصحیح کنند. همچنین، موتور کانتینر می‌تواند از هر تکنیک جداسازی امنیتی سیستم‌عامل (مانند کنترل دسترسی SELinux) برای جداسازی خطاهای درون کانتینرها استفاده کند.بهره‌وری(Efficiency):نرم‌افزاری که در محیط‌های کانتینری اجرا می‌شود، هسته سیستم‌عامل دستگاه را به اشتراک می‌گذارد، و لایه‌های برنامه درون یک کانتینر را می‌توان در کانتینرها به اشتراک گذاشت. بنابراین، کانتینرها نیاز به ظرفیت کمتری نسبت به یک ماشین مجازی دارند علاوه بر این  به زمان راه اندازی کمتری نیاز دارند، بنابراین به کانتینرهای بسیار بیشتری اجازه می دهد با همان ظرفیت منابع یک ماشین مجازی کار کنند. این باعث افزایش کارایی سرور، کاهش هزینه های سرور و صدور مجوز می شود.سهولت مدیریت(Ease of management):پلتفرم Container Orchestration، نصب، مقیاس‌بندی و مدیریت بارهای کاری و خدمات کانتینری را خودکار می‌کند. پلتفرم‌های Container Orchestration می‌توانند وظایف مدیریتی مانند مقیاس‌بندی برنامه‌های کانتینری، عرضه نسخه‌های جدید برنامه‌ها، و ارائه نظارت، ثبت و اشکال‌زدایی، از جمله عملکردهای دیگر را آسان‌تر کنند. Kubernetes، شاید محبوب‌ترین سیستم هماهنگ‌سازی کانتینر موجود باشد، یک فناوری متن باز (در ابتدا توسط Google به صورت متن باز و بر اساس پروژه داخلی آنها به نام Borg) است که عملکردهای کانتینر لینوکس را در اصل خودکار می‌کند. Kubernetes با بسیاری از موتورهای کانتینر مانند Docker کار می کند، اما همچنین با هر سیستم کانتینری که با استانداردهای Open Container Initiative (OCI) برای فرمت های تصویر کانتینر و زمان اجرا مطابقت دارد، کار می کند.امنیت(Security):جداسازی برنامه‌ها با استفاده از کانتینر، از نفوذ کدهای مخرب و تاثیر گذاری آن بر سایر کانتینرها یا سیستم میزبان جلوگیری می‌کند. علاوه بر این، مجوزهای امنیتی را می توان برای مسدود کردن خودکار ورود کامپوننت‌های ناخواسته به کانتینرها  و یا محدود کردن ارتباطات با منابع غیر ضروری تعریف کرد.هماهنگ کننده کانتینر(Container Orchestration) چیست؟استقرار و مدیریت دستی کانتینر‌ها در تعداد کم آسان است اما در اکثر سازمان‌ها تعداد برنامه‌هایی که از کانتینر استفاده می‌کنند به سرعت در حال رشد است؛بنابراین مدیریت آن‌ها در مقیاس به ویژه به عنوان بخشی از CI/CD و خط لوله‌ی DevOps بدون اتوماسیون امکان پذیر نیست.هماهنگ کننده کانتینر تهیه، استقرار، شبکه سازی، مقیاس بندی، در دسترس بودن و مدیریت چرخه حیات کانتینرها را خودکار می کند. امروزه، Kubernetes محبوب‌ترین پلت‌فرم هماهنگ‌سازی کانتینر است و اکثر ارائه‌دهندگان پیشرو ابر عمومی - از جمله خدمات وب آمازون (AWS)، پلتفرم Google Cloud، IBM Cloud و Microsoft Azure - خدمات مدیریت‌شده Kubernetes را ارائه می‌کنند. از دیگر ابزارهای هماهنگ کننده کانتینر می توان به Docker Swarm و Apache Mesos اشاره کرد.هماهنگ کننده کانتینر چگونه کار می‌کند؟در حالی که تفاوت‌هایی در روش‌ها و قابلیت‌ها بین ابزارها وجود دارد، ارکستراسیون کانتینر اساساً یک فرآیند (یا چرخه، زمانی که بخشی از خط لوله چابک تکراری یا DevOps باشد) سه مرحله‌ای است.اکثر ابزارهای هماهنگ کننده کانتینر از یک مدل پیکربندی اعلامی پشتیبانی می کنند: توسعه دهنده یک فایل پیکربندی می نویسد (بسته به ابزار، بهYAML یا JSON) که وضعیت پیکربندی دلخواه را تعریف می کند و ابزار هماهنگ کننده کانتینر فایل را اجرا می کند از هوش درونی خود برای رسیدن به آن حالت استفاده می کند. فایل پیکربندی معمولامشخص می کند که کدام تصاویر کانتینر(Container Images) برنامه را تشکیل می دهند و در کجا قرار دارند (در چه رجیستری).کانتینر‌ها را با فضای ذخیره‌سازی و سایر منابع تامین می کند.اتصالات شبکه بین کانتینرها را تعریف و ایمن می کند.نسخه بندی را مشخص می کند (برای انتشار مرحله ای(pahse) یا قناری(canary))ابزار هماهنگ کننده، استقرار کانتینرها (و کپی از کانتینرها، برای انعطاف پذیری) را بر روی یک میزبان برنامه ریزی می کند و بهترین میزبان را بر اساس ظرفیت CPU موجود، حافظه، یا سایر الزامات یا محدودیت های مشخص شده در فایل پیکربندی انتخاب می کند.هنگامی که کانتینرها مستقر شدند، ابزار هماهنگ کننده چرخه حیات برنامه کانتینری را بر اساس فایل تعریف کانتینر (اغلب یک Dockerfile) مدیریت می کند که شامل:مدیریت مقیاس پذیری (بالا و پایین)، متعادل کردن بار، و تخصیص منابع در بین کانتینرها.اطمینان از در دسترس بودن و عملکرد با جابجایی کانتینرها به میزبان دیگری در صورت قطع یا کمبود منابع سیستمجمع آوری و ذخیره داده های log و سایر معیار‌های مورد استفاده برای نظارت بر سلامت و عملکرد برنامه.مزایای هماهنگ کننده کانتینراحتمالاً واضح است که مزیت اصلی هماهنگ کننده کانتینر، اتوماسیون است - نه تنها به این دلیل که تلاش و پیچیدگی مدیریت یک برنامه کاربردی بزرگ را کاهش می‌دهد بلکه با خودکار کردن عملیات، هماهنگ کننده از یک رویکرد چابک یا DevOps پشتیبانی می‌کند که به تیم‌ها اجازه می‌دهد در چرخه‌های سریع و تکراری، توسعه یافته و مستقر شوند و ویژگی‌ها و قابلیت‌های جدید را سریع‌تر منتشر کنند.علاوه بر این، هوشمندی ابزار هماهنگ کننده می تواند بسیاری از مزایای ذاتی کانتینرسازی را افزایش داده یا گسترش دهد. به عنوان مثال، انتخاب میزبان خودکار و تخصیص منابع بر اساس پیکربندی اعلامی، استفاده کارآمد از منابع  را به حداکثر می‌رساند. نظارت بر سلامت خودکار و جابجایی کانتینرها، در دسترس بودن را به حداکثر می رساند.معرفی چند ابزار‌ متن باز در این حوزهداکر(Docker):ابزاری برای containerization است که به صورت متن باز ارائه می‌شود و در واقع معرفی این ابزار و دستور العمل‌هایش بود که انقلاب در استفاده از کانتینر‌ها به وجود آورد.داکر یک پلت فرم باز برای توسعه، جا‌به‌جایی و اجرای برنامه ها است. داکر شما را قادر می سازد تا برنامه های کاربردی خود را از زیرساخت خود جدا کنید تا بتوانید نرم افزار را به سرعت تحویل دهید. با داکر، می توانید زیرساخت خود را به همان روشی که برنامه های خود را مدیریت می کنید، مدیریت کنید. با استفاده از روش‌های داکر برای ارسال، آزمایش و استقرار سریع کد، می‌توانید تأخیر بین نوشتن کد و اجرای آن را به میزان قابل توجهی کاهش دهید.داکر توانایی بسته بندی و اجرای یک برنامه کاربردی را در یک محیط کاملاً ایزوله به نام کانتینر فراهم می کند. ایزوله بودن و امنیت به شما این امکان را می دهد تا چندین کانتینر را به طور همزمان روی یک میزبان مشخص اجرا کنید. کانتینرها سبک وزن هستند و شامل همه‌ی چیز‌های مورد نیاز برای اجرای برنامه هستند، بنابراین نیازی نیست به آنچه در حال حاضر روی هاست نصب شده است وابسته باشید. در حین کار می‌توانید به راحتی کانتینرها را به اشتراک بگذارید، و مطمئن باشید که همه کسانی که با آنها اشتراک‌گذاری می‌کنید، همان کانتینری را دریافت می‌کنند که به درستی کار می‌کند.کوبرنیتیز(Kubernetes):همانطور که در بالا ذکر شد، Kubernetes محبوب ترین پلت فرم هماهم کننده کانتینر است. همراه با ابزارهای دیگر در اکوسیستم کانتینری، Kubernetes یک شرکت را قادر می‌سازد تا یک پلتفرم به‌عنوان یک سرویس (PaaS) بسیار پربازده ارائه کند که به بسیاری از وظایف و مسائل مربوط به زیرساخت‌ها و عملیات مربوط به توسعه برنامه‌های کاربردی ابری می‌پردازد.بنابراین تیم های توسعه می توانند منحصراً بر روی کدنویسی و نوآوری تمرکز کنند.مزایای Kubernetes نسبت به سایر راه حل های ارکستراسیون، به دلیل نتیجه عملکرد جامع تر و پیچیده تر آن در چندین زمینه است، از جمله:استقرار کانتینر: Kubernetes تعداد مشخصی از کانتینرها را در یک میزبان مشخص مستقر می کند و آنها را در یک حالت دلخواه در حال اجرا نگه می دارد.انتشار: انتشار یک تغییر در استقرار است.Kubernetes به شما امکان می‌دهد که انتشار ها را شروع کنید، متوقف کنید، از سر بگیرید یا بازگردانید.کشف خدمات(Service Discovery):Kubernetes می تواند به طور خودکار یک کانتینر را با استفاده از نام DNS یا آدرس IP در دسترس اینترنت یا سایر کانتینرها قرار دهد.تامین فضای ذخیره‌سازی(Storage provisioning):توسعه‌دهندگان می‌توانند Kubernetes را تنظیم کنند تا در صورت نیاز، فضای ذخیره‌سازی محلی یا ابری دائمی را برای کانتینرهای شما نصب کند.تعادل بار و مقیاس پذیری:هنگامی که ترافیک به یک کانتینر افزایش می یابد، Kubernetes می تواند از تعادل بار و مقیاس بندی برای توزیع آن در سراسر شبکه استفاده کند تا از ثبات و عملکرد اطمینان حاصل شود. (همچنین میزان کار توسعه دهندگان را در  راه اندازی یک متعادل کننده کاهش می‌دهد.)خود درمانی برای دسترس‌پذیری بالا:هنگامی که یک کانتینر خراب می شود، Kubernetes می تواند آن را مجددا راه اندازی یا به طور خودکار جایگزین کند. همچنین می‌تواند کانتینر‌هایی را که الزامات بررسی سلامت شما را برآورده نمی‌کنند، از بین ببرد.پشتیبانی و قابلیت حمل در چندین ارائه دهنده ابر:همانطور که قبلاً ذکر شد، Kubernetes از پشتیبانی گسترده‌ی همه‌ی ارائه دهندگان ابر پیشرو برخوردار است. این امر به ویژه برای سازمان‌هایی که برنامه‌های کاربردی را در یک محیط ابری ترکیبی یا چند ابری ترکیبی به کار می‌برند، مهم است.شرکت‌های ارائه دهنده خدمات کانتینر و هماهنگ کننده کانتینر در ایرانهم روش: این شرکت، با استفاده از کوبرنتیز، بستر ابری استقرار نرم‌افزار را برای کسب‌و‌کار‌ها فراهم می‌کند. همچنین امکان ارائه‌ی خدماتی از جمله پشتیبانی شبانه‌روزی، سیستم پایش داخلی و خارجی، سیستم لاگ و پشتیبان‌گیری در این بستر، برای مشتریان وجود دارد.دارکوب سرویس PaaS هم‌روش است که به برنامه‌نویسان و شرکتهای نرم‌افزاری این قابلیت را می‌دهد که سرویس خود را بدون دشواری و نیاز به درگیرشدن با مسائل زیرساختی روی کلاستر‌های کوبرنتیزی هم‌روش در داخل و خارج کشور اجرا کنند. این سیستم در دو نسخه‌ی CE و EE قابل ارائه به شرکتها و اشخاص می‌باشد. هدف دارکوب بهبود تجربه‌ و افزایش بهره‌وری برنامه‌نویسان در فرآیند توسعه و نگه‌داری سرویسهایشان هست.زیرساخت قدرتمند، امکان بالاآوردن ساده داکر ایمیجها، تجربه کاربری مناسب، پشتیبانی از زبان‌های برنامه‌نویسی گوناگون، بیلد و دیپلوی خودکار کد (CI/CD)، محاسبه هزینه بر اساس زمان استفاده، مقیاس‌پذیری ساده، بکاپ‌گیری روزانه خودکار و جمع‌آوری نگهداری متریکها و لاگها از جمله امکاناتی است که در دارکوب فراهم شده‌است.ابر آروان:ابر آروان شرکتی های‌تک در حوزه‌ی فناوری ابری است که کار خود را از سال ۱۳۹۴ آغاز کرده است و با ده‌ها محصول و قابلیت ابری مختلف مانند شبکه توزیع محتوا (CDN)، سرور ابری، پلتفرم ویدیویی، کانتینر ابری و آبجکت استوریج، زیرساخت کسب‌وکارهای آنلاین، سازمان‌ها و استارت‌آپ‌ها را تامین می‌کند.ابر آروان با در اختیار داشتن ۴۰ پاپ‌سایت در سراسر ایران و جهان، پاسخ‌گوی نیازهای زیرساختی بیش از ۶۰ هزار مشتری داخلی و خارجی است و تلاش می‌کند با قیمت‌گذاری اقتصادی و ارایه‌ی بسته‌های رایگان در هر محصول، از کسب‌وکارهای نوپا و در حال رشد نیز حمایت کند.سرویس‌دهی به بسیاری از پربازدیدترین وب‌سایت‌های ایرانی، پخش زنده‌ی مهم‌ترین رویدادهای ملی، ارایه‌ی خدمات امنیتی به سامانه‌های حساس دولتی و هم‌چنین جلوگیری از حملات سایبری به بسیاری از بانک‌ها و سامانه‌های کشور از جمله خدماتی است که این شرکت در اختیار کاربران قرار می‌دهد.«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»منابعhttps://www.ibm.com/cloud/learn/containerizationhttps://www.redhat.com/en/topics/cloud-native-apps/what-is-containerizationhttps://www.ibm.com/cloud/learn/container-orchestrationhttps://www.redhat.com/en/topics/containers/what-is-container-orchestrationhttps://www.docker.com/</description>
                <category>هانیه محمدی ارزنق</category>
                <author>هانیه محمدی ارزنق</author>
                <pubDate>Fri, 24 Dec 2021 00:59:07 +0330</pubDate>
            </item>
                    <item>
                <title>تحلیل کد استاتیک چیست؟</title>
                <link>https://virgool.io/@hanieMA/%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%DA%A9%D8%AF-%D8%A7%D8%B3%D8%AA%D8%A7%D8%AA%DB%8C%DA%A9-%DA%86%DB%8C%D8%B3%D8%AA-iyydimoojywr</link>
                <description>مقدمهبه عنوان یک دولوپر احتمالا تمام طول عمر کاری و یا بخشی از ان را به عنوان عضوی از یک شرکت یا یک گروه در حال توسعه‌ی نرم افزار‌های مختلف هستیم.یکی از کارهایی که که وظیفه‌ی روزانه‌ی ما به عنوان یک دولوپر به خصوص اگر یک دولوپر خبره باشیم هست،بازبینی کد‌های افراد مختلف است.هنگم بازبینی به دنبال موارد مختلفی هستیم از جمله یکسان بودن دست خط افراد مختلفی که بر روی پروژه کار می کنند،پیدا کردن آسیب پذیری‌های امنیتی که ممکن است به خاطر کد به وحود بیاید،دنبال کردن best practice های موجود هر زبان برنامه نویسی در کد‌ها،پیدا کردن باگ‌ها و ...زمانی که پروژه هنوز خیلی بزرگ نشده و افراد زیادی بر روی پروژه به شکل هم زمان کار نمی‌کنند احتمالا انجام دادن بازبینی کد کار طاقت فرسایی نباشد هر چند که احتمال این که مواردی هم از زیر دستمان در برود به خاطر خطا‌های انسانی همیشه وجود دارد.با بزرگ شدن پروژه و تیم، افراد بیشتری برای انجام وظیفه‌ی بازبینی کد نیاز خواهد بود و احتمالا انجام این وظیفه زمان زیادی را از نیروهای خبره میگیرد،به خصوص اگر تعدادی نیروی تازه کار به تیم اضافه شده باشند که با خیلی از best practice ها آشنا نیستند و احتمال وجود داشتن باگ در کدهایشان بالاست.همچنین زمان‌هایی وجود دارد که تیم‌های نرم افزاری تحت فشار کاری بالا برای رساندن پروژه‌ها پیش از ددلاین هستند،در این مواقع تمامی افراد تیم به خصوص نیروهای خبره در حال پیاده‌سازی بخشی از پروژه هستند و زمان زیادی برای بازبینی کد باقی نمی‌ماند.راه حلی که به ذهن خطور می‌کند خودکار کردن این بازبینی است.تا به حال بخش‌های مختلفی از فرآیند توسعه‌ی نرم افزار خودکار شده‌اند مانند Continuous Delivery/Continuous Integration و توسعه دهندگان نفع‌های زیادی از آن دریافت کرده‌اند.برای بازبینی کد هم چنین تمهیداتی اندیشیده شده و ابزار‌های بسیاری معرفی شده‌اند که بخش زیادی از بازبینی کد را با توجه به تنظیماتی که برای آن‌ها تعیین می‌شود،انجام می‌دهند.معرفییک تعریف ساده از تحلیل کد استاتیک این است که تمام کد ما برای پیدا کردن باگ،آسیب پذیری‌های امنیتی،دست خط یکسان و... بررسی می شود.تحلیل کد استاتیک پیش از آن که نرم افزار وارد فاز اجرای تست‌های خودکار و دستی بشود،بدون کامپایل کردن کد،تمام کد منبع را بررسی می‌کند و گزارشی از ضعف‌هایی که امکان تبدیل شدن به آسیب پذیری را در آینده دارند به دولوپر‌ها ارائه می‌دهد.البته این وظیفه را می‌توان بدون وجود ابزار نیز انجام داد و هر یک از افراد تیم وظیفه‌ی بازبینی کد را به عهده داشته باشند که همانطور که پیش از این ذکر شد،وجود خطاهای انسانی باعث کاهش تاثیر گذاری این کار می‌شود. خیلی از باگ‌ها و آسیب پذیری‌های امنیتی که منبع کد نشات می‌گیرند ممکن است حتی تا مدت‌ها پس از استقرار نرم افزار ظاهر نشوند و کاربر هم متوجه حضور آن‌ها نشود؛اما این امکان وجود دارد زمانی این آسیب پذیری‌ها مشخص شوند که ضرر‌های مالی سنگینی به پروژه وارد شود و با توجه به این که نرم افزار استقرار پیدا کرده‌است،رفع آن نیز هزینه بر باشد.تشخیص زود هنگام مشکلات در فرآیند توسعه‌ی نرم افزار جزو موارد ضروری برای کاهش هزینه‌ی نگه داری آن است.تحلیل کد استاتیک قادر است آسیب پذیری‌ها را در عمیق ترین لایه‌های کد و قسمت‌های مراقبت نشده نیز شناسایی کند. جالب است بدانید که ۸۲٪ از آسیب پذیری‌های امنیتی ناشی از باگ‌ها و مشکلاتی است که در کد منبع وجود دارد.هنگام استفاده از ابزار‌های تحلیل کد استاتیک علاوه بر این‌که می‌توانید از یکی از  دستورالعمل‌های راهنمای نوشتن کد با توجه به زبان برنامه نویسی مورد استفاده بهره مند شوید،می‌توانید قوانی مورد نظر خودتان که در شرکت یا تیم‌تان باید هنگام کد زدن رعایت شود به تنظیمات آن اضافه کنید.هر جه این قوانیی با دقت بیشتری به ابزار مورد نظرتان اضافه شود،کد یک دست‌تر و با کیفیت خیلی بالاتری خواهید داشت.در چه مرحله‌ای از توسعه‌ی نرم افزار باید از تحلیل کد استاتیک استفاده کرد؟تحلیل کد را می‌توان در هر مرحله‌ای از فرآيند توسعه اجرا کرد اما بهترین زمان آن پیش از فاز تست و در واقع در همان فاز تولید نرم افزار وکد زنی است.در این مرحله دولوپر‌ها خیلی زود از مشکلات موجود در کد‌هایش آگاه می‌شوند و پیش از آن که به مرحله‌ی تست خود کار برسند،آن را رفع می کنند.علاوه بر این در فاز تست ،نرم افزار به حالت اجرا در می‌آید و هدفی که در این فاز وجود دارد تست کردن functionality و کارکرد نرم افزار است و درگیر کد نرم افزار و بررسی آن جهت رعایت کردن دستورالعمل‌های کد گذاری مانند MISRA و رعایت Convention ها و Best Practice ها بررسی آسیب پذیری‌های کد نمی‌شود.محدودیت‌های تحلیل کد استاتیک چیست؟تحلیل استاتیک کد با یک هدف مشخص در یک فاز مشخص از توسعه‌ی نرم افزار اجرا می‌شود و لزوما نمی‌تواند تمام مشکلات موجود را تشخصیص دهد.برای مثال نمی‌تواند تشخص دهد که آیا نیازمندی‌های نرم افزار به طور کامل برطرف شده است یا نه؟یا این که بک تابع چگونه اجرا خواهد شد؟برای مواردی که اشاره شد نیازمند تست داینامیک خواهیم بود.به همین دلیل است که وجود هر دو نوع تست داینامیک و استاتیک برای توسعه‌ي یک نرم افزار و پیشگیری از بروز خطا‌ها و مشکلات جدی پس از استقرار نرم افزار ،واجب است.تحلیل کد استاتیک باگ‌های موجود در کد را زود تشخیص می‌دهد و باعث می‌شود که محصولی با کیفیت بالا‌تر به فاز تست نرم‌افزار برسد.مواردی که تحلیل کد استاتیک نمی‌تواند پوشش دهد:درکی از منظور و هدف توسعه دهنده نداشته باشد:int calculateArea(int length, int width){return(length + width)}ابزار تحلیل کد استاتیک احتمالا می‌تواند متوجه وجود سرریز در کد بالا شود اما  هیچقوت نخواهد فهمید که منطق کد بالا چیزی نیست که توسعه دهنده انتظار داشته با آن به جواب برسد.قوانینی که قابلیت اجرا به صورت استاتیک را ندارند:بعضی از قوانین کد زنی وابسته به اسناد خارجی هستند و یا این که با توجه به موضوع می‌توان تفاسیر مختلفی از آن‌ها کرد.برای مثال یکی از قوانین کد زنی CERT این است که: از کامنت‌ها به صورت یکپارچه به صورتی که خوانا باشند استفاده کنید.که برداشت‌های متفاوتی از یکپارچه و خوانا بودن ومی‌توان داشت و بنابراین برای ابزار غیر ممکن است که این قانون را در سطح کد بررسی کند.نقص‌های موجود در برنامه ممکن است منجر به مثبت کاذب(تشخیص وجود مشکل در حالی که مشکلی وجود ندارد) یا منفی کاذب(عدم تشخیص مشکلی که وجود دارد) شود:در برخی موارد،ابزار فقط می‌تواند گزارشی درباره‌ی وجود یک نقص ارائه کند:int divide(void){int x;if(foo()){x=0;}else{x=5}return(10/x);}از آنجایی که مقدار x وابسته به تابع foo() است،در صورتی چیزی درباره‌ی این تابع ندانیم،مقدار x را هم نخواهیم دانست.نتیجه غیر قابل تشخیص خواهد بود وبنابراین ممکن است ابزار خطایی را گزارش کند که در واقع وجود ندارد و یا در گزارش خطاهای واقعی دچار مشکل شوند(منفی کاذب)مزایای استفاده از ابزار‌های تحلیل کد استاتیک چیست؟مزایای زیادی برای استفاده از ابزار‌های تحلیل کد استاتیک می‌توان گفت به خصوص اگر بخواهیم با استاندار‌دهای موجود در صنعت توسعه‌ی نرم‌افزار پیش برویم.بهترین ابزار‌های موجود در این حوزه مزایایی چون سرعت،عمق و دقت را برای استفاده‌کنندگان فراهم می‌کند.سرعتبازبینی کد به صورت دستی زمان زیادی را از دولوپر‌ها میگیرد.ابزار‌های خودکار بسیار سریع‌تر هستند.ابزار‌های تحلیل کد استاتیک،مشکلات را خیلی زود در فرآیند توسعه‌ی نرم‌افزار متوجه می‌شوند و آدرس دقیق مکان وجود مشکل را به ما گزارش می‌کنند،بنابراین قادر خواهیم بود که مشکلات را خیلی سریع‌تر رفع کنیم.همچنین هزینه‌ی رفع این مشکلات به دلیل تشخیص زود هنگام آن‌ها کاهش چشم گیری خواهد داشت.عمقدر اجرای تست داینامیک نمی‌توانیم تمامی مسیر‌های اجرایی کد را پوشش دهیم اما ابزار‌های تحلیل کد استاتیک می توانند تمامی مسیر‌های موجود و تمام قطعه کد‌های برنامه که شاید برای حالت خاصی نوشته شده باشند را بررسی کند.همگام با این‌که ما در حال ایجاد کدمان هستیم ،این ابزار‌ها در حال بررسی کیفیت کد ما هستند بنابراین یک آنالیز عمقی از تمامی مشکلات ممکن موجود در کدمان با توجه به قوانینی که برای ابزار تعریف کردیم خواهیم داشت.دقتبازبینی کد‌ها به صورت دستی به دلیل خطای انسانی می‌تواند بستری برای اشتباهات باشد در حالی که ابزار‌های خودکار خطای دقت و انسانی نخواهند داشت و هرچه قوانین دقیق برای آن‌ها تعریف شود نتایج بهتری را بر‌می گردانند.ابزار‌ها خط به خط کد منبع را برای پیدا کردن مشکلات احتمالی چک می کنند.بنابراین می‌توانیم از بالاترین کیفیت برای کدمان پیش از ورود به فاز تست اطمینان پیدا کنیم.علاوه بر موارد گفته شده می‌توان به این مزیت اشاره کرد که با استفاده از این ابزار‌ها،نیروهای تازه کار هر تیم به مرور زمان بدون نیاز داشتن به کلاسی با best pracice های زبانی که به آن برنامه نویسی می‌کنند آشنا می‌شوند و بنابراین با گذشت زمان کد‌هایی با کیفیت بالاتر ارائه خواهند کرد و مسیر خبرگی را سریع تر طی خواهند کرد و هزینه‌ی کمتری را به دلیل خودآموز بود این فرایند برای آموزش خواهند داشت.معرفی دو ابزار متن باز برای تحلیل کد استاتیکاز آنجایی که وجود چنین ابزاری برای توسعه‌ی نرم‌افزار مهم و ضروری است،احتمالا تمامی شرکت‌ها و استارتاپ‌ها به دنبال داشتن این ابزار هستند اما شاید ابزار‌هایی که تچاری هستند و نیاز به پرداخت پول دارند برای بعضی به صرفه نباشد بنابراین به به دنبال ابزار‌های متن باز این حوزه هستند.Visual Code Grepper:یک ابزار تحلیل استاتیک کد بسیار سریع و قدرتمند برای زبان‌های برنامه نویسی رایج و محبوب مانند C ، C++ ، C# ، VB ، PHP ، Java ، PL/SQL و COBOL است.Visual Code Grepper به شکل موثری سرعت بازبینی کد را با شناسایی کد‌های نا‌امن بالا می‌برد.به دنبال اصطلاحاتی در کامنت‌ها می‌گردد که اشاره بر یک کد نا میزان داشته باشد.همچنین گزارش‌های دقیقی را ابا ارائه کردن آمار و نمودار‌های دایره‌ای به دست استفاده‌کنندگان می‌رساند. ویژگی‌های خیلی خوبی را برای کسانی که می‌خواهند از تحلیل کد استاتیک استفاده کنند و زمان برایشان ارزشمند است،فراهم می‌کند.با استفاده از این ابزار می‌توان برنامه‌های نوشته شده به بیشتر زبان‌های برنامه نویسی(چه جدید چه قدیمی) را آنالیز کرد.فقط کافیست زبانی که از آن استفاده می‌کنیم را مشخص کنیم تا این ابزار به خوبی آن را شناسایی کند و کد ما را آنالیز کند.با استفاده از یک نمودار دایره‌ای تحلیل و آنالیز کاملی را از تمام کدمان به ما ارائه می‌دهد که بخش‌های مربوط هر یک از مشکلات را در آن مشخص می‌کند.علاوه بر بررسی‌های پیچیده‌ی متعددی که خود ابزار انجام می دهد این امکان را به ما می‌دهد که از طریق افزودن فایل کانفیگ به ابزار بگوییم به دنبال چه موارد دیگری باشد.‌Bandit:یک ابزار رایگان برای پیدا کردن مشکلات امنیتی در کد‌های نوشته شده به زبان Python است.هر فایل را با پلاگین مناسبی بررسی می‌کند و گزارش دقیقی از مشکلات امنیتی ممکن در کد ارائه می‌کند.یک نرم افزار متن باز با لیسانس Apache 2.0 است که می‌تواند در فاز پیاده سازی یا پس از آن برای پیدا کردن مشکلات امنیتی رایج در پایتون پیش از استقرار و اجرایی شدن نرم‌افزار استفاده شود.از ویژگی‌های آن می‌توان به موارد زیر اشاره کرد:دارای رابط خط فرمان(Command-line) برای اسکن کد پایتوناز فایل‌های CSV، HTML و یJSON  پشتیبانی می‌کندمی‌توان مسیری برای گزارش پایه ایجاد کرد تا مواردی به عنوان آسیب پیری شناخته می‌شوند اما در پروژه‌ی فعلی آسیب پذیری نیستند مشخص کرد تا از آن‌ها چشم پوشی کند.شرکت‌های ایرانی فعال در این حوزهشرکت داده کاوان تصمیم یاراین شرکت در زمینه ارائه ، مشاوره و آموزش خدمات نرم افزاری به سازمان‌های دولتی و خصوصی فعالیت می‌نماید. شرکت داده کاوان تصمیم یار خدمات مختلف نرم افزاری ارائه می‌دهد که یکی از آنها “کوالاتک” نام دارد که “تست اتوماتیک نرم افزار و تضمین کیفیت” می‌باشد.تیم کوالاتک متشکل از کارشناسان ارشد دانشگاه صنعتی شریف است که کیفیت دغدغه آن‌هاست.این مجموعه به سازمان‌ها و تیم‌های توسعه نرم‌افزار کمک می‌کند تا از مزایای تست و تضمین کیفیت بهره مند شوند. در همین راستا از سال ۹۶، خدمات مشاوره،‌ آموزش و برون‌سپاری تست، تضمین کیفیت و اتوماتیک‌سازی را ارائه می دهد. مهندسین QA و Test مجموعه کوالاتک به شما کمک مي‌کنند تا به طور سیستماتیک و مطابق نیازمندی شما، از ریسک‌های کیفی و هزینه‌های اضافی ناشی از عدم تست اصولی در مرحله توسعه و تولید جلوگیری کنید.این شرکت به دلیل ارتباط مداوم با محافل علمی نظیر دانشگاه‌ها و پژوهشکده‌های تراز اول کشور به خصوص دانشگاه صنعتی شریف، سبب ارائه سطح بالایی از دانش روز دنیا به مشتریان شده است.همچنین انتقال دانش نیز یکی ازدغدغه‌های این مجموعه است و علاوه بر آموزش‌های مرسوم استفاده از خدمات نرم افزاری ، آموزش و منتورینگ دانش اصلی طراحی و پیاده سازی خدمات نرم افزاری را به مشتریان ارائه می‌کنندخانه تست ایرانخانه تست ایران با هدف ارتقای دانش تست نرم افزار و بهبود کیفیت نرم افزار ها اعم از وب سایت ها، اپلیکیشن های اندروید (Android) ، آی او اس (IOS) و نرم افزار های دسکتاپ پا به عرصه گذاشته اشت. خدمات ما شامل مشاوره در زمینه های تست عملکردی (Functional testing) و غیر عملکردی (Non-functional testing)، تشکیل تیم تست نرم افزار و بهبود فرآیند تست نرم افزار می باشد. همچنین انجام تست اتوماتیک توسط نرم افزارهای متن باز و تجاری از جمله خدمات این مجموعه می باشد. از دیگر خدمات این مجموعه می توان به انجام تست های کارکردی (Performance) و قابلیت استفاده (Usability testing) اشاره کرد.«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»منابعhttps://www.perforce.com/blog/sca/what-static-analysishttps://www.perforce.com/blog/qac/how-static-code-analysis-workshttps://www.geeksforgeeks.org/top-5-open-source-source-and-free-static-code-analysis-tools-in-2020/</description>
                <category>هانیه محمدی ارزنق</category>
                <author>هانیه محمدی ارزنق</author>
                <pubDate>Wed, 22 Dec 2021 23:04:46 +0330</pubDate>
            </item>
                    <item>
                <title>صف پیام(Message Queue)چیست؟</title>
                <link>https://virgool.io/@hanieMA/%D8%B5%D9%81-%D9%BE%DB%8C%D8%A7%D9%85message-queue%DA%86%DB%8C%D8%B3%D8%AA-ucom3uxzwxul</link>
                <description>مقدمهدر مدل Client/Server برای ارتباط بین Client و Server معمولا از روش Request/Response استفاده می‌کنیم؛یعنی Client نیاز خود را در قالب یک Request برای Server ارسال می‌کند و منتظر Response از سمت Server می‌ماند.تا زمانی که Server پاسخ مورد نیاز Client را آماده کند،Client باید منتظر بماند و در صورتی که Server زمان زیادی را نیاز داشته باشد تا پاسخ را آماده کند،در صورت  همگام بودن(Synchronous) بودن Request و Response احتمالا Client مسدود(Block) می‌شود.به طور کلی اینترنت بر پایه‌ی این مدل سنتی Request/Response کار می‌کند و در اکثر مواقع مشکلی وجود ندارد و درخواست Client به شکل مناسبی پاسخ داده می‌شود.مدل سنتی ارتباط بین Client و Serverچه زمانی نباید از مدل Request/Response سنتی استفاده کرد؟۱) فرض کنید آماده شدن Response از طرف Server زمانی نسبتا طولانی نیاز داشته‌باشد و چندین Client به طور مداوم Request‌های خود را برای Server ارسال می‌کنند.در این سناریو Server همیشه باید در دسترس باشد و علاوه بر آن هیچ یک از Request ها نباید از دست بروند.آیا مدل سنتی Request/Response می‌تواند برای این سناریو مناسب باشد؟آیا می‌تواند تجربه کاربری مناسبی را برای کاربران فراهم کند؟۲) زمانی که از معماری Microservice استفاده می‌کنیم و Client برای گرفتن پاسخ‌نهایی خود نیاز به تعامل چندین سرویس‌ با هم دارد،استفاده از مدل سنتی Request/Response باعث مسدود شدن درخواست Client‌های دیگر می‌شود.برای مثال زمانی که می‌خواهیم یک ویدیو را در Youtube آپلود کنیم چندین سرویس مانند Upload Service، Compress Service، Format Service، Notification Service،  باید با یکدیگر همکاری کنند تا درخواست آپلود یک ویدیو انجام شود.ارتباط زنجیره‌ای سرویس‌ها با یکدیگر برای تولید Responseهمانطور که در تصویر میبینیم به دلیل ارتباط زنجیره‌ای که سرویس‌ها با یکدیگر دارند و هر کدام منتظر پاسخ سرویس بعدی برای یک درخواست هستند، درخواست‌های بعدی برای آپلود ویدیو از سمت Client‌های دیگر که شامل تعداد زیادی درخواست است، مسدود می‌شوند و هر Client بدون دریافت هیچ نوع پاسخی باید برای مدت زمانی طولانی منتظر بماند؛این انتظار تجربه کاربری بسیار بدی را برای application ما خواهد داشت.بنابراین روش سنتی Request/Response برای معماری Microservice مناسب نخواهد بود.چگونه می‌توان این مشکل را برطرف کرد؟مشکل اصلی در روش Request/Response این است که کاربر ممکن است برای مدت نامعلومی پشت سیستم خود منتظر بماند تا پاسخی دریافت کند؛چطور می‌توانیم یک تجربه‌ی کاربری مناسب‌تری را برای کاربر فراهم کنیم؟بهتر است زمانی که می‌دانیم فرآیند پاسخ(Response) طولانی خواهد‌بود،درخواست کاربر را در جایی ذخیره کنیم و به وی اطمینان دهیم که درخواستش(Request) دریافت شده و مدتی طول خواهد کشید تا پاسخ (Response) آماده شود و به محض این که پاسخ آماده شود، کاربر را مطلع خواهیم کرد.در این صورت کاربر می‌تواند به کارهای دیگر خود برسد و نیازی نیست تمام مدت آماده شدن پاسخ منتظر آن بماند بدون آن که بتواند کار دیگری انجام دهد.چالش اصلی برای ایجاد این تجربه‌ی کاربری می‌تواند نحوه‌ی ذخیره کردن درخواست Client ها باشد.ساده‌ترین روشی که احتمالا به ذهن همه‌ی ما می‌رسد،ایجاد یک صف(Queue)است که درخواست‌ها به ترتیبی که وارد می‌شوند در آن ذخیره شوند.معرفی صف پیام(Message Queue)صف پیام (Message Queue) در واقع همان صفی هست که ما برای ذخیره سازی موقت درخواست‌ها می‌خواستیم.در این روش ،Client، پیام(Message) خود را  که حاوی درخواست مورد نظرش است به مقصد Message Queue می‌فرستد؛پیام‌های تمامی Client ها می‌تواند در صف‌های متفاوتی به ترتیب زمان ارسال یا اولویتی که برایشان تعیین می‌شود،قرار بگیرند؛ تا زمانی آن پیام توسط Service یا Application دیگری(Consumer) برای خدمت‌دهی از صف برداشته شود،پیام در صف باقی خواهد ماند و بنابراین هیچ یک از پیام‌ها که حاوی درخواست Clientهاست از دست نخواهد رفت.پاسخ هر پیام می‌تواند پیامی برای یک Service یا Application دیگر باشد مانند مثالی که برای آپلود ویدیو در Youtube گفتیم بنابراین پاسخ هر پیام نیز مستقیما برای Service یا Application یا Client ارسال نمی‌شود بلکه مقصد هر پاسخ باز هم یک Message Queue خواهد بود.صف بندی پیام‌ها این امکان را می‌دهد که سرویس‌ها و application ها به طور غیر همگام (Asynchronous) با یکدیگر ارتباط داشته باشندچرا که سرویس‌ها و application ها دیگر به طور مستقیم با یکدیگر در اتباط نیستند و از طریق صف پیام به عنوان یک واسط با هم تعامل می‌کنند.تولید کننده پیام(Producer) پیام خود را در صف قرار می‌دهد بدون آنکه منتظر بماند تا نتیجه‌ی آن را دریافت کند.یکی از مثال‌هایی که شاید خیلی از افراد  به صورت روزمره با آن در ارتباط هستند می‌ تواند ایمیل باشد.وقتی که ایمیلی را به مقصد ایمیلی دیگر ارسال می کنیم،پیامی با مضمون این‌که ایمیل ما ارسال شد به دست ما می‌رسد و بنابراین ما می‌توانیم به دیگر کار‌های خود برسیم.در ارسال ایمیل پیام ما گره(node)های میانی ذخیره می‌شوند و هر زمانی که گره‌ی بعدی آماده بود،به گره‌ی بعدی ارسال می‌شود بنابراین نیازی نیست تمامی گره‌ها در همان لحظه‌ی ارسال ایمیل ما آنلاین باشند و یا ایمیلی که به مقصد آن پیاممان را ارسال کردیم همزمان با ما آنلاین باشد،پیام به صندوق الکترونیکی مقصد می‌رسد و هر زمان کاربر ایمیل خود را باز کند آن را می بیند.در واقع Message Queue برای ایجاد این نوع ارتباط بین برنامه‌ها ایجاد شده است(Program to Program)واژه‌هایی که در Message Queue استفاده می‌شوندMessage: پیامی حاوی داده‌های مورد نیاز است که برای یک سرویس یا برنامه برای Message Queue می فرستد. پیام‌ها انواع مختلفی دارند.Queue:نام مقصدی که هر برنامه پیام‌های خود را برای آن میفرستد. پیام‌ها در صف‌ها جمع‌آوری می‌شوند تا زمانی که یکی از سرویس‌ها یا برنامه‌ها به آن خدمت رسانی کندProducer:برنامه یا سرویس‌هایی که پیام‌ها را تولید می کنند و به آن ها اولویت اجرا می‌دهند و درون صف‌ها قرار می‌دهند.Consumer: سرویس‌ها و برنامه‌هایی که پیام‌ها را از صف بر‌می دارند و  به آن‌ها خدمت رسانی می  کنند.انواع Message Queueنقطه به نقطه(Point to Point):یک پیام در صف گذاشته می‌شود و یک برنامه یا سرویس آن را بر‌می‌دارد.در این نوع برنامه‌ای که می‌خواهد پیامی را در صف بگذارد باید درباره‌ی برنامه‌ای که قرار است پیام‌ را دریافت کند اطلاعاتی داشته باشد.برای مثال باید بداند که پیام خود را به کدام صف باید بفرستد و ممکن است نیاز باشد نام Queue Manager مورد نظر را هم درج کند.در این روش در صورتی که پیامی از صف برداشته شود،آن پیام از صف حذف می‌شود و هیچ برنامه‌ی دیگری نمی‌تواند از آن پیام استفاده کند.Publish/Subscribe: در این روش یک کپی از پیام منتشر شده توسط تولید کنندگان(Publisher) به دست مصرف کنندگانی که ذینفع دریافت این پیام‌ها هستند می‌رسد.ممکن است تعداد زیادی،یکی و یا هیچ برنامه‌ی ذینفعی برای دریافت پیام وجود نداشته باشد. در این روش یک برنامه‌ی ذینفع به عنوان Subscriber شناخته می‌شود و پیام‌ها در صف‌های مرتبط با Subscriber ها می‌نشینند. در این روش نیازی به حذف پیام‌ها از صف وجود نداردمزایای استفاده از Message Queueکاهش وابستگی میان سرویس‌ها مختلف(Decoupling):با استفاده از Message Queue هیچ یک از سرویس‌ها و application ها در تعامل مستقیم با یکدیگر نخواهند بود،بنابراین نیازی نیست که از نحوه‌ی پیاده‌سازی یکدیگر آگاهی داشته باشند،Producer ها و Consumer ها می‌توانند به زبان‌های مختلفی نوشته شده باشند ، در بستر‌های متفاوتی قرار داشته باشند و،توسعه دهندگان متفاوتی داشته باشند و حتی از Protocol‌های ارتباطی متفاوتی استفاده کنند،اما با استفاده از Message Queue با یکدیگر در ارتباط باشند.بنابراین در صورت تغییر هر یک از سرویس‌ها دغدغه‌ی تغییر در دیگر‌ سرویس‌ها را به وجود نخواهد آورد چرا که وابستگی از لحاظ پیاده‌سازی به یکدیگر ندارند.توسعه پذیری(Scalability): همان‌طور که گفته شد به دلیل کاهش وابستگی میان سرویس‌های مختلف به راحتی می توان سیستم نرم‌افزاری مورد نظر را توسعه داد و ویژگی‌های مختلفی را به آن افزود،در صورتی که می‌خواهیم سرویس دیگری را به سیستم نرم افزاری‌مان اضافه کنیم فقط کافیست با Message Queue ارتباط برقرار کند؛همچنین هر‌ یک از سرویس‌ها را می‌توانیم به شکل‌ دلخواهمان تغییر دهیم.همچین با توسعه‌ی نرم‌افزار می‌توانیم تعداد مصرف کنندگان(Consumer) را افزایش دهیم تا پیام‌ها را با سرعت بیشتری از صف پیام بردارند و پاسخ بدهند.افزایش استفاده‌ی دوباره (Reusability):به دلیل کاهش وابستگی و افزایش توسعه پذیری میان سرویس‌ها در معماری Microservice و Application ها در دیگر معماری‌‌ها، می‌توانیم منطق نرم‌افزار را به بخش‌های کوچک‌تری بشکنیم تا هر بخش تنها مسئول اجرای یک وظیفه باشد.بنابراین Single Responsibility را به شکل دقیق‌تری می‌توانیم پیاده سازی کنیم.به همین دلیل هر یک از بخش‌های نرم‌افزار را می‌توانیم به راحتی برای ساختن نرم‌افزار‌های دیگر به کار ببریم و از این رو سرعت و فرآیندساخت نرم‌افزار‌ها را افزایش دهیم.ارتباط نا‌همگام(Asynchronous Connection):Service‌ها و Application ها نیازی ندارند برای ارتباط با یکدیگر به صورت همزمان آنلاین و در دسترس باشند چرا که صف بندی پیام‌ها این امکان را می‌دهد که پیام‌ها تا زمانی که برای ارائه‌ی خدمت از صف برداشته نشده‌اند،درون صف باقی بمانند؛بنابراین در صورتی که هر یک از سرویس‌ها و یا application‌ها به هر دلیلی در دسترس نبودند یا در حال پردازش پیام دیگری بودند،می توانند در زمان مناسب پیام را از Message Queue بردارند.اولویت‌بندی پیام‌ها(Message Priority):از دیگر مزایای استفاده از یک صف پیام می‌توان به قابلیت اولویت‌بندی پیام‌ها اشاره کرد.زمانی که برنامه می‌خواهد پیامی را در صف پیام قرار دهد،می‌تواند به آن اولویتی اختصاص دهد که این اولویت مشخص کننده‌ی جایگاه آن پیام در صف پیام خواهد بود.معایب استفاده از Message Queueاصلی ترین عیب این روش را می‌توان پیچیدگی استفاده‌ از آن دانست چرا که هماهنگی میان Message Queue با هر یک از تولید کنندگان و مصرف کنندگان و چگونگی ارتباط گرفتن صف‌ها با تولید کنندگان و مصرف کنندگان روشی پیچیده را می‌طلبد.اطمینان از این‌که پیامی با محتوای یکسان دو بار ارسال نشده باشد.در روش نقطه به نقطه چگونه  می‌توان مطمئن شد که یک پیام توسط یکی از برنامه‌ها خوانده شده  تا آن پیام را حذف  کنیم تا برنامه یا سرویس دیگری آن را بر ندارد.معرفی دو ابزار متن باز برای Message Queue۱) RabbitMQRabbitMQ محصول شرکت CloudAMQP است که از طریق پروتکل ارتباطی AMQP پیام‌ها را تبادل می‌کند. نرم افزار RabbitMQ یکی از Message Broker‌های پر استفاده در جهان است، دارای بیش از 35,000 استفاده کننده دارد.RabbitMْQ تمام ویژگی‌های معرفی شده برای Message Queue را دارد و بنابراین با تعریف تنظیمات مورد نیازمان در آن می‌توانیم برای سیستم مورد نظرمان از آن استفاده کنیم و بنابراین نیازی به این نداریم که خودمان یک Message Queue برای سیستم نرم افزاری ایجاد کنیم. با استفاده از RabbitMQ می‌توانیم هر دو نوع Message Queue را پیاده سازی کنیم.توسعه دهندگان اکثرا این ابزار‌ را به دلیل انعطاف پذیری بالایش در سناریو‌های پیچیده‌ی Routing استفاده می‌کنند. از دیگر قابلیت‌های RabbitMQ می‌توان به نصب پلاگین‌های مختلف بر روی آن برای ساپورت کردن دیگر پروتکل‌های پیام مانند STOMP و MQTT اشاره کرداین نرم‌افزار با زبان Erlang نوشته شده است و قابلیت نصب بر روی اکثر سیستم عامل‌ها را دارد.۲)Kafka Apache Kafka یکی دیگر از  Message Broker های معروف و پر استفاده است که LinkedIn آن را با Java و Scala برای پیگیری کردن وبسایت LinkedInتوسعه داده است. استفاده از کافکا نیز می‌تواند مزیت استفاده از هر دو نوع Message Queue را داشته باشد. با توجه به سیستم نرم افزاری مورد نیاز می‌توانیم تنظیمات مورد نظر را برای آن پیاده سازی کنیم.هر دوی‌ این ابزار‌ها در سطح بالا دارای کارآیی یکسانی هستند اما در جزئیاتی با یکدیگر تفاوت دارند.شرکت‌هایی که در این زمینه در ایران خدمات ارائه می دهندشرکت فعالی در این حوزه در ایران طی جستجو‌هایی که انجام دادم پیدا نکردم و به نظرم دلیل آن می‌تواند این باشد که دو ابزار معرفی شده به طور کامل تمامی ویژگی‌های مورد نیاز را به صورت متن باز در اختیار تمامی افراد و شرکت‌ها قرار می‌دهند و ما در ایران نیز می‌توانیم از خدمات آن استفاده کنیم.این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است.منابعhttps://www.ibm.com/docs/en/ibm-mq/8.0?topic=overview-introduction-message-queuinghttps://www.ibm.com/docs/en/ibm-mq/8.0?topic=queuing-main-features-benefits-messagehttps://www.ibm.com/docs/en/ibm-mq/8.0?topic=queuing-message-terminologyhttps://www.cloudamqp.com/blog/what-is-message-queuing.htmlhttps://www.youtube.com/watch?v=DXTHb9TqJOshttps://www.youtube.com/watch?v=5-Rq4-PZlew</description>
                <category>هانیه محمدی ارزنق</category>
                <author>هانیه محمدی ارزنق</author>
                <pubDate>Fri, 10 Dec 2021 17:29:36 +0330</pubDate>
            </item>
                    <item>
                <title>API Gateway چیست و چرا از آن استفاده می‌کنیم؟</title>
                <link>https://virgool.io/@hanieMA/api-gateway-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%DA%86%D8%B1%D8%A7-%D8%A7%D8%B2-%D8%A2%D9%86-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%85%DB%8C-%DA%A9%D9%86%DB%8C%D9%85-hjy9n59l9lqh</link>
                <description>یک تعریف ساده از APIاگر دستی در برنامه نویسی داشته باشید،احتمالا از API ها برای برقراری ارتباط بین دو نرم افزار متفاوت استفاده کرده‌اید و می‌دانید که برای تبادل داده بین Service و Client نیز از API استفاده می‌شود. اگر بخواهیم نمودی از API را در دنیای واقعی مثال بزنیم می توانیم یک رستوران را در نظر بگیریم که شما برای خوردن غذا به آن مراجعه می کنید. به عنوان مشتری(Client) هیچ وقت برای سفارش غذا وارد آشپزخانه(Service) نمی‌شوید و با سر آشپز درباره‌ی جزئیات مواد غذایی و نحوه‌ی طبخ آن صحبت نمی کنید؛بلکه غذایی(Request)که مدنظر دارید به گارسون(API) سفارش می دهید و گارسون سفارش شما را به آشپزخانه(‌‌Service) می‌رساند و در نهایت غذای شما(Response) را به دست شما(Client) می‌رساند و این گونه شما نیازی به صحبت مستقیم با سرآشپز و آگاهی از نحوه‌ی پخت غذا و مواد اولیه آن ندارید و و فقط با گارسون در ارتباط هستید. API ها در واقع سطح انتزاعی را برای برنامه Client به وجود می‌آورند تا با جزئیات Service درگیر نشود و فقط پاسخ درخواستش را دریافت کند و داده‌های مورد نیازش را با ساختار مناسب از طریق API دریافت کند.چگونگی استفاده از API در یک برنامه‌ی سادهزمانی که شروع به پیاده‌سازی برنامه‌ا‌ی کوچک و ساده برای یک فروشگاه آنلاین را می کنیم،احتمالا از معماری Monolithic استفاده می‌کنیم؛بنابراین Client فقط با یک API Call می تواند تمامی داده‌های مورد نیازش را از Service بگیرد.مثلا می‌تواند فقط با درخواست GET(api.myshop.com/product/48) تمامی داده‌های مربوط به صفحه‌ی جزئیات کالا با آی دی 48 را بگیرد. این سبک برنامه‌نویسی با وجودی که آسان‌تر است و نیاز به دانش بالایی ندارد اما با گذشت زمان و افزایش تعداد کاربران تعداد درخواست‌هایی که به API زده می شود بالا می‌رود و ممکن است سرور Down شود.درصورتی که بخواهیم همچنان تمام سرویس‌های برنامه را با یک API Call به کار بگیریم توسعه و نگه‌داری آن به مراتب سخت‌تر می‌شود؛همچنین به دلیل یک دست بودن پروژه با ازکار افتادن بخشی از آن کل سیستم مختل خواهد شد.بنابراین معماری Monolithic برای پروژه‌های بزرگ با تعداد درخواست‌های زیاد مناسب نیست؛به همین دلیل پروژه را به قسمت‌‌های مختلفی تقسیم میکنیم که هر قسمت به منحصرا یک وظیفه داشته باشد(Single Responsibility)  که به هر یک از این قسمت‌ها یک Microservice گفته می شود و این سبک معماری،معماری Microservice خوانده می شود.چه نیازی به API Gateway داریم؟سرویس‌های مختلفی که برای فروشگاه آنلاین می‌توانیم در نظر بگیریم شامل سرویس اطلاعات محصول،سرویس تامین کنندگان،سرویس کاربران،سرویس جستجو ، سرویس نظرات ، سرویس سبد خرید و سرویس محصولات پیشنهادی می تواند باشد که هر یک API مخصوص به خود را دارند؛بنابراین برنامه‌ي سمت Client  برای دریافت تمامی داده‌های صفحه جزئیات محصول یعنی اطلاعات محصول،تامین کنندگان،نظرات و ... باید چند Request را برای API سرویس‌های مختلف بفرستد تا داده‌های مورد نیازش را به دست بیاورد.کلاینت به هریک از سرویس‌ها درخواستی جداگانه می‌دهداین روش بسیار روش بدیهی و ساده‌ای است اما مشکلات فراوانی را در پی خواهد داشت.اولین مشکلی که احتمالا متوجه آن شده‌اید تعداد زیاد درخواست برای داده‌های فقط یک صفحه آن هم توسط فقط یک Client است و می دانیم که این برنامه تعداد صفحات زیادی دارد که هر یک با این روش نیاز به درخواست از چندین سرویس برای دریافت داده‌هایشان هستند.همچنین تعداد زیادی از کاربران با Client های متفاوتی مانند Mobile App،Web App و... با فروشگاه آنلاین ما در تعامل خواهند بود.مشکل دیگری که در این روش وجود دارد پایین بودن سطح امنیت است چرا که هر یک از سرویس‌های ما یک Rest API برای خودشان دارندکه نمی‌خواهیم تمامی آن‌ها برای عموم قابل دسترس باشند.یکی دیگر از مشکلات اساسی این روش این است که به دلیل ویژگی تغییر پذیری نرم افزار در طی زمان متوجه اشتباهاتمان در طراحی سیستم بشویم و نیاز داشته باشیم که دو یا چند سرویس را با ادغام کنیم و یا سرویس دیگری را به آن‌ها اضافه کنیم.در این صورت نیاز داریم Request های مربوطه را سمت Client تغییر دهیم که ریسک بالایی دارد.به خاطر حل تمامی این مشکلات و مشکلات دیگری که در ادامه به آن‌ها خواهیم پرداخت،نیاز به یک واسط کاربری میان  Clientها و Service ها داریم.API Gateway چیست؟API Gateway یک واسط کاربری است که میان Client و Service قرار میگیرد و سطح انتزاعی را بین آن‌ها ایجاد می کند.با وجود API Gateway دیگر نیازی نیست که Client برای دریافت داده‌های مورد نیازی با چندین سرویس تعامل کند. درخواست خود را به API Gateway ارسال می‌کند و این API Gateway هست که تشخیص می‌دهد برای پاسخ به درخواست  Clientبه کدام سرویس‌ها باید درخواست بدهد و سرویس‌ها پاسخ خود را به API Gateway ارسال می کنند و API Gateway پاسخ نهایی را برای Client ارسال می‌کند.API Gateway  به عنوان انتزاعی میان Client و Service قرار می‌گیردبنابراین زمانی که تعداد درخواست‌ها بالا می رود زمان پاسخ به Client‌ ها به شکل چشمگیری کاهش پیدا نمی‌کند و هر یک ازClientها طی مدت زمان مطلوبی می‌توانند داده‌های مورد نیازشان را دریافت کنند.همانطور که در تصویر مشخص است هریک از سرویس‌ها فقط با API Gateway در ارتباط هستند و بنابراین نیازی به این نیست که REST API های هر یک از سرویس‌ها به صورت عمومی در دسترس قرار بگیرد و بنابراین وجود API تا حد قابل قبولی امنیت سرویس‌ها را تصمین می‌کند.همچینین گفتیم که وجود API Gateway باعث به وجود آمدند سطح انتزاعی  میان Client و Service ها می‌شود و Client ها نیازی به دانستن تعداد سرویس‌های موجود و این که هر کدام مسئول چه  بخشی از منطق نرم‌افزاری هستند،ندارد؛بنابراین هنگامی که نیاز به Refactor کردن سرویس‌ها و تغییر طراحی سیستم داریم،نیازی نیست تغییری در نحوه‌ی درخواست Client دهیم و بنابراین به راحتی می توانیم در هر مرحله‌ای از توسعه در سرویس‌هایمان تغییر ایجاد کنیم.مزایای دیگر API Gateway هاعلاوه بر مواردی که گفته شد،API Gateway ها می توانند مزایای دیگری را هم برای ما فراهم کنند که باعث افزایش سرعت و بهره‌وری سیستم نرم افزاری شود.· مواردی مانند Authorization و Authentication را می توان در تنظیمات API Gateway پیاده سازی کرد؛چرا که برای تمامی درخواست‌های Client ها نیاز داریم دسترسی کاربر به صفحات درخواستی و همچنین عملیات مورد نظر را بررسی کنیم و سپس پاسخ مناسب را به Client  برگردانیم.البته می توانیم در تک تک سرویس‌ها Authentication و Authorization را پیاده سازی کنیم اما در این حالت سیستم کند تر می شود چرا که برای یک درخواست چندین سرویس باید یک کار یکسان را انجام دهند و دروصورتی که بخواهیم قواعد Authentication و Authorization را تغییر دهیم باید در تک تک سرویس‌ها این کار را انجام دهیم ؛بنابراین مسئولیت Authentication و Authorization را می توانیم به عهده‌ی API Gateway بگذاریم.· API Gateway ها برای Monitoring و بررسی میزان موفقیت درخواست‌ها در شرایط متفاوت، نمودار‌های مختلفی را از تعداد درخواست‌ها و نرخ پاسخ دهی به آن‌ها  را در اختیار توسعه دهندگان نرم افزار قرار می دهد از این رو توسعه دهندگان می‌توانند به سرعت متوجه مشکلات موجود شوند و برای رفع آن‌ها اقدام کنند.· خیلی اوقات پیش می آید که بخواهیم دسترسی به سرویس‌هایمان را از طریق IP های خاصی کاهش دهیم و یا تعداد درخواست‌هایی که در طی مدت زمان مشخصی به سرویس‌هایمان می رسد را محدود کنیم.در تنظیمات API Gateway توانیم مشخص کنیم که چه IP Range ای می‌تواند به سرویس‌های ما دسترسی داشته باشد یا مثلا در هر ثانیه چند درخواست می‌توانند به سرویس‌های ما وارد شوند.· یکی دیگر از موارد کاربردی در استفاده از  API Gateway ها عدم نیاز به یکسان بودن پروتکل‌های ارتباطی میان Client و Service است.برای مثال Client می‌تواند با پروتکل HTTPS درخواست‌های خود را برای API Gateway ها بفرستد اما API Gateway با توجه به پروتکل مورد نیاز هر سرویس آن درخواست را برای سرویس‌ها میفرستد که لزوما HTTPS نیست.و موارد دیگری از جمله Response Caching ،Load Balancing و ... را می‌توان با توجه به نیاز‌های موجود در تنظیمات API Gateway ها تعریف کرد.ابزار‌های متن باز موجود برای API Gateway ها1. HAProxy(High Availability Proxy) یک نرم افزار سرور متن باز برای Proxy و Load Balancing است که در لایه های Application و Network  دسترسی بالا(High Availability) ،بهبود سرعت و کارایی را از طریق توزیع بار کاری بر روی سرور‌های متفاوت فراهم می کند. HAProxy بر روی سیستم عامل‌های Linux،FreeBSD و Solaris اجرا می‌شود. از جمله امکاناتی که می‌تواند ارائه دهد می توان به موارد زیر اشاره کرد.URI/URL   based load balancing: YesLogging: YesProtocols: Application   and network layersSSL   termination: YesSession stickiness: YesGlobal/geo   server load balancing: NoScalability: Manual/predefined rulesAlgorithms: Network   layerInstallation and maintenance: ExtensiveSingle point of failure: Likely   (if on premises)Additional Features: No2. NGINX نیز یکی دیگر از ابزار‌های متن باز است که خدماتی چون ReverseProxy،HTTP Load Balancer و Email Proxy برای IMAP،POP3 و SMTP ارائه می کند.NGINX یک معماری رویداد محور و ناهمگام را برای مدیریت کردن تعداد بالای ارتباطاتی است که به وب سرور ارسال می‌شوند.این ویژگی باعث شده است که NGINX به یکی از قابل اعتماد‌ترین سرور‌ها تبدیل شود.NGINX تقریبا تمامی امکانات مورد نیاز برای یک API Gateway را ارائه می‌دهد.شرکت‌های داخلی که خدمات API Gateway ارائه می‌دهند· شرکت وصل:این شرکت با ارائه‌ی پلتفرم مدیریت API به توسعه دهندگان جهت طراحی و پیاده‌سازی برنامه‌های مرتبط با سامانه‌های داخلی سازمان/سرویس دهنده،کمک می‌کند.از آن‌جایی که API ها در تکنولوژی‌های مختلفی نظیر اینترنت اشیاء،رایانش ابری و داده‌های حجیم نقش کلیدی را ایفا می‌کنند،این پلتفرم پایداری،امنیت و پشتیبانی ویژه‌ای را ارائه می‌کند تا هر شخص حقیقی و حقوقی بتواند با اطمینان ازآن استفاده کند.از جمله خدماتی که این شرکت ارائه می کند شامل:1. مدیریت چرخه‌ی API ها با یک پلتفرم واحد:پلتفرم مدیریت API سورنا با نظارت، تجزیه و تحلیل داده‌ها، کنترل دسترسی‌ها و محافظت از اطلاعات حساس شما با سیاست‏‌های امنیتی خود موفقیت شما را تظمین می‌کند و به شما کمک می‌کند در نبرد با متجاوزان دنیای دیجیتال پیروز باشید.2. مانیتورینگ قدرتمند: بخش مانیتورینگ سورنا با ارائه تحلیل‌های دقیق و کاربردی به شما کمک میکند تا بتوانید هر روز عملکرد سیستم‌هایتان را افزایش و از وضعیت پاسخگویی آنها آمار و گزارشات دقیقی در اختیار داشته باشید.سیستم هشدارمتنی سورنا به کاربران این امکان رامی‌دهد تا در کوتاه ترین زمان ممکن مشکلات خود را شناسایی کنند و با صرف کمترین هزینه و کوتاهترین زمان آن مشکل را برطرف نمایند.3. امنیت و اعتماد: با توجه به اینکه این مولفه در جلوی سرویس اصلی (سرویس ارائه دهنده API) قرار می‌گیرد، در صورتی که به خوبی پیکربندی شود می‌تواند به عنوان یک سد و لایه حفاظتی عمل نموده و در افزایش امنیت  ارائه دهندگان API موثر باشد.سیستم خود را برای مقابله با هکرها، ربات‌ها و رفتارهای مشکوک آماده کنید. با آرامش و خیالی آسوده به ارائه خدمات خود بپردازید.4.راه‌حل برای اینترنت اشیاء:امروزه اینترنت اشیا و کاربردهای آن در حال فراگیر شدن است. اما انتخاب پلتفرم مناسب چالش بسیاری از سازمان ها و مدیران شهری است. شما با مدیریت سرویس سورنا می‌توانید تمامی خدمات در حوزه IOT را در پنل مدیریت اضافه کنید و با توجه به نیاز کاربرانتان آنها را ارائه نمایید.· شرکت ابر درسا:این شرکت سرویس API Gateway ابری را برای میزبانی API  ها ارائه می‌کندکه تعداد زیادی از توابع مدیریت چرخه زندگی را برای کمک به ایجاد معماری سیستم API محور ارائه می‌ دهد.این توابع شامل طراحی API،توسعه،آزمایش،انتشار،فروش،O&amp;M  و نظارت،امنیت و عدم انتشار است.ازجمله خدماتی که این شرکت ارائه می کند شامل:1. از محیط های ناهمگن شبکه پشتیبانی می کند: سرویس Api Gateway ابری می تواند API های سیستم های تجاری شما را مدیریت کند، صرف نظر از اینکه سیستم های تجاری شما در ابر درسا ، مراکز داده محلی یا ابرهای شخص ثالث مستقر شده اند یا خیر.2. ساخت انواع معماری فنی:معماری بدون سرور ترکیبی از Function Compute و API Gateway به توسعه دهندگان امکان می دهد تا کد را کشف کرده و به سرعت خدمات کم هزینه، بسیار در دسترس و مقیاس پذیر درزمان واقعی را ایجاد کنند. این معماری توسعه مشاغل مرتبط با دستگاه های تلفن همراه، برنامه های وب، اینترنت اشیا (IoT) بازار ابر را تسهیل می کند. این معماری امکانات توسعه تجارت ومرزهای تجاری را گسترش می دهد. انعطاف پذیری ترکیبات محصول بهبود یافته است.3. معماری میکروسرویس:سرویس Api Gateway ابری به عنوان یک سرویس ابری بالغ عمل می کند که اجازه دسترسی به خوشه هایبرنامه Kubernetes را می دهد. این به طور قابل توجهی قابلیت های سرویس خوشه های برنامه Kubernetes را بهبود می بخشد. این معماری به عنوان معماری استاندارد برای برنامه های کاربردی اینترنت در مقیاس بزرگ عمل می کند.این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است.منابعhttps://www.youtube.com/watch?v=hWRRdICvMNshttps://www.youtube.com/watch?v=1vjOv_f9L8Ihttps://www.youtube.com/watch?v=vHQqQBYJtLI&amp;amp;amp;amp;t=644shttps://www.youtube.com/watch?v=8WuVBbXsHzghttps://www.redhat.com/en/topics/api/what-does-an-api-gateway-dohttps://docs.microsoft.com/en-us/dotnet/architecture/microservices/architect-microservice-container-applications/direct-client-to-microservice-communication-versus-the-api-gateway-pattern</description>
                <category>هانیه محمدی ارزنق</category>
                <author>هانیه محمدی ارزنق</author>
                <pubDate>Thu, 09 Dec 2021 17:48:20 +0330</pubDate>
            </item>
                    <item>
                <title>تلاش دیگری برای نزدیک شدن به فهم مشترک از نرم افزار برای همه(بررسی روش C4 در معماری نرم افزار)</title>
                <link>https://virgool.io/@hanieMA/%D8%AA%D9%84%D8%A7%D8%B4-%D8%AF%DB%8C%DA%AF%D8%B1%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%D8%B2%D8%AF%DB%8C%DA%A9-%D8%B4%D8%AF%D9%86-%D8%A8%D9%87-%D9%81%D9%87%D9%85-%D9%85%D8%B4%D8%AA%D8%B1%DA%A9-%D8%A7%D8%B2-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%87%D9%85%D9%87%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%B1%D9%88%D8%B4-c4-%D8%AF%D8%B1-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-yqp5cvh0wevo</link>
                <description>مقدمهتصور کنید که چشم‌هایتان را بسته اند و شما را به یک مکانی که قبلا هیچ وقت در آنجا نبودید بردند!اولین سوالی که در ذهنتان پدیدار می‌شود این است که ‍‍‍‍‍:((من کجام!))در عصر تکنولوژی و با وجود گوشی‌های هوشمند و گوگل نباید نگرانی‌ای درباره‌ی گم شدن داشته باشید!زمانی که میخواهیم از گوگل مپ استفاده کنیم با زدن دکمه Find Me می توانیم جایگاه خودمان را پیدا کنیم اما با دید خیابان(Street View).برای کسی که اولین بار است در مکانی حضور دارد که قبلا هیچ وقت در آنجا نبوده است،این دید مناسبی نیست؛بنابراین احتمالا مقداری درجه‌ی زوم را کمتر می کنید تا دید کلی‌تری از جایی که هستید داشته باشید مانند نام خیابانی که در آن هستید و خیابان‌‌های اطراف.به همین ترتیب با توجه به میزان آشناییتان با منطقه‌ای که هستید می توانید درجه‌ی زوم را کم تر کنید و از جزئیات صرف‌نظر کنید تا به یک دید آشنا در ذهنتان برسید مثلا کره‌ی زمین!معرفیدر مهندسی نرم‌افزار هم مانند سایر علوم مهندسی از بدو تولد تا به الان یعنی 2021 میلادی همواره تلاش شده تا برای ذی نفعان با میزان دانش مختلفی از نرم‌افزار نمودار‌هایی با سطوح مختلفی از انتزاع ترسیم کنند که توضیح‌دهنده‌ی نرم افزار در حال ساخت یا ساخته شده باشد.نمودار‌های UML نمونه‌ای از تلاش ‌‌‌های موفق مربوط به حدود 20 سال پیش هستند که در آن زمان سیستم‌های نرم افزاری به بزرگی و پیچیدگی الان نبودند.امروزه،این نمودار‌ها به دلیل پیچیدگی نسبی در علامت گذاری و شکل‌هایشان تقریبا در پروژه‌ها استفاده نمی شوند و اکثر معمارین نرم افزار رو به کشیدن شکل‌هایی پر از خطوط و اشکال در هم با علامت گذاری شخصی خودشان پای وایت برد آورده اند.اگر بخواهیم صادق باشیم درک هیچ کدام از این نمودار‌‌ها بدون توضیح فرد دیگری که در پروسه به وجود آوردن آن‌ها حضور داشته ممکن نیست.علاوه بر این هیچ وقت یک ارتباط یک به یک و دقیق بین کدی که زده شده و نمودار‌های آن وجود ندارد.نمونه‌ای از نمودار‌‌های طراحی شده برای توضیح معماری نرم افزار به کار گرفته شده در سیستم نرم افزاریSimon Brown  با الهام گرفتن از سطوح انتزاع در علوم مختلف مهندسی مدل C4 را طی سال‌های 2006 تا 2011 بر پایه UML و معماری 4+1 ابداع کرد.همه‌ی ذی نفعان یک پروژه نیاز نیست که به یک اندازه از جزئیات سیستم نرم افزاری آگاه باشند.برای مثال یک صاحب محصول(Product Owner) نه نیازی دارد و نه دانش مطلوب را که به اندازه‌ی یک توسعه‌دهنده از جزئیات  سیستم نرم افزاری آگاه باشد.اما همه ذی‌نفعان باید در تمامی سطوح فهم مشترکی از سیستم نرم‌افزاری برای ایجاد ارتباطی درست و منطقی با یکدیگر داشته باشند. هدف وی ایجاد یک روش مدلسازی برای برقرار ارتباط هرچه بهتر میان ذی‌نفعان پروژه بود چرا که در این صورت بود که تیم‌ها واقعا می‌توانستند چابک عمل کنند.C4 چیست؟در این روش سعی شده تا سطوح مختلفی از انتزاع با میزان جزئیات متفاوتی برای درک تمامی افراد درگیر در پروژه با هر میزان دانشی ایجاد کرد. از این روش نه تنها هنگام توسعه‌ی نرم افزار بلکه پس از آن و برای ایجاد نقشه‌های دقیقی از کد‌های پیاده شده نیز می توان استفاده کرد تا شبیه کاری که گوگل مپ برای ما می کند را برای ذی نفعان در طی تمامی زمان‌ها انجام دهد.‌ در روش C4 سطوح انتزاع بسیار اهمیت بیشتری از علامت گذاری‌ها دارند و تلاش بر این است که این انتزاع‌ها خود توضیح دهنده باشند.تاکید این روش بر بخش ایستا(Static) نرم افزار است.این معماری دارای چهار سطح از انتزاع شامل است : ‌ContextContainerComponentClassدر ادامه به شرح هر یک از این چهار سطح انتزاع با مثالی از یک سیستم بانکداری می‌پردازیم.سطوح مختلف C4زمینه(Context):بالاترین سطح انتزاع را‌ در این مدل دارد و نقطه‌ی شروع مناسبی برای مدلسازی است که برای تمامی افراد پروژه یک دید کلی از حوزه‌ی(Scope) پروژه،بازیگران در ارتباط با پروژه و همچنین سیستم‌های نرم افزاری دیگری که سیستم در حال توسعه با آن ها ارتباط خواهد داشت را نشان می دهد.سطح ۱ :نمودار زمینه‌ی سیستمدر این نمودار سیستمی که ما در حال توسعه‌ی آن هستیم و  توضیحاتی درباره کارکرد کلی آن(اسامی به تنهایی برای درک عملکرد کافی نیستند به خصوص اگر اسامی خوبی انتخاب نکنیم) در وسط شکل قرار می گیرد. تمامی بازیگران و دیگر سیستم‌های نرم افزاری که با سیستم ما در تعامل هستند در اطراف آن به همراه توضیحات مربوط قرار میگیرند.جزئیات در این نمودار اهمیت ندارند و توجه ما در این نمودار بر روی بازیگران،نقش‌ها و پرسونا‌ها خواهد بود.دربردارنده(Container)این نمودار اولین قدم ما در توصیف جزئیات سیستم نرم افزاری است.پس از آن که یک تصویر کلی از سیستم نرم‌افزای به دست آوردیم می توانیم با زوم کردن بر روی سیستم نرم‌افزاری با جزئیات بیشتری از سیستم آشنا شویم.یک Container باید اجرا شود تا سیستم نرم افزاری ما کار کند مانند: برنامه کاربردی(application) یا یک پایگاه داده(Data Base)سطح ۲:نمودار دربردارندهدر مثال بانکداری با توجه به شکل می توان دید که بخش‌های مختلف اجرایی در یک Container نشان داده شدند.هر یک از آن‌ها دارای عنوان و توضیحات مختصر درباره کارکرد هر بخش و تکنولوژی‌‌های مورد استفاده است همچنین توضیحات مربوط به ارتباطات هر یک با یکدیگر و با محیط خارج از Container برای درک کامل اضافه می شوند.مولفه(Component)با زوم کردن بر روی هر یک از Container‌ها می توانیم بلوک‌های اصلی تشکیل دهنده هر Container را ببینیم.هر Container دارای مولفه‌هایی است که هر کدام وظیفه‌ی اجرای بخشی از Functionality های سیستم را به عهده دارند.سطح ۳: مولفه(Component)با زوم کردن بر روی API ها با مولفه‌های کدی سازنده‌ی API رو به رو میشویم که درون خط چین مشخص شده‌اند.‌در این مرحله نیز با انتخاب عنوان‌های مناسب و توضیحات کافی برای درک مشترک سیستم بانکداری توسط توسعه دهندگان نرم افزار تلاش می کنیم.این سطح از انتزاع برای توسعه دهندگان نرم افزار ایجاد شده و مناسب است.کلاس(Class)با زوم کردن بر روی هر یک از مولفه‌ها با مجموعه‌ای از کلاس‌ها رو به رو خواهیم بود که متناظر با نمودار‌های UML هستند و جزئیات مربوط به کد زنی  و چگونگی پیاده سازی را بیان می کند.البته ترسیم این سطح جز برای مولفه‌های پیچیده و مهم توضیه نمیشود چرا که باعث سر در گمی می شود.سطح ۴: کلاس(Class)ابزارتا به حال معماران اکثرا از ابزار‌‌های همه منظوره طراحی مانند Visio برای نمایش نمودار‌های مورد نظرشان استفاده می‌کردند.این ابزار‌های اگر مانند ابزار‌‌های مربوط به طراحی معماری ساختمان خاص منظوره شوند،معماران با سرعت عمل بیشتری نمودار‌های C4 را طراحی و تغییر می‌دهند.به همین منظور  Simon Brown ابزار Structurizr را ابداع کرده است.در این نرم افزار با نوشتن درباره‌ی هر یک از بخش ‌‌های نمودار و ویژگی ‌‌های آن می توانید نمودار مربوط را تولید کنیم؛بنابراین ایجاد و تغییر نمودار‌ها با سرعت خوبی انجام میگیرند و قدم بسیار خوبی برای همزیستی کد و مدل و همچنین از بین بردن تفاوت‌های کد و مدل بر می داریم.در Structurizr ابزار‌های کاملی جهت ترسیم و داشتن علامت گذاری‌های یکسان و گویا نیز تعبیه شده است.جمع بندیروش C4 قدم بزرگی جهت ایجاد نمودار‌‌هایی با سطوح انتزاع مختلف برای ایجاد فهم مشترک میان تمامی ذی نفعان سیستم برداشته است.با استفاده از این روش Documentation و به روز رسانی مدل‌ها تا حد قابل قبولی ساده شده‌اند و بنابراین می توان یک طراحی را در سر تا سر یک سیستم نرم افزاری در طی چرخه‌ی حیاتش و با وجود نیرو‌ های انسانی متنوع و متعدد داشت.البته از آنجایی که این روش فقط بر روی بخش ایستای سیستم نرم افزاری تاکید دارد،هنوز نیازمند روش‌هایی برای مدلسازی رفتار پویای سیستم و ارتباط بخش‌های مختلف نرم افزار در طی چرخه‌حیات نرم افزار هستیم.منابعhttps://www.youtube.com/watch?v=Ym9nhVZs89ohttps://www.youtube.com/watch?v=x2-rSnhpw0ghttps://c4model.com/«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»</description>
                <category>هانیه محمدی ارزنق</category>
                <author>هانیه محمدی ارزنق</author>
                <pubDate>Fri, 19 Nov 2021 23:53:15 +0330</pubDate>
            </item>
            </channel>
</rss>