การดู : 0

12/04/2026 18:18น.

EP.33 การใช้ GraphQL กับ WebSocket ใน Go เพื่อสร้าง API แบบเรียลไทม์

EP.33 การใช้ GraphQL กับ WebSocket ใน Go เพื่อสร้าง API แบบเรียลไทม์

#Go Programming

#API Development

#WebSocket API

#GraphQL API

#Real-Time API

#GraphQL Subscriptions

#Golang

#Go

#WebSocket

#GraphQL

GraphQL และ WebSocket – ทำไมต้องใช้ร่วมกัน?

GraphQL เป็น API Query Language ที่ให้ไคลเอนต์สามารถดึงข้อมูลเฉพาะส่วนที่ต้องการได้ WebSocket เป็นโปรโตคอลที่ช่วยให้ระบบสามารถสื่อสารแบบ Full-Duplex หรือ Real-Time ได้ เมื่อรวมกัน เราจะสามารถสร้าง API ที่รองรับการอัปเดตข้อมูลได้แบบเรียลไทม์ โดยใช้ GraphQL Subscriptions

 

การใช้งาน GraphQL Subscriptions กับ WebSocket

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

 

ตัวอย่าง GraphQL Subscription:

subscription {
  newMessage {
    id
    content
    sender
  }
}

เมื่อมีข้อความใหม่ (newMessage), เซิร์ฟเวอร์จะส่งข้อมูลกลับมายังไคลเอนต์แบบ Real-Time

 

ตัวอย่างโค้ดการใช้งาน WebSocket กับ GraphQL ใน Go

1. การติดตั้งไลบรารีที่จำเป็น

go get github.com/99designs/gqlgen
go get github.com/gorilla/websocket

2. สร้าง Schema สำหรับ GraphQL

ไฟล์ schema.graphql

type Query {
  messages: [Message!]!
}

type Subscription {
  messageAdded: Message!
}

type Message {
  id: ID!
  content: String!
  sender: String!
}

3. สร้าง Resolver สำหรับ GraphQL

ไฟล์ resolver.go

package main

import (
    "context"
    "fmt"
    "sync"
)

type Message struct {
    ID      string
    Content string
    Sender  string
}

type Resolver struct {
    mu          sync.Mutex
    messages    []Message
    subscribers map[string]chan Message
}

func NewResolver() *Resolver {
    return &Resolver{
        messages:    []Message{},
        subscribers: make(map[string]chan Message),
    }
}

func (r *Resolver) Subscription_messageAdded(ctx context.Context) (<-chan Message, error) {
    id := fmt.Sprintf("%d", len(r.subscribers))
    r.mu.Lock()
    ch := make(chan Message)
    r.subscribers[id] = ch
    r.mu.Unlock()

    go func() {
        <-ctx.Done()
        r.mu.Lock()
        delete(r.subscribers, id)
        close(ch)
        r.mu.Unlock()
    }()
    return ch, nil
}

ท้าให้ลอง!

ลองสร้างระบบแจ้งเตือนแบบเรียลไทม์ที่ใช้ GraphQL Subscriptions และ WebSocket เพื่อแจ้งเตือนผู้ใช้เมื่อมีข้อความใหม่!


EP ถัดไป

ใน EP.34 เราจะมาดูการสร้างระบบแชทที่สมบูรณ์แบบโดยใช้ GraphQL และ WebSocket เพื่อให้รองรับการสนทนาแบบเรียลไทม์! เตรียมตัวให้พร้อม 🚀