สถาปัตยกรรม
สถาปัตยกรรมการแยก queries ที่ร้องขอออกจาก queries ที่สามารถประมวลผลได้

การแยก queries ที่ร้องขอออกจาก queries ที่สามารถประมวลผลได้

Gato GraphQL ใช้ directive pipeline ซึ่งเป็นสถาปัตยกรรมที่ช่วยให้เอนจิ้นของเซิร์ฟเวอร์สามารถแก้ไข ตรวจสอบ และประมวลผล queries ได้ เพื่อให้เอนจิ้นเรียบง่ายที่สุดเท่าที่จะเป็นไปได้ การดำเนินการทุกอย่างที่เกี่ยวข้องกับการแก้ไข query จะเกิดขึ้นภายใน pipeline ผ่าน directives

The directive pipeline

การเรียก resolver เพื่อตรวจสอบและแก้ไขฟิลด์ และรวมผลลัพธ์เข้าใน response นั้นทำได้ผ่าน directives พิเศษสองตัว ได้แก่ @validate และ @resolveValueAndMerge directives เหล่านี้เป็นประเภทพิเศษ กล่าวคือ ไม่ได้ถูกเพิ่มโดยแอปพลิเคชัน (ไม่ว่าจะใน query หรือ schema) แต่ถูกเพิ่มโดยเอนจิ้นเอง directives ทั้ง 2 ตัวนี้เป็น implicit และจะถูกเพิ่มเสมอในทุกฟิลด์ของทุก query

จากกลยุทธ์นี้เราจะเห็นว่า เมื่อประมวลผล query บนเซิร์ฟเวอร์ GraphQL นั้น มี queries ที่เกี่ยวข้องจริงๆ อยู่ 2 ตัว ได้แก่:

  • requested query
  • executable query

executable query ซึ่งเป็นตัวที่เซิร์ฟเวอร์จะแก้ไขในท้ายที่สุด ถูกสร้างขึ้นจากการนำการแปลงไปใช้กับ requested query ซึ่งในบรรดาการแปลงเหล่านั้น ได้แก่ การเพิ่ม directives @validate และ @resolveValueAndMerge ให้กับทุกฟิลด์

Inner process within the GraphQL server

ตัวอย่างเช่น หาก requested query เป็นดังนี้:

{
  posts {
    url
    title @uppercase
    content @include(if: $addContent)
  }
}

executable query จะเป็นดังนี้:

{
  posts @validate @resolveValueAndMerge {
    url @validate @resolveValueAndMerge
    title @validate @resolveValueAndMerge @uppercase
    content @validate @include(if: $addContent) @resolveValueAndMerge
  }
}

ใช้งานที่ไหนบ้าง

Gato GraphQL ใช้กลไกนี้เพื่อสร้าง executable query ในสถานการณ์ต่อไปนี้:

  • การเพิ่ม directives ประเภทระบบ (เช่น @validate และ @resolveValueAndMerge)
  • การเพิ่ม directive ใดๆ ผ่าน IFTTT through directives
  • การกำหนด field-execution order ที่เข้มงวดสำหรับ Multiple Query Execution