Skip to content

فصل ۲ — تشخیص وابستگی در معماری نرم‌افزار

خلاصهٔ تحلیلی — این متن بازنویسی تحلیلیِ فصل است، نه ترجمهٔ واژه‌به‌واژه.

مسئله و زمینه

توصیهٔ «سیستم را loosely coupled کنید» به‌تنهایی راهنما نیست. اگر هر سرویس را بیش‌ازحد خرد کنیم، تراکنش، هماهنگی و جریان خطا دشوار می‌شود؛ اگر آن‌ها را درشت نگه داریم، استقلال استقرار و مقیاس‌پذیری از دست می‌رود. وابستگی ذاتاً بد نیست: مقدار، محل و نوع آن تعیین می‌کند کدام تغییر‌ها پرخطر یا گران‌اند.

فصل یک روش ساده برای تحلیل ارائه می‌کند: ابتدا اجزای درهم‌تنیده را پیدا کنید، سپس نوع وابستگی‌شان را مشخص کنید و در نهایت اثر تغییر را بسنجید. این کار، پیش‌نیاز تعیین اندازهٔ سرویس و شیوهٔ ارتباط است.

مفاهیم و الگوهای مرکزی

کوانتوم معماری

کوانتوم معماری واحدی است که باید بتوان آن را مستقل مستقر کرد، از نظر وظیفه همبستگی بالایی دارد، درونش وابستگی ایستای بالایی وجود دارد و در زمان اجرا با سایر واحدها از طریق وابستگی پویا وارد workflow می‌شود. این اصطلاح، زبان مشترکی برای معمار، توسعه‌دهنده و عملیات می‌سازد: مرز رفتار، استقرار و نیازهای عملیاتی را هم‌زمان نشان می‌دهد.

یک microservice فقط زمانی واقعاً کوانتوم مستقل است که وابستگی‌های لازم برای راه‌اندازی‌اش نیز در همان مرز قابل تأمین باشند. اشتراک یک پایگاه‌داده، broker ضروری، UI سخت‌وابسته یا هر نقطهٔ مشترکِ لازم برای کارکرد می‌تواند چند سرویس ظاهراً جدا را به یک کوانتوم تبدیل کند.

وابستگی ایستا در برابر پویا

  • وابستگی ایستا: چگونگی سیم‌کشی و bootstrapping؛ شامل کتابخانه‌ها، runtime، datastore، تنظیمات عملیاتی، broker و قراردادهای لازم برای اجرای سرویس است. پرسش مفید: «برای بالا آوردن این سرویس در محیطی مشابه تولید، چه چیزهایی باید حاضر باشند؟»
  • وابستگی پویا: آنچه در زمان اجرا میان کوانتوم‌ها رخ می‌دهد؛ مثلاً فراخوانی REST/gRPC یا ارسال پیام. این وابستگی با مشاهده‌پذیری و پایش پیوسته بهتر دیده می‌شود.

این جداسازی مهم است زیرا سرویس‌های ایستایی‌مستقل می‌توانند در هنگام فراخوانی همگام، موقتاً در کارایی، ظرفیت و قابلیت اطمینان به هم گره بخورند.

سه‌گانهٔ coupling پویا

تصمیم‌های ارتباطی سه محور هم‌وابسته دارند:

  1. ارتباط: همگام، که فراخواننده منتظر پاسخ می‌ماند، یا ناهمگام، که پیام را می‌سپارد و ادامه می‌دهد.
  2. سازگاری: اتمی و همه‌یا‌هیچ، یا سازگاری نهایی با پذیرش فاصلهٔ زمانی.
  3. هماهنگی: orchestration با یک هماهنگ‌کنندهٔ صریح، یا choreography که سرویس‌ها با رخدادها مسئولیت هماهنگی را پخش می‌کنند.

انتخاب روی یک محور، بقیه را جابه‌جا می‌کند: سازگاری اتمی معمولاً با ارتباط همگام و میانجی‌گری آسان‌تر است؛ مقیاس و کشسانی بیشتر غالباً با پیام‌رسانی ناهمگام و سازگاری نهایی سازگارترند. نام‌های الگوهای saga در فصل، برچسبی برای ترکیب این سه بُعدند، نه نسخه‌ای که پیش از فهم نیاز انتخاب شود.

مصالحه‌ها

پایگاه‌دادهٔ مشترک، مهاجرت اولیه را آسان می‌کند اما مرز استقرار را مشترک نگه می‌دارد؛ در نتیجه تغییر schema چند سرویس را هم‌زمان تحت تأثیر می‌گذارد. ارتباط همگام، مسیر کنترل و پاسخ فوری را ساده‌تر می‌کند اما latency و خرابی را زنجیره‌ای می‌سازد. ارتباط ناهمگام جذب نوسان بار و استقلال عملیاتی بهتری می‌دهد، ولی نیازمند طراحی retry، idempotency، مشاهده‌پذیری و مدل سازگاری روشن است.

حتی UI نیز بی‌طرف نیست: یک رابط که برای پاسخ‌گویی باید همهٔ backendها را هم‌زمان داشته باشد، استقلال واقعی سرویس‌ها را کاهش می‌دهد. micro-frontend و تعامل رخدادمحور فقط هنگامی کمک می‌کنند که وابستگی‌های تجربهٔ کاربر واقعاً قابل تفکیک باشند.

راهنمای عملی

  1. برای هر سرویس، نمودار bootstrap بسازید: داده، broker، کتابخانه، تنظیمات، platform و UIهای لازم را ثبت کنید.
  2. نمودار فراخوانی runtime را از tracing و log تولید کنید؛ به دیاگرام کد یا استقرار اکتفا نکنید.
  3. هر workflow مهم را روی سه محور ارتباط/سازگاری/هماهنگی صورت‌بندی کنید و نیازهای غیرقابل‌مذاکره را مشخص کنید.
  4. پیش از خردکردن سرویس، بپرسید آیا اجزای جدید هنوز باید با هم deploy شوند، در ترتیب خاصی منتشر شوند یا به یک schema مشترک تغییر کنند؛ اگر پاسخ مثبت است، مرز پیشنهادی واقعی نیست.
  5. کیفیت‌های معماری را در سطح کوانتوم اندازه بگیرید، نه صرفاً در سطح کل سامانه؛ ممکن است فقط یک جریان نیازمند کشسانی ده‌برابری باشد.

نکات کلیدی فصل

  • coupling را باید به اثر تغییر تعریف کرد، نه به شمار APIها.
  • static coupling و dynamic coupling دو نمای متفاوت‌اند و هر دو برای تحلیل خطر لازم‌اند.
  • سرویس‌های جدا با datastore یا UI مشترک ممکن است یک کوانتوم معماری باشند.
  • اندازهٔ سرویس و الگوی ارتباط، یک تصمیم چندبعدی است؛ انتخاب یک‌طرفه به بدهی توزیع‌شده منجر می‌شود.

یادداشت مترجم

  • «کوانتوم معماری» برای architecture quantum به‌کار رفته و جمع آن «کوانتوم‌ها» آمده است.
  • واژه‌های orchestration و choreography به‌دلیل کاربرد تثبیت‌شده‌شان حفظ شده‌اند؛ توضیح فارسی نقش هماهنگی آن‌ها را بیان می‌کند.