تصور کن اپلیکیشنی ساخته ای که امروز ۵۰ هزار کاربر دارد و همه چیز خوب پیش می رود؛ سرعت قابل قبول است، لاگ های خطا تمیزند و زیرساخت بدون فشار کار می کند. اما فردا یک کمپین بازاریابی، یک همکاری جدید یا یک ترند ناگهانی باعث می شود همان ۵۰ هزار کاربر در عرض چند روز به ۵ میلیون نفر برسند. حالا داستان عوض می شود. هر درخواست به جای پاسخ در میلی ثانیه، چند ثانیه معطل می ماند، دیتابیس صف می زند، سرورها داغ می کنند، لاگ ها پر از ۵۰۰ و Timeout می شوند و اولین موج ریزش کاربر شروع می شود. دقیقا همین لحظه است که سرچ می کنی: Fundamentals of Designing Large Scale Applications. چون می خواهی مطمئن شوی این بار نه فقط اپلیکیشن بسازی، بلکه سیستمی طراحی کنی که حتی وقتی رشد مثل سونامی وارد شد، همچنان پاسخ گو، سریع، مقاوم و بدون Downtime باقی بماند. این جستجو برای کسی است که می خواهد بفهمد چطور قبل از وقوع بحران، معماری درست، شاردینگ دیتابیس، Load Balancing، کشینگ هوشمند و High Availability را مثل ستون های یک ساختمان بلندمرتبه، از همان ابتدا درست قرار دهد تا زیر فشار مقیاس، فرو نریزد.
قبل از ورود به جزئیات، بیایید ساده ترین شکل معماری یک اپلیکیشن امروزی را بررسی کنیم. یک توسعه دهنده، اپلیکیشنی را ساخته و آن را روی یک سرور مستقر (deploy) می کند. این اپلیکیشن برای خواندن و نوشتن داده با یک سیستم ذخیره سازی در ارتباط است. همچنین، برای تشخیص مشکلات، به یک سیستم ثبت وقایع (Logging) نیاز دارد. سرور باید برای نظارت بر معیارهای سیستمی با یک سرویس متریک (Metrics) در ارتباط باشد و یک سرویس هشدار (Alerting) نیز لازم است تا بر اساس مقادیر آستانه (Threshold) این متریک ها، هشدار تولید کند.
پس از استقرار، اپلیکیشن شروع به دریافت درخواست از کاربران می کند. اگر تعداد درخواست ها بیش از حد زیاد شود، دو راه حل وجود دارد:
برای توزیع متعادل ترافیک بین سرورها، از یک متعادل کننده بار (Load Balancer) استفاده می کنیم. این خلاصه ای کلی از توپولوژی یک اپلیکیشن است.

هنگام طراحی اپلیکیشن، باید سه موضوع اساسی را در نظر بگیرید: داده چگونه منتقل می شود، چگونه ذخیره می شود و چگونه پردازش می شود. وقتی این سه نیاز اساسی را در سطح بهینه برآورده کنید، یک سیستم خوب طراحی کرده اید. اما طراحی خوب چیست؟ یک طراحی خوب ترکیبی از در دسترس بودن (Availability)، قابلیت اطمینان (Reliability)، توان عملیاتی (Throughput) و تأخیر کم (Low Latency) است.
| موضوع | عبارت | توضیحات |
| در دسترس بودن | Availability | از نظر ریاضی، نسبت زمان فعال بودن سیستم به کل زمان (Uptime / Total Time) است. این معیار که با درصد بیان می شود، به عنوان توافق نامه سطح خدمات (SLA) نیز شناخته می شود. برای مثال، Availability 99.9% یعنی سیستم شما در طول یک سال تنها ۸ ساعت و ۴۱ دقیقه از دسترس خارج خواهد بود. |
| قابلیت اطمینان | Reliability | به احتمال از کار نیفتادن یک سیستم اشاره دارد. این مفهوم با تحمل خطا (Fault Tolerance) مرتبط است. هرچه تحمل خطا بیشتر باشد، قابلیت اطمینان سیستم نیز بالاتر می رود. مقیاس پذیری افقی (Horizontal Scaling) هم در دسترس بودن و هم قابلیت اطمینان را افزایش می دهد. |
| توان عملیاتی | Throughput | به تعداد عملیاتی که سیستم در یک واحد زمانی مشخص (مثلاً یک ثانیه) می تواند انجام دهد، اشاره دارد. این معیار معمولاً با واحد درخواست در ثانیه (RPS) برای اپلیکیشن ها و کوئری در ثانیه (QPS) برای پایگاه های داده اندازه گیری می شود. |
تأخیر (Latency) به مدت زمانی که طول می کشد تا یک عملیات کامل شود، گفته می شود. فاصله جغرافیایی کاربر تا سرور و عدم استفاده از کش (Cache) از عوامل اصلی افزایش تأخیر هستند.
شبکه های کامپیوتری از پروتکل های مختلفی برای انتقال داده استفاده می کنند. IP، TCP و UDP پایه های این پروتکل ها را تشکیل می دهند.

| موضوع | توضیحات |
| HTTP (Hypertext Transfer Protocol) | پروتکل اصلی برای انتقال داده در وب (صفحات وب و APIها) است. هر درخواست در HTTP مستقل از دیگری است. |
| WebSocket | یک اتصال دوطرفه و پایدار برای انتقال داده به صورت زنده (Real-time) فراهم می کند. برای اپلیکیشن های چت، بازی های آنلاین و به روزرسانی های آنی داده که به تأخیر کم و تعامل بالا نیاز دارند، مناسب است. |

کشینگ یک تکنیک حیاتی برای دسترسی سریع به داده و بهبود عملکرد سیستم است. با این حال، منابع ما نامحدود نیستند و به یک سیاست خروج (Eviction Policy) نیاز داریم:
داده ای که برای طولانی ترین زمان استفاده نشده، از کش حذف می شود. برای مثال در طراحی سایت اختصاصی یا اپلیکیشنی مانند توییتر، توییت های قدیمی که دیگر دیده نمی شوند، با این روش حذف می شوند که بسیار کارآمد است.
داده ای که کمترین تعداد دفعات به آن دسترسی داشته ایم، حذف می شود.
CDN برای تحویل سریع تر محتوای ثابت (Static) مانند تصاویر و ویدئوها به کاربران استفاده می شود. CDN این محتوا را روی سرورهای مختلف در سراسر جهان کش کرده و آن را از نزدیک ترین سرور به کاربر تحویل می دهد.
پروکسی یک سرور واسطه است که ارتباط بین کلاینت ها و سرورها را مدیریت می کند.
یک Reverse Proxy است که درخواست های ورودی را بین چندین سرور توزیع می کند.
تکنیکی برای توزیع بهینه داده در سیستم های توزیع شده. با افزودن یا حذف یک نود (سرور)، تنها بخش کوچکی از داده ها نیاز به جابجایی دارند که این امر پایداری و عملکرد سیستم را به شدت بهبود می بخشد.
دو نوع اصلی پایگاه داده وجود دارد: SQL و NoSQL.
این پایگاه داده ها از اصول ACID پیروی می کنند که یکپارچگی و امنیت داده را تضمین می کند:
این پایگاه داده ها مدل سازی انعطاف پذیر و مقیاس پذیری بالایی ارائه می دهند و برای داده های بدون ساختار یا حجیم مناسبند.
| موضوع | عبارت | توضیح |
| تکثیر | Replication | کپی کردن داده ها روی چندین سرور. یک سرور اصلی (Master) وظیفه نوشتن داده را بر عهده دارد و سرورهای فرعی (Slave) برای خواندن داده استفاده می شوند. این کار در دسترس بودن (Availability) را افزایش داده و بار خواندن را توزیع می کند. |
| بخش بندی | Sharding | تقسیم مجموعه داده های بزرگ به قطعات کوچک تر به نام شارد (Shard) و توزیع آن ها روی چندین سرور. این روش مقیاس پذیری افقی را برای عملیات نوشتن بهبود می بخشد. |
صف پیام یک ساختار حیاتی برای مدیریت ارتباطات ناهمزمان (Asynchronous) بین اجزای مختلف سیستم است. این سیستم پیام ها را در یک صف قرار می دهد تا به ترتیب پردازش شوند. این کار باعث می شود اجزای سیستم در ساخت اپ تحت وب به طور مستقل از هم کار کنند، از اتلاف داده جلوگیری شود و در زمان ترافیک بالا، بار سیستم متعادل گردد.
مدل Publish/Subscribe (Pub/Sub): یک الگوی پیام رسانی است که در آن، یک ناشر (Publisher) پیام ها را به یک تاپیک (Topic) ارسال می کند و مشترکین (Subscribers) بدون نیاز به ارتباط مستقیم با ناشر، آن پیام ها را دریافت می کنند. این مدل وابستگی بین کامپوننت ها را کاهش و انعطاف پذیری سیستم را افزایش می دهد.
هر سیستمی و طراحی سایت، نیازمندی ها و الزامات منحصربه فرد خود را دارد. بنابراین، طراحی سیستم ها به کارآمدترین شکل ممکن و ارائه راه حل هایی که به بهترین نحو این نیازها را برآورده کنند، امروزه از اهمیت بالایی برخوردار است. در این مقاله، اطلاعات پس زمینه ضروری در مورد طراحی سیستم را ارائه دادم و امیدوارم این اطلاعات شما را در فرآیند طراحی راهنمایی کند.
پرسش و پاسخ
پرسش مورد نظر خود را مطرح نمایید