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

gRPC vs REST

REST และ gRPC แก้ปัญหากว้าง ๆ เดียวกัน — โปรแกรมหนึ่งคุยกับอีกโปรแกรมหนึ่ง — แต่มองปัญหาคนละมุม

  • REST คิดในแง่ resource คุณมีคำนาม (/users/42) และกระทำกับคำนามนั้นด้วย verb ชุดเล็ก ๆ ที่ตายตัว (GET, POST, PUT, DELETE) ข้อมูลมักเป็น JSON และ contract มักเป็นเอกสาร (OpenAPI) หรือแค่ convention
  • gRPC คิดในแง่ procedure คุณมี method (GetUser, CreateOrder, StreamPrices) แต่ละตัวมี request และ response ที่มี type นิยามไว้ใน .proto ข้อมูลเป็น binary protobuf และ contract ก็คือ schema เอง

ไม่มีโมเดลไหน “ถูก” — แต่ละตัว optimize เพื่อคนละเรื่อง

REST + JSONgRPC + Protobuf
payloadtext (JSON) — คนอ่านได้ แต่ใหญ่กว่าbinary — กระชับ parse เร็ว
contractมีก็ได้ (OpenAPI / convention)บังคับ (.proto) และ enforce ด้วย codegen
การรองรับ browsernative ใช้ได้ทุกที่ต้องมี gRPC-Web + proxy
streamingทำได้แต่ขลุกขลัก (SSE, long-poll)first-class, สองทิศทาง
การ debug ด้วยตาคนcurl แล้วอ่านได้เลยต้องมี tooling (grpcurl, reflection)
codegen / type safetyเป็น add-on ขึ้นกับเครื่องมือมีในตัว ครอบคลุม 11+ ภาษา
เหมาะกับpublic API, browser, CRUD ง่าย ๆเรียกกันภายในระหว่าง service, latency ต่ำ, streaming

มี 2 อย่างที่ทำให้ gRPC มีประสิทธิภาพบน wire:

flowchart TB
  subgraph rest["REST + JSON"]
    r1["parse text JSON
(reflective, ใหญ่กว่า)"] --> r2["connection ใหม่
หรือ HTTP/1.1 head-of-line"]
  end
  subgraph grpc["gRPC + Protobuf"]
    g1["decode binary protobuf
(schema-driven, กระชับ)"] --> g2["HTTP/2 multiplexing
หลาย call, หนึ่ง connection"]
  end
จุดที่ gRPC ประหยัดเวลาเทียบกับ REST/JSON
  1. protobuf เล็กกว่าและ decode ถูกกว่า JSON field ถูกระบุด้วยหมายเลข ไม่ใช่ชื่อ และค่าถูกแพ็คเป็น binary ไม่มีการ match key แบบ reflective และไม่มีการ parse text
  2. HTTP/2 multiplexing ทำให้หลาย call ที่กำลังทำงานอยู่ใช้ connection เดียวร่วมกันได้โดยไม่บล็อกกัน (บทถัดไปจะเจาะลึกเรื่องนี้)

แต่ต้องพูดกันตรง ๆ เรื่อง scale: สำหรับ request ทุกไม่กี่วินาที ความต่างนี้มองไม่เห็นเลย จะสำคัญตอนที่คุณยิง หลายพัน call ต่อวินาที ระหว่าง service หรือส่ง payload ใหญ่ / แบบ streaming

gRPC เป็น default ที่ดีมากสำหรับ microservice ภายใน แต่เป็นเครื่องมือที่ผิดเมื่อ:

  • client เป็น browser และคุณรัน proxy ไม่ได้ browser พูด gRPC ดิบ ๆ ไม่ได้ คุณต้องมี gRPC-Web บวก proxy ที่แปลให้ (Envoy หรือตัวที่มีมาให้) สำหรับ public web API ง่าย ๆ REST มี friction น้อยกว่า
  • คุณอยากได้ public API ที่เป็นมิตรกับ third-party developer ภายนอกส่วนใหญ่คาดหวัง curl, JSON และหน้า OpenAPI gRPC ยกกำแพงให้เข้ามาใช้ยากขึ้น
  • API เป็นแค่ CRUD ธรรมดา traffic น้อย toolchain ของ .proto และการ debug แบบ binary เป็น overhead ที่คุณไม่ได้กำไรกลับมา
  • traffic ที่คนอ่านออกเป็นข้อกำหนดที่ยืดหยุ่นไม่ได้ (บาง setup ด้าน compliance หรือ debugging) binary frame ต้องมี tooling เพิ่มถึงจะ inspect ได้
ความต่างเชิงมุมมองหลักระหว่าง REST กับ gRPC คืออะไร?
ข้อไหนเป็นเหตุผลจริง ๆ ที่จะเลือก REST มากกว่า gRPC?
ทำไม protobuf ถึงมักประมวลผลเร็วกว่า JSON?
browser ต้องมีชิ้นส่วนอะไรเพิ่มถึงจะคุยกับ gRPC service ได้?