در دنیای امروزی ما همواره در حال تغییر، استخراج و تبادل داده با یکدیگر و یا با سرویسهای مختلف هستیم. برای رسیدن به این مقصود، سرویسهای مختلفی باید با یکدیگر تعامل کنند. انواع مختلفی از تکنیکهای ارتباطی مانند WebSocket، gRPC، AMQP، Kafka، Nats و… وجود دارد. در این پست ما به مقایسه GraphQL و REST میپردازیم.
الگوی درخواست-پاسخ
قبل از ورود به جزییات و بررسی تفاوتهای REST API و GraphQL، باید مفهوم الگوی درخواست-پاسخ را بدانیم. REST API و GraphQL دو راهکار مبتنی بر الگوی درخواست-پاسخ هستند. در این الگو، یک سرویس(کلاینت) یک درخواست را ارسال کرده و منتظر پاسخ از یک یا چند میکروسرویس میماند. فرایندهای دیگر کلاینت تا زمان دریافت پاسخ بلاک شده و کانال ارتباطی باز میماند. بیشتر راهکارهای مبتنی بر این الگو از پروتکلهایی نظیر HTTP در کنار فرمتهای داده مختلف و تکنیکهای تبادل داده برای تعامل استفاده میکنند.
نقاط قوت و ضعف
در پستهای قبلی در مورد GrapghQL و REST API توضیح دادهایم که میتوانید آنها را مطالعه کنید. در ادامه مزایا و معایب هر کدام را به صورت خلاصه مرور کرده و در آخر این دو را با هم مقایسه میکنیم.
نقاط قوت REST API
- معماری ساده و پیادهسازی آسان
- منعطف در انتخاب زبان برنامهنویسی و فریمورک
- بدون وضعیت
- پشتیبانی از انواع محتواها (JSON، CSV، XML)
- پشتیبانی از کش کردن
- تعاملپذیر
نقاط ضعف REST API
- عدم پشتیبانی از الگوهای ارتباطی دیگر غیر از مدل درخواست-پاسخ
- نیاز به اطلاع کلاینت از URLها
- سختی در فچ کردن چندین ریسورس در یک درخواست
- عدم وجود معیارهای امنیتی در خود معماری
- کارآمدی کمتر نسبت به سایر پروتکلها به دلیل امکان افزایش سریع حجم دادهها
- چالش در حفظ قابلیت پشتیبانی از نسخههای پیشین همگام با رشد API
نقاط قوت GraphQL
- امکان فچ کردن تنها داده مورد نیاز
- امکان کوئری داده از چندین ریسورس
- امکان بهروزرسانی لحظهای
- وجود امکانات بیشتر و بهتر برای کاربردپذیری و مستندسازی
نقاط ضعف GraphQL
- امکان افزایش پیچیدگی در معماری
- پیادهسازی پیچیدهتر نسبت به REST API
- امکان بروز مشکلات عملکردی در حجم داده بالا
- نیاز به زمان زیاد برای یادگیری مفاهیم و سینتکسها
مقایسه GraphQL و REST
تفاوتهای اصلی بین REST و GraphQL را میتوان به شکل زیر بیان کرد:
فچ کردن داده: در REST کلاینت باید برای دریافت دادههای مختلف درخواستهای جداگانه ارسال کند. این امر ممکن است باعث بروز مشکل فچ بیش از حد (دریافت دادههای غیرضروری) یا فچ ناکافی (عدم دریافت دادههای ضروری) شود. اما در GraphQL کلاینت میتواند دادههای درخواستی را مشخص کرده و سرور تنها همان دادهها را ارسال میکند. به این ترتیب درخواستهای کمتری به سرور ارسال شده و عملکرد بهتر میشود.
ساختار URL: در REST API هر اندپوینت یک URL دارد و کلاینت باید URL مد نظر را بداند تا به داده دسترسی پیدا کند. در GrpahQL اما تنها یک اندپوینت وجود دارد و کلاینت با کوئری داده درخواستی خود را مشخص میکند.
مدلسازی داده: در REST API سرور مدل داده و اندپوینتهایی که معرف داده هستند را مشخص میکند. در GraphQL کلاینت مدل داده را مشخص کرده و سرور بر اساس کوئری کلاینت داده را ارائه میکند.
کش کردن: در یک REST API کلاینت میتواند پاسخهای دریافتی از اندپوینتهای مشخصشده را کش کرده و از ایجاد درخواستهای متعدد به سرور جلوگیری کند. در GraphQL کلاینت قادر است یک کوئری مشخص که حاوی دادههای چندین اندپوینت است را کش کند.
اعتبارسنجی اسکیما: در GraphQL سرور یک اسکیما حاوی مدل داده و عملیاتهایی که میتوان روی آن داده انجام داد را ارائه میکند. این موضوع به مستندسازی بهتر و جلوگیری از بروز خطا کمک میکند. اما در REST هیچ استانداردی برای اعتبارسنجی اسکیما وجود ندارد.
بالاخره GraphQL یا REST؟
REST و GraphQL هر دو متدهای پذیرفتهشده برای انتقال داده و تعامل هستند. REST API یک راهکار محبوب است که در بسیاری از اپلیکیشنها کاربرد دارد و GraphQL نیز یک راهکار جدیدتر با انعطاف و کارآمدی بیشتر در انتقال داده است. انتخاب یکی از این دو مدل بستگی به نیازمندیهای اپلیکیشن، پیچیدگی مدل داده و عملکرد اپلیکیشن دارد. به طور کلی اگر حجم دادههای شما در آینده قابل پیشبینی افزایش چشمگیری ندارد و یا یک اپلیکیشن ساده با تعداد محدود اندپوینت دارید، REST جوابگوی نیازهای شما خواهد بود. اما اگر اپلیکیشن شما پیچیده است یا رشد قابل توجهی برای آن پیشبینی شده، GraphQL گزینه مناسبتری است.