Saeid Noormohammadi
Saeid Noormohammadi
خواندن ۳ دقیقه·۳ ماه پیش

Backend for Frontend Pattern (BFF)

پترن Backend for Frontend برای بهبود نحوه ارتباط بین frontend و backend کاربرد دارد. در این پترن برای هر نوع کلاینت مانند Web, Mobile و... یک لایه بک اندی جدا طراحی می کنیم. به عبارت دیگر یک سرویس بهینه شده با توجه به نیازهای خاص هر کلاینت ایجاد می کنیم تا تعامل بهتری با یکدیگر داشته و پیچیدگی های سمت کلاینت را کاهش بدهیم. در این روش هر کلاینت داده هایی را که نیاز دارد با فرمت مناسب خود دریافت می کند.

برای مثال سرویس پخش موزیک spotify را در نظر بگیرید. این سرویس دارای پلتفرم های مختلفی مانند وب, موبایل, دسکتاپ و دستگاه های هوشمند می باشد. حال کاربر در نسخه های مختلف درخواست خود برای جستجو موسیقی با عنوان "happy" ارسال می کند:
موبایل: درخواست به BFF مربوط به موبایل مثل api.mobile.spotify. com ارسال می شود. سپس سرویس BFF موبایل برای بازگرداندن پاسخ اطلاعاتی مثل اطلاعات کاربر, دسترسی, علاقه و... را از سرویس های مختلف جمع آوری کرده و با بهینه کردن آن با توجه به نیازها پاسخ را به کلاینت بر می گرداند(نام خواننده, تصویر و زمان).
وب: درخواست به BFF مربوط به وب مثل api.web.spotify. com ارسال می شود. سپس در نسخه وب اطلاعات بیشتری مانند اطلاعت کامل خواننده, آلبوم ها و کنسرت ها باز گردانده می شود.
دستگاه های هوشمند مانند اسپیکر: فقط اطلاعات مربوط به پخش باز گردانده می شود.

نکته: این فقط یک مثال فرضی است و لزوما همان چیزی نیست که Spotify استفاده می کند.

ویژگی ها
ای پی آی های سفارشی (Custom APIs): هر نوع کلاینتی که داریم (مانند web, mobile, desktop) و... API های مخصوص خود را دارند.
ساده تر شدن فرانت اند (Simplified Frontend Logic): در اینجا به جای اینکه فرانت اند اطلاعات مورد نظر خود را در چندین درخواست دریافت کند در یک درخواست دریافت می کند. به زبان دیگر پردازش داده ها به BFF منتقل می شود.
بهبود امنیت (Enhanced Security): با توجه به تفکیک می توانیم کنترل بیشتری بر روی داده های هر کلاینت داشته باشیم و در صورت نیاز لایه های امنیتی را بر روی هرکدام از آن ها اضافه کنیم.
مقیاس پذیری بهتر (Better Scaling): با توجه به تفکیک در زمان نیاز می توان لایه مربوط به کلاینت مورد نظر را تغییر داد. (برای مثال فقط برای موبایل)
عملکرد بهتر (Better Perfromance): با توجه به اینکه هر نوع کلاینت فقط داده های مورد نیاز خود را دریافت می کند حجم داده ها کاهش پیدا کرده و عملکرد بهبود پیدا می کند.

چالش ها
هزینه های بالا نگهداری (Higher Maintenance Costs): با توجه به داشتن لایه های اختصاصی هزینه های منابع و نیرو انسانی برای توسعه و نگهداری BFF های مختلف افزایش پیدا می کند.
پیچیدگی (Complexity): طراحی و پیاده سازی چندین سرویس جداگانه که هرکدام نیاز به توسعه و نگهداری جدا دارد باعث افزایش پیچیدگی های سیستم می شود.
تکرار منطق (Duplication of Logic): با توجه به اینکه امکان دارد بسیاری از موارد در BFF های مختلف مشابه باشند احتمالا نیاز به تکرار زیاد با کمی تغییر داریم.
بی نظمی در نسخه ها (Version Chaos): در BFF ها مدیریت وابستگی ها و نسخه ها یکی مهم ترین چالش ها می باشد. برای مثال ممکن است یک API اصلی در یکی از سرویس ها تغییر کند که نیاز به بروزرسانی در همه ی سرویس ها دارد!

در پایان, می توان گفت که این پترن مانند یک شمشیر دو لبه می باشد که در صورت تصمیم به استفاده اشتباه می تواند هزینه ها را به شکل عجیبی افزایش دهد. توجه داشته باشید که معمولا در پروژه های پیچیده و بزرگ که دارای کلاینت های مختلف با نیازهای مختلف می باشد استفاده می شود.

distributed systemsystem design
شاید از این پست‌ها خوشتان بیاید