GraphQL มีข้อเสียหรือไม่? [ปิด]


103

บทความทั้งหมดเกี่ยวกับ GraphQL จะบอกคุณว่ามันยอดเยี่ยมแค่ไหน แต่มีข้อเสียหรือข้อบกพร่องหรือไม่? ขอบคุณ.

คำตอบ:


99

ข้อเสีย:

  • คุณต้องเรียนรู้วิธีตั้งค่า GraphQL ระบบนิเวศยังคงพัฒนาอย่างรวดเร็วดังนั้นคุณต้องติดตามให้ทัน
  • คุณต้องส่งแบบสอบถามจากไคลเอนต์คุณสามารถส่งสตริงได้ แต่ถ้าคุณต้องการความสะดวกสบายมากขึ้นและการแคชคุณจะใช้ไลบรารีไคลเอนต์ -> โค้ดพิเศษในไคลเอนต์ของคุณ
  • คุณต้องกำหนดสคีมาล่วงหน้า => งานพิเศษก่อนที่คุณจะได้รับผลลัพธ์
  • คุณต้องมีจุดสิ้นสุด graphql บนเซิร์ฟเวอร์ของคุณ => ไลบรารีใหม่ที่คุณยังไม่รู้จัก
  • แบบสอบถาม Graphql มีจำนวนไบต์มากกว่าการไปที่ปลายทาง REST
  • เซิร์ฟเวอร์ต้องดำเนินการประมวลผลเพิ่มเติมเพื่อแยกวิเคราะห์แบบสอบถามและตรวจสอบพารามิเตอร์

แต่สิ่งเหล่านี้มีมากกว่าสิ่งเหล่านี้:

  • GraphQL ไม่ใช่เรื่องยากที่จะเรียนรู้
  • โค้ดพิเศษมีเพียงไม่กี่ KB
  • ด้วยการกำหนดสคีมาคุณจะป้องกันไม่ให้มีงานเพิ่มขึ้นอีกมากหลังจากนั้นแก้ไขข้อบกพร่องและการอัปเกรดที่ยุ่งยาก
  • มีผู้คนจำนวนมากเปลี่ยนมาใช้ GraphQL ดังนั้นจึงมีการพัฒนาระบบนิเวศที่สมบูรณ์พร้อมด้วยเครื่องมือที่ยอดเยี่ยม
  • เมื่อใช้การสืบค้นแบบต่อเนื่องในการใช้งานจริง (แทนที่การสืบค้น GraphQL ด้วย ID และพารามิเตอร์) คุณจะส่งไบต์น้อยกว่าด้วย REST
  • การประมวลผลเพิ่มเติมสำหรับข้อความค้นหาขาเข้ามีความสำคัญเล็กน้อย
  • การจัดเตรียมการแยกส่วน API และแบ็กเอนด์ที่สะอาดช่วยให้สามารถทำซ้ำได้เร็วขึ้นมากในการปรับปรุงแบ็กเอนด์

1
"คุณต้องกำหนดสคีมาก่อน => งานพิเศษก่อนที่คุณจะได้รับผลลัพธ์" ฉันไม่เห็นว่าสิ่งนี้ไม่จำเป็นหากไม่มี GraphQL? แน่นอนว่ากรอบงานบางอย่างในบางภาษาไม่จำเป็น แต่ตัวอย่างเช่นสำหรับ Java API คุณจะยังคงต้องอธิบาย "สคีมา" ในแบบจำลองของคุณ
AntoineB

3
@AntoineB คุณถูกต้องใน NodeJS แต่คุณสามารถสร้าง REST API ได้อย่างง่ายดายโดยไม่ต้องคิดถึงสคีมาโดยรวม เพียงแค่คืนสิ่งของ
00 น

1
@ w00t และทันทีที่คุณต้องการพารามิเตอร์บางตัวกับ REST คุณจะใช้การแยกวิเคราะห์ URL เพื่อตรวจสอบว่าประเภทของพารามิเตอร์นั้นถูกต้องโดยโยน 400 หากไม่ใช่ หากมีเพียงบางสิ่งที่หลีกเลี่ยงไม่ได้ที่จะต้องทำสิ่งนี้ด้วยตนเองในตัวจัดการเส้นทางทุกตัว: D
Capaj

ด้วย Spring Boot คุณสามารถดึงสิ่งประดิษฐ์บางอย่างgraphql-spring-boot-starterและgraphql-java-toolsเริ่มต้นได้ สร้างสคีมาของคุณในทรัพยากร. กราฟ qls และสร้างคลาส Resolver เท่านี้ก็เสร็จเรียบร้อย ในการรับตัวอย่างการทดสอบการทำงานใช้เวลาประมาณ 10 นาที
Babyburger

1
ฉันไม่เห็นด้วยกับข้อเสียทั้งหมด infact ช่วยให้คุณประหยัดเวลาได้มากลองดูโพสต์นี้xalitech.com/graphql-how-to-convince-your-boss
Shafqat Ali

59

ฉันพบข้อกังวลที่สำคัญบางอย่างสำหรับทุกคนที่คิดจะใช้ GraphQLและจนถึงตอนนี้ประเด็นหลักคือ:

Query In Indefinite Depth : GraphQL ไม่สามารถค้นหาในระดับความลึกที่ไม่แน่นอนได้ดังนั้นหากคุณมีต้นไม้และต้องการส่งคืนสาขาโดยไม่ทราบความลึกคุณจะต้องทำการแบ่งหน้า

โครงสร้างการตอบสนองเฉพาะ : ใน GraphQL การตอบสนองตรงกับรูปร่างของแบบสอบถามดังนั้นหากคุณต้องการตอบสนองในโครงสร้างที่เฉพาะเจาะจงมากคุณจะต้องเพิ่มเลเยอร์การเปลี่ยนแปลงเพื่อปรับรูปร่างการตอบสนอง

แคชที่ระดับเครือข่าย : เนื่องจากวิธีทั่วไปใช้ GraphQL ผ่าน HTTP (A POST ในจุดสิ้นสุดเดียว) แคชที่ระดับเครือข่ายจึงยาก วิธีแก้ปัญหาคือการใช้ Persisted Queries

การจัดการการอัปโหลดไฟล์ : ไม่มีอะไรเกี่ยวกับการอัปโหลดไฟล์ในข้อกำหนด GraphQL และการกลายพันธุ์ไม่ยอมรับไฟล์ในอาร์กิวเมนต์ ในการแก้ปัญหานี้คุณสามารถอัปโหลดไฟล์โดยใช้ API ประเภทอื่น (เช่น REST) ​​และส่ง URL ของไฟล์ที่อัปโหลดไปยังการกลายพันธุ์ของ GraphQL หรือฉีดไฟล์ในบริบทการดำเนินการดังนั้นคุณจะมีไฟล์อยู่ในฟังก์ชันตัวแก้ไข

Unpredictable Execution : ลักษณะของ GraphQL คือคุณสามารถค้นหาการรวมฟิลด์อะไรก็ได้ที่คุณต้องการ แต่ความยืดหยุ่นนี้ไม่ได้ฟรี มีข้อกังวลบางประการที่ควรทราบเช่นแบบสอบถามประสิทธิภาพและ N + 1

Super Simple APIs : ในกรณีที่คุณมีบริการที่เปิดเผย API ที่เรียบง่ายจริงๆ GraphQL จะเพิ่มความซับซ้อนเป็นพิเศษเท่านั้นดังนั้น REST API แบบธรรมดาจึงดีกว่า


2
สำหรับความลึกที่ไม่แน่นอนฉันใช้การตอบสนอง JsonType ไม่ได้พิมพ์อย่างแรงดังนั้นคุณต้องตรวจสอบอินพุต แต่ก็มีประโยชน์มาก
w00t

3
REST มักจะมีปัญหา N + 1 Queries ข้อแตกต่างเพียงอย่างเดียวก็คือโดยการออกแบบ REST ไม่อนุญาตให้แบ็กเอนด์แม้แต่พยายามแก้ไขปัญหา แต่มันจะผลักปัญหาไปที่ส่วนหน้า
Capaj

41

นี้ปัญหาที่ใหญ่ที่สุดที่ฉันเห็นกับ graphQL เช่นถ้าคุณกำลังใช้กับฐานข้อมูลเชิงสัมพันธ์อยู่กับร่วม

  1. ความจริงที่ว่าคุณสามารถอนุญาต / ไม่อนุญาตบางฟิลด์ทำให้การรวมไม่สำคัญ (ไม่ใช่เรื่องง่าย) ซึ่งนำไปสู่การสืบค้นเพิ่มเติม

  2. นอกจากนี้ยังซ้อนแบบสอบถามในการนำไปสู่การ graphql แบบสอบถามวงกลมและสามารถผิดพลาดเซิร์ฟเวอร์ ต้องใช้ความระมัดระวังเป็นพิเศษ

  3. การ จำกัด อัตราการโทรกลายเป็นเรื่องยากเพราะตอนนี้ผู้ใช้สามารถส่งข้อความค้นหาหลายรายการในการโทรครั้งเดียว

เคล็ดลับ : ใช้ dataloader ของ facebook เพื่อลดจำนวนการสืบค้นในกรณีของ javascript / node


1. ช่องที่เลือกเกี่ยวข้องกับการดำเนินการอย่างไร? 2. ไม่ใช่ถ้าคุณใช้ตัวโหลดข้อมูล 3. คุณสามารถแยกวิเคราะห์และกำหนดcostให้กับคำขอ นอกจากนี้ไม่น่ากังวลหากคุณกำลังใช้การสืบค้นที่กำหนดไว้ล่วงหน้าซึ่งลูกค้าจะส่งเฉพาะ ID เท่านั้น
zoran404

1
เห็นด้วยกับ 2 ด้วย 3 บิตของงานพิเศษและที่สำคัญกว่านั้นต้องระวัง ppl
aWebDeveloper

1
2. สิ่งนี้ไม่เป็นความจริงอีกต่อไปเนื่องจากคุณสามารถใช้เครื่องมือมากมายเพื่อปกป้องเซิร์ฟเวอร์ของคุณ ตัวอย่างเช่นลิงก์: howtographql.com/advanced/4-security Timeouts จำกัด ความซับซ้อนและความลึก ดังนั้นก็เหมือนกับที่คุณจะบอกว่า REST ของคุณจะเป็นไปได้ที่จะ DDoS หากคุณไม่ใช้ตัว จำกัด อัตรา สิ่งต่างๆเปลี่ยนไป
Yevhenii Herasymchuk

อัปเดตจุดที่ 2
aWebDeveloper

14

มันจะดีขึ้นเรื่อย ๆ ในแต่ละปีและในตอนนี้ชุมชนของ GraphQL กำลังเติบโตขึ้นและด้วยเหตุนี้จึงมีวิธีแก้ปัญหามากมายที่เน้นในคำตอบอื่น ๆ ก่อนหน้านี้ แต่เพื่อยอมรับว่าสิ่งที่ยังคงถือ บริษัท จากการทุ่มทรัพยากรทั้งหมดไปยัง GraphQL ฉันต้องการแสดงรายการปัญหาและแนวทางแก้ไขตามด้วยปัญหาที่ยังไม่ได้แก้ไข

  • แคชในระดับเครือข่าย - ตามที่Brunoกล่าวว่าเป็น Persisted Queries และแน่นอนว่าคุณสามารถแคชบนไคลเอนต์ได้และไม่มีใครหยุดให้คุณใช้แคชในระดับฐานข้อมูลหรือแม้แต่ Redis แต่แน่นอนว่าเนื่องจาก GraphQL มีจุดสิ้นสุดเพียงจุดเดียวและแต่ละแบบสอบถามก็แตกต่างกัน - การทำแคชประเภทนี้มีความซับซ้อนมากกว่า REST
  • คำค้นหาที่ซ้อนกันใน GraphQL นำไปสู่การสืบค้นแบบวนรอบและอาจทำให้เซิร์ฟเวอร์ขัดข้อง - ไม่ใช่ปัญหาอีกต่อไปด้วยโซลูชันที่หลากหลาย บางส่วนมีรายชื่ออยู่ที่นี่
  • การจัดการอัปโหลดไฟล์ - เรามีอยู่แล้วจำนวนมากของการแก้ปัญหาสำหรับมัน

แต่มีอีกสองกรณีที่สามารถนับเป็นข้อเสียได้:

  • ความมากเกินไปแบบสำเร็จรูป (โดยสิ่งนี้ฉันหมายถึงสำหรับการสร้างตัวอย่างแบบสอบถามใหม่คุณต้องกำหนดสคีมาตัวแก้ไขและภายในตัวแก้ไขเพื่อพูด GraphQL อย่างชัดเจนว่าจะแก้ไขข้อมูลและฟิลด์ของคุณภายในอย่างไรในฝั่งไคลเอ็นต์จะสร้างแบบสอบถามที่มีฟิลด์ที่เกี่ยวข้องกับ ข้อมูลนี้)
  • การจัดการข้อผิดพลาด - ฉันต้องบอกว่าเกี่ยวข้องกับการเปรียบเทียบกับ REST มากกว่า เป็นไปได้ที่นี่กับ apolloแต่ในขณะเดียวกันก็ซับซ้อนกว่าใน REST มาก
  • ตรวจสอบและอนุมัติ - แต่ที่ผมกล่าวว่าชุมชนจะเพิ่มขึ้นด้วยความเร็วที่โดดเด่นและมีอยู่แล้ว คู่ ของ โซลูชั่นสำหรับเป้าหมายนี้

สรุปแล้ว GraphQL เป็นเพียงเครื่องมือสำหรับเป้าหมายที่เฉพาะเจาะจงและแน่นอนว่ามันไม่ใช่กระสุนเงินสำหรับปัญหาทั้งหมดและแน่นอนว่าไม่ใช่สิ่งทดแทนสำหรับ REST


4

เป็นเรื่องดีมากที่มีจุดสิ้นสุดเดียวและเปิดเผยข้อมูลทั้งหมด ฉันพบประเด็นด้านล่างที่ต้องพิจารณาสำหรับ GraphQL:

  1. การใช้งานการดาวน์โหลดไฟล์ / อัปโหลดนั้นยุ่งยาก (การแปลงเป็นสตริงอาจไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับไฟล์ขนาดใหญ่)
  2. เอกสารสำเร็จรูปและรหัสสคีมาจำนวนมากที่ส่วนหน้าและส่วนหลัง
  3. ติดตามและสนับสนุนการแบ่งหน้าที่ให้ไว้ในข้อกำหนด GraphQL
  4. อนุญาตลำดับที่กำหนดเองและจัดลำดับความสำคัญของตรรกะสำหรับการจัดลำดับฟิลด์ ตัวอย่างเช่นหากเราดึงข้อมูลผู้ใช้และกลุ่มและบทบาทที่เกี่ยวข้อง ผู้ใช้สามารถจัดเรียงข้อมูลได้หลายแบบตามชื่อผู้ใช้ชื่อกลุ่มหรือชื่อบทบาท
  5. การพิสูจน์ตัวตนและการอนุญาตจะขึ้นอยู่กับกรอบงานแบ็กเอนด์
  6. ตรวจสอบให้แน่ใจว่าการเพิ่มประสิทธิภาพแบ็กเอนด์และการสนับสนุนฐานข้อมูลเพื่อเริ่มการค้นหาเดี่ยวสำหรับคำสั่ง graphql แต่ละคำสั่งอาจยุ่งยาก

นอกจากนี้ควรพิจารณาข้อดีหลังจากการใช้งาน:

  1. มีความยืดหยุ่นมากในการรองรับรายการใหม่และอัปเดตพฤติกรรมที่มีอยู่
  2. ง่ายต่อการเพิ่มเงื่อนไขโดยใช้อาร์กิวเมนต์และการสั่งซื้อที่กำหนดเองเมื่อดำเนินการแล้ว

  3. ใช้ตัวกรองแบบกำหนดเองจำนวนมากและกำจัดการดำเนินการทั้งหมดที่ต้องสร้างตัวอย่างเช่นผู้ใช้สามารถมี id ชื่อ ฯลฯ เป็นอาร์กิวเมนต์และดำเนินการกรอง นอกจากนี้ยังสามารถใช้ตัวกรองกับกลุ่มในผู้ใช้ได้อีกด้วย

  4. ความง่ายในการทดสอบ API โดยการสร้างไฟล์ที่มีคิวรีและการกลายพันธุ์ของ GraphQL ทั้งหมด
  5. การกลายพันธุ์นั้นตรงไปตรงมาและง่ายต่อการนำไปใช้เมื่อเข้าใจแนวคิดแล้ว
  6. วิธีที่มีประสิทธิภาพในการดึงข้อมูลเชิงลึกหลาย ๆ
  7. รองรับ Voyager และ GraphiQL UI หรือ Playground ทำให้ง่ายต่อการดูและใช้งาน
  8. ความสะดวกในการจัดทำเอกสารในขณะที่กำหนดสคีมาด้วยวิธีการอธิบายที่ถูกต้อง

3

ฉันคิดว่าตอนนี้ graphql ต้องเป็นส่วนหนึ่งของสถาปัตยกรรมแบ็กเอนด์สำหรับการอัปโหลดไฟล์คุณยังคงใช้ API ปกติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.