No history yet

معماری سیستم‌های توزیع شده

الگوهای معماری: فراتر از یکپارچه

گذار از معماری یکپارچه (Monolithic) به میکروسرویس‌ها (Microservices) صرفاً یک تغییر فنی نیست، بلکه یک تحول ساختاری در سازمان و فرآیندهای توسعه است. در حالی که یکپارچه‌ها سادگی را در مراحل اولیه ارائه می‌دهند، با رشد سیستم، وابستگی‌های داخلی به یک «گلوله گلی بزرگ» (Big Ball of Mud) تبدیل می‌شوند که نگهداری و مقیاس‌پذیری را مختل می‌کند.

معماری میکروسرویس با پیروی از ، ساختار سیستم را با ساختار تیم‌های ارتباطی هماهنگ می‌کند. هر سرویس، با مرزهای مشخص (Bounded Context)، توسط یک تیم مستقل توسعه داده شده، مستقر و مقیاس‌پذیر می‌شود. این استقلال، سرعت توسعه را افزایش می‌دهد اما پیچیدگی‌های جدیدی را در ارتباطات بین سرویس‌ها، کشف سرویس (Service Discovery) و تحمل خطا (Fault Tolerance) به وجود می‌آورد.

معماری بدون سرور (Serverless) این انتزاع را یک قدم فراتر می‌برد و مدیریت زیرساخت را به طور کامل به ارائه‌دهنده ابر واگذار می‌کند. توسعه‌دهندگان فقط بر روی منطق عملکرد (Function) تمرکز می‌کنند. این الگو برای بارهای کاری ناگهانی و رویداد محور (event-driven) ایده‌آل است، اما با چالش‌هایی مانند شروع سرد (Cold Start)، محدودیت‌های زمان اجرا و وابستگی به پلتفرم (vendor lock-in) همراه است.

ویژگیMonolithicMicroservicesServerless
واحد استقرارکل برنامهیک سرویسیک تابع
مقیاس‌پذیریعمودی/افقی (کل برنامه)افقی (هر سرویس)خودکار (هر تابع)
پیچیدگی عملیاتیکمزیادبسیار کم (مدیریت شده)
سرعت توسعهدر ابتدا سریع، سپس کندبه طور مداوم سریعبسیار سریع برای توابع منفرد
تحمل خطاپایین (یک خطا کل سیستم را مختل می‌کند)بالا (ایزوله کردن خطاها)بسیار بالا (ایزوله در سطح تابع)

سازگاری، در دسترس بودن و تئوری CAP

در قلب هر سیستم توزیع‌شده، یک بده‌بستان اساسی وجود دارد که توسط تئوری CAP تعریف می‌شود. این قضیه بیان می‌کند که یک سیستم داده توزیع‌شده تنها می‌تواند دو مورد از سه تضمین زیر را به طور همزمان ارائه دهد:

  1. سازگاری (Consistency): همه کلاینت‌ها در هر لحظه دید یکسانی از داده‌ها دارند.
  2. در دسترس بودن (Availability): هر درخواستی یک پاسخ (غیرخطا) دریافت می‌کند، حتی اگر برخی از نودها از کار افتاده باشند.
  3. تحمل‌پذیری افراز (Partition Tolerance): سیستم حتی در صورت قطع ارتباط شبکه بین نودها به کار خود ادامه می‌دهد.

از آنجایی که افراز شبکه در سیستم‌های توزیع‌شده یک واقعیت اجتناب‌ناپذیر است، انتخاب واقعی همیشه بین سازگاری و در دسترس بودن (CP vs. AP) است.

با این حال، تئوری CAP فقط وضعیت را در هنگام وقوع افراز شبکه توصیف می‌کند. مدل یک چارچوب کامل‌تر ارائه می‌دهد. این مدل می‌گوید: «در صورت وجود افراز (P)، سیستم بین در دسترس بودن (A) و سازگاری (C) یکی را انتخاب می‌کند، در غیر این صورت (E)، بین تأخیر (L) و سازگاری (C) یکی را انتخاب می‌کند.»

این مدل به معماران کمک می‌کند تا پایگاه‌داده‌ای را انتخاب کنند که با نیازهای زمان عادی (Else) و زمان بحران (Partition) سیستمشان هماهنگ باشد. برای مثال، سیستمی که به پاسخ‌های سریع نیاز دارد (مانند یک پلتفرم تبلیغات آنلاین) ممکن است یک پایگاه داده EL (Else, Latency) مانند Cassandra را ترجیح دهد، در حالی که یک سیستم مالی که به دقت داده نیاز دارد، یک پایگاه داده EC (Else, Consistency) مانند PostgreSQL را انتخاب می‌کند.

طراحی برای شکست

در سیستم‌های توزیع‌شده، شکست یک احتمال نیست، بلکه یک قطعیت است. طراحی سیستم‌های با دسترس‌پذیری بالا (High Availability) و تحمل‌پذیر در برابر خطا (Fault-tolerant) بر پایه پذیرش این واقعیت استوار است. استراتژی‌های کلیدی در این زمینه عبارتند از:

  • تکرار (Redundancy): اجرای چندین نمونه از یک کامپوننت. اگر یکی از کار بیفتد، دیگری جایگزین می‌شود. این اصل در سطوح مختلف از سرورهای فیزیکی گرفته تا کانتینرهای نرم‌افزاری اعمال می‌شود.
  • عدم وجود نقطه شکست منفرد (No Single Point of Failure): اطمینان از اینکه از کار افتادن یک جزء، کل سیستم را از کار نمی‌اندازد. این نیازمند تکرار در هر لایه از معماری است: متعادل‌کننده‌های بار، سرورهای برنامه، پایگاه‌های داده و غیره.
  • تشخیص خطا و بازیابی خودکار (Automatic Failover): سیستم باید بتواند به طور خودکار خطاها را تشخیص داده و ترافیک را به نمونه‌های سالم هدایت کند بدون دخالت انسان.

یک سیستم با دسترس‌پذیری ۹۹.۹۹۹٪ (five-nines) در طول یک سال تنها حدود ۵.۲۶ دقیقه از کار افتادگی مجاز دارد. دستیابی به این سطح نیازمend معماری دقیق و خودکارسازی فرآیندهای بازیابی است.

الگوهای طراحی مانند قطع‌کننده مدار (Circuit Breaker) برای جلوگیری از خطاهای زنجیره‌ای حیاتی هستند. وقتی یک سرویس به طور مکرر با خطا مواجه می‌شود، قطع‌کننده مدار به طور موقت تماس با آن سرویس را متوقف می‌کند و به آن فرصت بازیابی می‌دهد، در حالی که از بارگذاری بیش از حد سیستم با درخواست‌های ناموفق جلوگیری می‌کند.

متعادل‌سازی بار و پارتیشن‌بندی داده

متعادل‌سازی بار (Load Balancing) مکانیزمی برای توزیع ترافیک ورودی بین چندین سرور است تا از بارگذاری بیش از حد یک سرور جلوگیری شود و دسترس‌پذیری و پاسخ‌دهی سیستم بهبود یابد. این فرآیند در لایه‌های مختلف مدل OSI انجام می‌شود:

  • متعادل‌سازی بار لایه ۴ (Transport Layer): در این لایه، تصمیمات بر اساس آدرس IP و پورت گرفته می‌شود. متعادل‌کننده‌های بار لایه ۴ از محتوای بسته‌ها بی‌اطلاع هستند و صرفاً ترافیک شبکه را هدایت می‌کنند. این روش سریع و کارآمد است اما انعطاف‌پذیری کمتری دارد.

  • متعادل‌سازی بار لایه ۷ (Application Layer): این متعادل‌کننده‌ها می‌توانند محتوای پیام‌ها، مانند هدرهای HTTP یا کوکی‌ها را بررسی کنند. این به آنها اجازه می‌دهد تا تصمیمات مسیریابی هوشمندانه‌تری بگیرند، مانند هدایت درخواست‌ها بر اساس URL به سرورهای خاص (content-based routing) یا حفظ نشست کاربر روی یک سرور خاص (session persistence).

Lesson image

همانطور که ترافیک را بین سرورها توزیع می‌کنیم، باید داده‌ها را نیز بین چندین نود پایگاه داده توزیع کنیم. این فرآیند پارتیشن‌بندی داده (Data Partitioning) یا شاردینگ (Sharding) نامیده می‌شود. هدف، بهبود مقیاس‌پذیری و عملکرد با کاهش حجم داده‌ای است که هر نود باید مدیریت کند.

استراتژی‌های متداول شاردینگ عبارتند از:

  1. شاردینگ مبتنی بر محدوده (Range-Based Sharding): داده‌ها بر اساس محدوده‌ای از مقادیر یک کلید شارد (Shard Key) تقسیم می‌شوند. برای مثال، کاربران با نام خانوادگی A-F در شارد ۱، G-M در شارد ۲ و غیره.
  2. شاردینگ مبتنی بر هش (Hash-Based Sharding): مقدار کلید شارد به یک تابع هش داده می‌شود و نتیجه، شارد مقصد را تعیین می‌کند. این روش داده‌ها را به طور یکنواخت‌تری توزیع می‌کند اما کوئری‌های مبتنی بر محدوده را دشوار می‌سازد.
  3. شاردینگ مبتنی بر دایرکتوری (Directory-Based Sharding): یک جدول جستجو (lookup table) نگاشت بین کلیدها و شاردها را حفظ می‌کند. این روش انعطاف‌پذیری بالایی دارد اما خود جدول جستجو می‌تواند به یک نقطه گلوگاه (bottleneck) تبدیل شود.

برای آزمایش دانش خود در مورد این مفاهیم معماری، به کوئیز زیر پاسخ دهید.

Quiz Questions 1/6

کدام مشکل اصلی در معماری یکپارچه (Monolithic) با رشد سیستم به وجود می‌آید که معماری میکروسرویس سعی در حل آن دارد؟

Quiz Questions 2/6

یک سیستم بانکی آنلاین در هنگام قطعی شبکه (Network Partition) تصمیم می‌گیرد تراکنش‌های جدید را رد کند تا از عدم سازگاری داده‌ها جلوگیری کند. این سیستم کدام دو ویژگی از قضیه CAP را انتخاب کرده است؟

معماری سیستم‌های توزیع‌شده یک حوزه پویا و پر از چالش‌های مهندسی است. تسلط بر این مفاهیم، مرز بین ساختن یک برنامه کاربردی و یک پلتفرم مقیاس‌پذیر و قابل اعتماد در مقیاس جهانی را مشخص می‌کند.