ویرگول
ورودثبت نام
محمد علی پور
محمد علی پورSoftware Engineer
محمد علی پور
محمد علی پور
خواندن ۳ دقیقه·۸ ماه پیش

به دنبال یک راه‌حل… / نگاهی عمیق‌تر به الگوی معماری BFF در دنیای نرم‌افزار


نرم‌افزارها برخلاف سیستم‌های فیزیکی، ذاتاً پیچیده و غیرقابل‌پیش‌بینی هستند. شاید بتوان یک پل را با دقت میلی‌متری طراحی کرد، اما طراحی کامل و دقیق یک سیستم نرم‌افزاری بزرگ، آن هم قبل از پیاده‌سازی، تقریبا غیرممکن است.

همین موضوع باعث می‌شود طراحی اولیه‌ی نرم‌افزارها معمولاً همراه با چالش‌هایی باشد که تا زمان اجرا و استفاده واقعی، شناسایی نمی‌شوند. اما وقتی معماری پروژه به شکلی باشد که ایجاد تغییرات اساسی در آن بسیار دشوار یا پرهزینه باشد، توسعه‌دهنده‌ها چاره‌ای تغییرات سطحی ندارند و حل مسئله ، بدون تغییرات اساسی شکل میگیرد! این نقطه را میتوان همان بخشی دانست که پیچیدگی سیستم آنقدر زیاد میشود که تقریبا هیچ تغیری اساسی بدون هزینه نمی باشد !

یکی از راهکارهایی که در سال‌های اخیر برای مواجهه با چنین چالش‌هایی مطرح شده، الگوی Backends for Frontends (BFF) است. اما آیا این الگو همیشه بهترین گزینه است؟

در دومین اپیزود پادکست کدشناسی، دقیق‌تر به این موضوع پرداختم، اما در اینجا می‌خواهم خلاصه‌ای از آن را با شما به اشتراک بگذارم!

داستانی از SoundCloud: جرقه‌ی یک راه‌حل


سال ۲۰۱۲، شرکت SoundCloud با افزایش استفاده کاربران از اپلیکیشن‌های موبایل مواجه شد. در آن زمان، تمام بخش‌های پروژه (از اپلیکیشن‌های موبایل تا APIهای عمومی) از طریق یک API واحد مدیریت می‌شدند. نتیجه؟ افزایش شدید پیچیدگی و کاهش انعطاف‌پذیری.

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

در پاسخ به این چالش، ایده‌ی BFF متولد شد. لایه‌ای بین کلاینت و بک‌اند که می‌تواند تجربه‌ی کاربر را ساده کند، بدون اینکه فشار اضافه‌ای به کلاینت وارد شود.

تجربه‌ای واقعی از پیاده‌سازی BFF

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

تصمیم گرفتیم بخشی از پروژه را به عنوان یک سرویس مستقل دوباره بازنویسی کنیم. اما این سرویس باید با چندین منبع داده (سرویس‌های third-party، سرویس‌های قدیمی، و موقعیت جغرافیایی کاربران) تعامل می‌داشت. نیاز به لایه‌ای احساس می‌شد که تمام این تعامل‌ها را مدیریت و مشکلاتی را که ما برای نیازمندی‌های جدیدمان داشتیم مرتفع سازد !
BFF به ما این امکان را داد که:

  • برای نسخه وب، یک API سفارشی‌سازی‌شده بسازیم که رندر سمت سرور را بهینه کند.
  • وابستگی فرانت‌اند به سرویس‌های متعدد بک‌اند را کاهش دهیم.
  • فرایند توسعه و نگهداری را ساده‌تر و سریع‌تر کنیم.
  • عملکرد سیستم را با قابلیت‌هایی مثل caching بهبود ببخشیم.

آیا BFF همیشه راه‌حل مناسبی است؟

جواب کوتاه: نه.

با تمام مزایایی که دارد، BFF هم چالش‌های خاص خودش را دارد:

  • اگر نیازهای کلاینت‌ها بسیار مشابه باشند، شاید نیازی به این لایه‌ی اضافه نباشد و GraphQL کفایت کند.
  • اگر سیستم شما نیاز به حداقل تأخیر در پاسخ‌گویی دارد (مثلاً در اپ‌های استریم یا بازی‌های آنلاین)، BFF ممکن است به‌شرط بهینه‌سازی نشدن، گلوگاه ایجاد کند.
  • اضافه کردن یک لایه‌ی جدید، پیچیدگی و هزینه‌ی توسعه را افزایش می‌دهد—ویژگی‌ای که در MVPها یا پروژه‌های کوچک، نکته‌ی مثبتی نیست.

جمع‌بندی

اجرای BFF در پروژه‌ی ما آسان نبود. اما نتیجه ارزشش را داشت. توانستیم عملکرد و ساختار سیستم را بهبود بدهیم، بدون اینکه کاربران چیزی متوجه شوند و شاید این، یکی از نشانه‌های یک راه‌حل درست باشد.

اگر فقط به دنبال "پیاده‌سازی" بدون درک "مسئله" باشیم، شاید آنچه امروز به نظر راه‌حل می‌رسد، فردا خودش تبدیل به مشکل جدیدی شود.

🎧 اگر دوست دارید این ماجرا را با جزئیات بیشتر و تجربه‌های عمیق‌تر بشنوید، حتما به اپیزود دوم پادکست کدشناسی با عنوان «به دنبال یک راه‌حل…» گوش کنید.

تیم محصولسمت سرورمعماری میکروسرویس
۱
۰
محمد علی پور
محمد علی پور
Software Engineer
شاید از این پست‌ها خوشتان بیاید