Falcor چیست؟

در مقاله‌ی GraphQl با Web API آشنا شدیم. Web API‌ها رابط‌های نرم افزاری هستند که ارتباط بین نرم افزار‌های مختلف در بستر وب را امکان پذیر می‌کنند. با استفاده از Web APIها می‌توان یک نرم‌افزار را به یک سرور سایت یا دو سرور سایت را به یکدیگر متصل کرد. همچنین آموختیم که روش‌های مختلفی برای پیاده سازی Web API‌ها وجود دارد و این روش‌ها با استفاده از HTTP، در خواستی را برای سرور ارسال می‌کنند و پاسخ این درخواست را به صورت یکی از دو استاندارد XML یا JSON دریافت می‌کنند. در این مقاله می‌خواهیم با Falcor که یکی از ابزارهای مفید این حوزه هست، آشنا شویم.

Falcor چیست؟

Falcor یک کتابخانه‌ی متن باز رایگان می‌باشد که توسط نتفلیکس (Netflix) منتشر شده ‌است. Falcor به توسعه‌دهندگان این امکان را می‌دهد تا داده‌های خود را به صورت یک شی JSON در سرور خود مدل کنند. اگر با توسعه‌ی برنامه سمت سرور آشنا باشید، می‌دانید که مدل کردن اشیا به صورت JSON بسیار پرکاربرد است. ساختار JSON با عملیات‌های جاوا اسکریپت مانند Get، Set و Call سازگار است و فقط کافی است داده و API را بشناسیم.  لذا Falcor به‌عنوان واسطه‌ای است که برای بهینه‌سازی ارتباط بین لایه‌های یک برنامه‌ی جدید یا موجود استفاده می‌شود. در شکل زیر این ارتباط نشان داده شده است:

Falcor چیست؟

تفاوت GraphQl با Falcor چیست؟

هدف Falcor و GraphQl یک چیز است و آن، رفع مشکل سختی کار با ساختار داده در کار با Web API است. با وجود همه API‌های RESTful، واکشی داده‌ها از سرور بسیار پرهزینه و پیچیده است، تأخیر زیاد است و احتمال اینکه داده‌های بیشتر از حد نیاز را دریافت کنید یا بفرستید وجود دارد. این جایی است که GraphQL و Falcor برای نجات می‌رسند.

یادگیری Falcor راحت‌تر و سریعتر از GraphQL است و مواردی مانند Caching و Query-merging را پشتیبانی می‌کند. با این وجود به اندازه‌ی GraphQL قدرتمند نیست و برخلاف GraphQL تنها از جاوا اسکریپت پشتیبانی می‌کند. در نهایت برای استفاده، هر دوی GraphQL و Falcor راه حل‌های خوبی هستند و اینکه کدام یک بهتر است به برنامه بستگی دارد. اگر  استفاده از JSON باعث بالا رفتن سرعت و کیفیت کار می‌شود و امکانات بیشتری نیاز نیست،احتمالاً باید Falcor را انتخاب کرد. اگر حفظ انعطاف‌پذیری و استفاده از ویژگی‌های قدرتمندتر مهم هست و قرار هست از زبان‌های دیگری غیر از JavaScript استفاده کرد، GraphQL به احتمال زیاد بهترین انتخاب است.

چرا از Falcor استفاده می‌کنیم؟

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

مشکل دیگری که Falcor حل می‌کند این است که معمولا اشیا، داده‌ها را به‌صورت سلسله مراتبی و در ساختار درخت نشان می‌دهند، در حالی که داده‌ها اغلب به صورت نمودار است. به عبارت دیگر، داده‌های یک برنامه همیشه رابطه‌ای جدی با والدین و فرزند ندارد و نیاز به ساختار درختی نیست، بلکه تنها به بسیاری از داده‌های دیگر مرتبط است. ساختار JSON مورد استفاده در Falcor این ارتباط بین داده‌ها را بهتر نشان می‌دهد.

چه کسانی نباید سراغ Falcor بروند؟

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

سازوکار Falcor چیست؟

برنامه‌های سمت کلاینت از سرور تقاضای یک JSON را دارند. سرور با زیر مجموعه ای از اشیای JSON پاسخ می‌دهد و مقدار بازگشتی تنها شامل آن مقادیر است. نمونه‌ای از این درخواست در کد زیر آورده شده است:

/model.json?paths=["user.name", "user.surname", "user.address"]
GET /model.json?paths=["user.name", "user.surname", "user.address"]
{
  user: {
    name: "Frank",
    surname: "Underwood",
    address: "1600 Pennsylvania Avenue, Washington, DC"
  }
}

از طرفی برای بهبود کارایی شبکه و سازوکار بین درخواست‌های ارسالی کلاینت و سرور نیاز هست تا تدابیری اندیشیده شود. مثلا برگرداندن همه‌ی داده‌ها تحت یک نشانی اینترنتی به کلاینت اجازه می‌دهد تا تمام داده‌هایی که در یک شبکه به آن‌ها نیاز دارد را به‌صورت یکجا از سرور درخواست کند. این می‌تواند باعث شود تا درخواست‌های کوچک متوالی کاهش یافته و در نتیجه تاخیر نیز کمتر شود. در طی این عملیات نیاز هست تا سرور حالت خود را حفظ کند یا اصطلاحا Stateless بماند.

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

var router = new Router([
  {
    // matches user.name or user.surname or user.address
    route: "user['name','surname','address']",
    get(pathSet) {
      // pathSet could be ["user", ["name"]], ["user", ["name", "surname"]], ["user", ["surname", "address"]] and so on...
      userService.
        getUser(getUserID()).
        then(function(user) {
          return pathSet[1].
            map(function(userKey) {
              // return response for each individual requested path
              return {
                path: ["user", userKey],
                value: user[userKey]
              };
            });
         });
    }
  }
]);
شکل زیر این درخواست را بهتر نشان می‌دهد:
Falcor چیست؟

ساختار داده در API

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

اگر داده‌های خود را می‌شناسید، API را می‌شناسید.

Falcor به توسعه‌دهنده این امکان را می‌دهد که با داده‌های از راه دور مانند داده‌های محلی کار کند (با استفاده از JS Path و عملیات جاوا اسکریپت). تفاوت اصلی این است که API کلاینت Falcor همزمان است.

فرض کنیم از Falcor استفاده نکنیم. کد زیر نمونه‌ای از بازیابی به‌طور مستقیم از یک شی JSON به حافظه با استفاده از یک مسیر ساده‌ی جاوا اسکریپت (JS Path) می‌باشد:

var model = {
  user: {
    name: "Frank",
    surname: "Underwood",
    address: "1600 Pennsylvania Avenue, Washington, DC"
  }
};
// prints "Underwood"
console.log(model.user.surname);

برنامه‌هایی که از Falcor استفاده می‌کنند به طور مستقیم با داده‌های JSON کار نمی‌کنند. در عوض آن‌ها با داده‌های JSON به طور غیر مستقیم و با استفاده از مدل Falcor کار می‌کنند. این مدل به توسعه‌دهنده اجازه می‌دهد تا از اصطلاحات آشنا مثل JS Pathها و عملیات جاوا اسکریپت برای کار با داده‌های خود استفاده کند. تفاوت اصلی بین کار با داده‌های JSON به طور مستقیم و استفاده از یک مدل Falcor این است که مدل Falcor یک API غیر همزمان دارد. برای توضیح بهتر کد بالا را با استفاده از یک مدل Falcor به جای کار کردن به‌طور مستقیم بازنویسی می‌کنیم:

var model = new falcor.Model({
  cache: {
    user: {
      name: "Frank",
      surname: "Underwood",
      address: "1600 Pennsylvania Avenue, Washington, DC"
    }
  }
});
// prints "Underwood" eventually
model.
  getValue("user.surname").
  then(function(surname) {
    console.log(surname);
  });

توجه داشته باشید که از همان مسیر جاوا اسکریپت قبلی به منظور بازیابی داده‌ها استفاده کردیم. تنها تفاوت این است که زمانی که نتیجه بازگردد به یک callback داده می‌شود.

مزیت کار کردن با داده‌ها با استفاده از API غیر همزمان Falcor این است که می‌توان داده‌ها را در هر جایی روی شبکه جا‌به‌جا کرد بدون اینکه تغییر کد سمت کلاینت بر داده‌ها تاثیر بگذارد. با استفاده از مدل Falcor، تنها چند خط کد تغییر می‌کند تا با داده‌های از راه دور کار کنیم:

var model = new falcor.Model({
  source: new falcor.HttpDataSource("/model.json")
});
// prints "Underwood" eventually
model.
  getValue("user.surname").
  then(function(surname) {
    console.log(surname);
  });

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

Falcor چیست؟

اتصال به سیستم ابری داده

در اغلب سیستم‌های MVC، کنترل‌کننده‌ها مسئول بازیابی داده‌ها از سرور هستند. یک الگو برای برنامه‌های کاربردی با Falcor، استفاده از شِما (view) برای بازیابی داده‌ها مستقیما از مدل Falcor است. این الگو گاهی به عنوان Async MVC نامیده می‌شود؛ زیرا ارتباط بین شِما و مدل غیرهمزمان است. علاوه بر جداسازی کنترل‌کننده‌ها و شِماها، Async MVC می‌تواند کارایی درخواست شبکه را بهبود بخشد. هنگامی که یک شِما اطلاعات را دریافت می‌کند، تنها داده‌های مورد نیاز برای نمایش آن استفاده می‌شود.

جمع بندی:

بهترین روش برای توسعه وب طی چند سال گذشته به طور قابل توجهی تغییر کرده است. در حالی که فقط چند سال پیش بیشتر وب سایت ‌ها در سرور قرار گرفته بودند و عملیات از سمت کلاینت بسیار اندک بود؛ مثلا در یک برنامه Ruby ​​مدل، شِما و کنترل‌کننده‌ همه روی سرور قرار می‌گرفتند. اما امروزه برنامه‌های تک صفحه‌ای رو به افزایش است و در برنامه‌های مدرن جاوا اسکریپت این‌گونه نیست. Falcor به‌عنوان یک رابط برای تسهیل عملیات‌های بین کلاینت و سرور است. در مقاله‌ی Falcor چیست؟ در مورد مزایای استفاده از Falcor و سازوکار آن صحبت کردیم. اگر در گذشته با Falcor کار کرده‌اید، تجربه‌ی خود را با ما و سایر کاربران به اشتراک بگذارید.

 
ارسال دیدگاه
ما همه سوالات و دیدگاه ها رو می خونیم و پاسخ میدیم
۴ دیدگاه
شایا موزیک ۲۰ اردیبهشت ۱۳۹۹، ۱۲:۵۲
مطلب خوب و اموزنده ای بود تشکر
نازنین کریمی مقدم ۲۰ اردیبهشت ۱۳۹۹، ۱۹:۲۸
سلام. ممنون که با همراه هستید :)
فاطمه افشار ۰۳ اردیبهشت ۱۳۹۹، ۰۹:۰۷
خیلی خوب بود👌
نازنین کریمی مقدم ۰۵ اردیبهشت ۱۳۹۹، ۲۲:۲۱
سلام. خوشحالیم که این مقاله براتون مفید بوده 🙂