برنامه نویسی

پیچیدگی پرس و جو GraphQL + NestJS + Dataloader

من در حال کاوش در مورد پیچیدگی پرس و جو GraphQL، محدودیت عمق، و نحوه گنجاندن dataloader در NestJS برای سریعتر کردن API GraphQL خود بودم.

سر به بالا

  1. فقط قبل از وارد شدن به جزئیات، باید آن را روشن کنم این یک مثال ساختگی است.
  2. به روز رسانی: من همین الان این موضوع را دیدم graphql-depth-limit-ts در مورد مشخصات اتصال برای صفحه بندی. راستش من اصلا به این موضوع توجه نکردم 😅. بنابراین در حال حاضر فکر می‌کنم پیاده‌سازی من می‌تواند برای پوشش این مورد نیز تقویت شود.

وضعیت پایگاه داده

  • نسخه 17 PostgreSQL داکر شده.
  • من حدود 1000 کاربر دارم.
  • هر کاربر حدود 100 پست دارد.

حل کننده

وقتی پرس و جوی زیر را در حل کننده برای آن اجرا می کنید، فقط 5 پست دریافت می کنم getPosts:

{
  getPosts {
    id
    author {
      id
      posts {
        id
      }
    }
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اما در posts حل من تصمیم گرفتم همه پست های آنها (100) را واکشی کنم. و اینجاست که گلوگاه است.

آمار قبل از Dataloader

داشت حرف میزد تا 5.5 ثانیه برای بازیابی داده ها و خیلی بزرگ بود همانطور که ممکن است حدس بزنید، من استفاده می کردم @ResolveField و ارسال جداگانه SELECT دستور به پایگاه داده زیربنایی من.

آمار پس از Dataloader

اکنون همان مجموعه داده را در آن واکشی می کند ~ 3.7 ثانیه. 32 درصد افزایش عملکرد است. ممکن است کمی ناامید کننده به نظر برسد، اما اینطور به آن نگاه کنید:

  1. این یک مثال ساختگی است.
  2. تمام هزینه‌های ورودی/خروجی را که تا حدودی حذف می‌شوند، در نظر بگیرید.
  3. شما نیازی به پرداخت بیش از آنچه دارید ندارید (در مدل پرداخت پرداختی، نمونه پایگاه داده شما دائماً با درخواست‌های جدید مواجه می‌شد).

مخزن

جایی که می توانید همه چیز را در مورد GraphQL و پیچیدگی های آن بیاموزید

آنجا برو برای: apps/dataloader-example. BTW در این مخزن می توانید اجرای من از تحلیل هزینه پرس و جو استاتیک را مشاهده کنید که می توانید در اینجا بیشتر در مورد آن بیاموزید. بخشی که من به ویژه به آن افتخار می کنم این است که عمق یک میدان را در پیچیدگی کلی یک میدان گنجانده ام (برای نگاهی به زمینه به این موضوع).


اگر این به شما کمک کرد که برای این پست به من یک ستاره در مخزن GitHub من بدهید :).


دنبالم کن:

اینستاگرام: https://www.instagram.com/node.js.developers.kh/
فیس بوک: https://www.facebook.com/kasirbarati
X: https://x.com/kasir_barati
یوتیوب: https://www.youtube.com/@kasir-barati
گیت هاب: https://github.com/kasir-barati/
توسعه دهنده: https://dev.to/kasir-barati
لینکدین: https://linkedin.com/in/kasir-barati

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا