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

من در حال کاوش در مورد پیچیدگی پرس و جو GraphQL، محدودیت عمق، و نحوه گنجاندن dataloader در NestJS برای سریعتر کردن API GraphQL خود بودم.
- فقط قبل از وارد شدن به جزئیات، باید آن را روشن کنم این یک مثال ساختگی است.
-
به روز رسانی: من همین الان این موضوع را دیدم
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 درصد افزایش عملکرد است. ممکن است کمی ناامید کننده به نظر برسد، اما اینطور به آن نگاه کنید:
- این یک مثال ساختگی است.
- تمام هزینههای ورودی/خروجی را که تا حدودی حذف میشوند، در نظر بگیرید.
- شما نیازی به پرداخت بیش از آنچه دارید ندارید (در مدل پرداخت پرداختی، نمونه پایگاه داده شما دائماً با درخواستهای جدید مواجه میشد).
مخزن
جایی که می توانید همه چیز را در مورد 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