ข้ามไปยังเนื้อหา

เครื่องมือ, Federation และการสร้างเซอร์วิส

ทุกโมดูลก่อนหน้านี้สอนคุณให้ ออกแบบ schema ทั้ง types, resolvers, mutations, pagination, errors และ security โมดูลนี้พูดถึงทุกสิ่งที่เปลี่ยนการออกแบบที่ดีให้กลายเป็นเซอร์วิสที่ทีมงานจริงนำไปใช้งานได้ schema ที่อยู่ลำพังเป็นเพียงเอกสารหนึ่งฉบับ แต่ service คือเอกสารฉบับนั้นที่ถูกทำให้รันได้ มี type มีการ test และเมื่อทีมเดียวกับกระบวนการเดียวไม่เพียงพออีกต่อไป ก็ถูกแยกออกไปหลายระบบและประกอบกลับเป็นกราฟเดียว

schema ที่ออกแบบไว้เปรียบเหมือนแบบร่างของสถาปนิก แม่นยำและเป็น contract ก็จริง แต่ไม่มีใครอาศัยอยู่ในแบบร่างได้ มีสี่สิ่งที่ขวางอยู่ระหว่างแบบร่างกับอาคารที่คนใช้งานได้จริง

  • Implement — เลือกว่า SDL กับcode resolver จะสัมพันธ์กันอย่างไร SDL เป็น source of truth (schema-first) หรือถูก generate มาจากcodeของคุณ (code-first)? ตัวเลือกนี้กำหนดรูปร่างของ codebase ทั้งหมด
  • Type & document — เชื่อม schema เข้ากับ type system ของภาษาที่ใช้ เพื่อให้ compiler จับ resolver ที่ผิดได้ก่อนที่ client จะเจอ GraphQL Code Generator แปลง schema ให้เป็น TypeScript types ทั้งฝั่ง server และ client
  • Test — พิสูจน์ว่าเซอร์วิสทำงานถูกต้อง ทำ unit-test กับ resolver แต่ละตัว และ integration-test ด้วยการรัน operation จริงกับ schema แล้วตรวจสอบผลลัพธ์
  • Federate — เมื่อกราฟใหญ่เกินกว่าเซอร์วิสเดียวจะรับไหว ก็แยกออกเป็น subgraphs ที่ทีมต่าง ๆ เป็นเจ้าของ แล้วประกอบกลับเป็น supergraph เดียวหลัง gateway
flowchart LR
  Design["Design (earlier modules)"]
  Implement["Implement (schema-first / code-first)"]
  Test["Type & Test (codegen + tests)"]
  Federate["Federate (subgraphs + gateway)"]
  Service["Running GraphQL service"]
  Design --> Implement
  Implement --> Test
  Test --> Federate
  Federate --> Service
  Test --> Service
เส้นทางที่โมดูลนี้เดิน: การออกแบบป้อนให้การ implement ซึ่งถูก test และเมื่อขยายตัว ก็ถูก federate เป็นกราฟเดียว

อ่าน flow นั้นเป็น pipeline ที่คุณเริ่มไปแล้ว Design อยู่ข้างหลังคุณแล้ว ตอนนี้คุณตัดสินใจว่าจะ implement อย่างไร คุณทำให้ implementation นั้นมี type และผ่านการ test และเมื่อเซอร์วิสเดียวเริ่มแบกหลายทีมไม่ไหวเท่านั้น คุณจึงหันไปหา federation บทเรียนสุดท้ายดึงทุกอย่างมารวมกันใน TypeScript server ที่ทำงานได้จริง

  • Schema-first vs code-first — สองวิธีในการสร้าง GraphQL server, ข้อแลกเปลี่ยนของแต่ละแบบ และเดโมที่ทั้งสองสไตล์ให้ schema เดียวกันเป๊ะ
  • Codegen and testing — การ generate resolvers และ operations ที่มี type พร้อมกลยุทธ์ unit และ integration testing ที่คุณนำไปใช้ได้วันนี้
  • Federation — การแยกกราฟตาม domain ออกเป็น subgraphs, entities และ references และการประกอบ supergraph หลัง gateway
  • Building with Yoga — การ implement ด้วย TypeScript ที่ครบถ้วนและรันได้จริงด้วย GraphQL Yoga ซึ่งผูก typeDefs, resolvers และ context เข้าด้วยกัน

เมื่อจบ คุณจะสามารถนำ schema ใด ๆ ที่คุณออกแบบไว้ในโมดูลก่อนหน้า มาตั้งขึ้นเป็น GraphQL service ที่มีเอกสาร มี type ผ่านการ test และหากจำเป็น ก็ federate ได้

ตามโมดูลนี้ อะไรคือสิ่งที่ขวางอยู่ระหว่าง schema ที่ออกแบบไว้กับเซอร์วิสที่รันอยู่?
ตามบทเรียนนี้ ทีมควรหันไปหา federation เมื่อใด?
อะไรคือตัวเลือกหลักที่ขั้น "implement" บังคับให้คุณต้องตัดสินใจ?