รูปแบบ dataLoader ช่วยลดปัญหาเกี่ยวกับ `เมื่อ loaded ()` ใน graphQl โดยการแก้ไขปัญหาการสืบค้น N+1 ทั่วไปและเพิ่มประสิทธิภาพการดึงข้อมูลผ่านกลไกการแบทช์และการแคช
ปัญหาเกี่ยวกับ `whenloaded ()` ใน graphql
ใน GraphQL ผู้แก้ไขมักจะต้องดึงข้อมูลที่เกี่ยวข้องสำหรับหลาย ๆ เอนทิตี หากไม่มีการปรับให้เหมาะสมสิ่งนี้สามารถนำไปสู่ปัญหา N+1 ซึ่งการสืบค้นสำหรับรายการ N ส่งผลให้เกิดการร้องขอฐานข้อมูลเพิ่มเติม N (รวมถึงปัญหาเริ่มต้น) ทำให้เกิดการลดลงอย่างมีประสิทธิภาพ เมธอด `whenloaded ()` ซึ่งรอให้โหลดข้อมูลที่เกี่ยวข้องสามารถทำให้รุนแรงขึ้นได้โดยการเรียกใช้ข้อมูลหลายรายการแยกต่างหากสำหรับแต่ละรายการซึ่งนำไปสู่การสืบค้นฐานข้อมูลที่ไม่มีประสิทธิภาพและซ้ำซาก
รูปแบบ dataloader ช่วยได้อย่างไร
1. คำขอแบทช์
รูปแบบ Dataloader แบทช์ข้อมูลข้อมูลหลายรายการเป็นแบบสอบถามเดียว แทนที่จะดึงข้อมูลที่เกี่ยวข้องแบบทีละหนึ่งเป็น `whenloaded ()` อาจทำ DataLoader รวบรวมคีย์ทั้งหมดที่ร้องขอในระหว่างเห็บเดียวของลูปเหตุการณ์และส่งคำขอหนึ่งชุดไปยังฐานข้อมูล สิ่งนี้จะช่วยลดจำนวนการสืบค้นอย่างมากปรับปรุงประสิทธิภาพ ตัวอย่างเช่นแทนที่จะเป็นแบบสอบถามแยกต่างหาก 16 รายการ Dataloader สามารถลดสิ่งนี้เป็น 4 ข้อสอบแบทช์แต่ละรายการการดึงข้อมูลสำหรับหลายปุ่มในครั้งเดียว [2] [6] [8]
2. ผลการแคช
Dataloader แคชผลลัพธ์ของข้อมูลที่ดึงมาภายในขอบเขตของคำขอเดียว หากมีการร้องขอข้อมูลเดียวกันหลายครั้งในระหว่างการแก้ปัญหาของแบบสอบถาม GraphQL Dataloader จะส่งคืนผลลัพธ์ที่แคชแทนการสืบค้นฐานข้อมูลอีกครั้ง การซ้ำซ้อนนี้ป้องกันการร้องขอซ้ำซ้อนที่ `เมื่อโหลด ()` อาจทำให้เกิด [1] [3] [6]
3. ต่ออินสแตนซ์ dataloader ตามต้องการ
เพื่อหลีกเลี่ยงการรั่วไหลของข้อมูลและตรวจสอบให้แน่ใจว่าการแคชที่ถูกต้องตามบริบทของผู้ใช้/คำขออินสแตนซ์ Dataloader ใหม่จะถูกสร้างขึ้นสำหรับคำขอ GraphQL แต่ละครั้ง วิธีการนี้ยังคงความโดดเดี่ยวและความปลอดภัยในขณะที่ยังคงได้รับประโยชน์จากการแบทช์และการแคชภายในคำขอนั้น [3]
4. การรวมเข้ากับ GraphQL Resolvers
โดยการรวม Dataloader เข้ากับ GraphQL Resolver แต่ละตัวแก้ไขเรียกใช้ `load` บน dataloader แทนการสืบค้นฐานข้อมูลโดยตรงหรืออาศัย` `whenloaded ()` สิ่งนี้จะเปลี่ยนความรับผิดชอบของการดึงข้อมูลที่มีประสิทธิภาพไปยัง Dataloader ซึ่งจัดการแบทช์และแคชอย่างโปร่งใส [1] [3] [6]
สรุป
รูปแบบ dataLoader ช่วยลดความไร้ประสิทธิภาพของ `` `` เมื่อ () `ใน graphql โดย:
- การรวบรวมการร้องขอข้อมูลหลายข้อมูลลงในแบบสอบถามแบบแบตช์เดี่ยวลดจำนวนการเดินทางไปกลับฐานข้อมูล
- การแคชข้อมูลดึงข้อมูลเพื่อป้องกันการสืบค้นซ้ำภายในคำขอเดียวกัน
- การสร้างอินสแตนซ์ dataloader แบบแยกต่อคำขอเพื่อรักษาความปลอดภัยและความถูกต้อง
- การทำให้โค้ดตัวแก้ไขง่ายขึ้นโดยการสรุปการเพิ่มการเพิ่มประสิทธิภาพของข้อมูลลงใน Dataloader
สิ่งนี้ส่งผลให้ประสิทธิภาพความสามารถในการปรับขนาดและการใช้ทรัพยากรได้ดีขึ้นอย่างมีนัยสำคัญในแอปพลิเคชัน GraphQL [2] [6] [7]
การอ้างอิง:
[1] https://www.apollographql.com/tutorials/dataloaders-typescript/04-using-a-dataloader
[2] https://wundergraph.com/blog/dataloader_3_0_breadth_first_data_loading
[3] https://github.com/graphql/dataloader
[4] https://www.parabol.co/blog/graphql-dataloader-cookbook/
[5] https://swatinem.de/blog/graphql-dataloader-part2/
[6] https://moldstud.com/articles/p-solving-the-dataloader-pattern-in-graphql-development
[7] https://ariadnegraphql.org/docs/dataloaders
[8] https://www.apollographql.com/tutorials/dataloaders-dgs/03-data-loaders-under-the-hood