การดู : 0

12/04/2026 18:17น.

EP.81 การใช้ WebSocket เพื่อเชื่อมต่อกับระบบฐานข้อมูลแบบเรียลไทม์

EP.81 การใช้ WebSocket เพื่อเชื่อมต่อกับระบบฐานข้อมูลแบบเรียลไทม์

#WebSocket

#Golang

#Go

#ระบบเรียลไทม์

#การเชื่อมต่อฐานข้อมูล

ใน EP นี้ เราจะพาคุณมาทำความเข้าใจวิธีเชื่อมต่อ WebSocket กับฐานข้อมูล เพื่อให้แอปพลิเคชันสามารถอัปเดตข้อมูลแบบเรียลไทม์ ผู้ใช้จะเห็นการเปลี่ยนแปลงทันทีโดยไม่ต้องรีเฟรช เช่น:

  • แสดงข้อมูลสินค้าคงเหลือแบบเรียลไทม์
  • การแจ้งเตือนอัปเดต order
  • ระบบ live dashboard หรือ real-time status feed

 

🔍 ทำไมต้องใช้ WebSocket กับฐานข้อมูลแบบเรียลไทม์?

 

  • ลดการ polling ซ้ำ ๆ: ไม่จำเป็นต้องให้ client ส่ง request เพื่อเช็คข้อมูลทุกไม่กี่วินาที
  • เพิ่มความเร็วในการแสดงผล: ข้อมูลถูก push ไปยัง client โดยตรง
  • รองรับผู้ใช้หลายคนพร้อมกัน: ส่งข้อมูลจาก backend ไปยัง client ได้หลาย connection พร้อมกัน

 

🧠 สถาปัตยกรรมพื้นฐาน:

 

Database ←→ Backend (Go + WebSocket) ←→ Clients (Web/Mobile)

 

แนวคิด:

  • Backend เชื่อมต่อกับฐานข้อมูล (PostgreSQL / MySQL / MongoDB)
  • เมื่อมี Insert/Update/Delete → backend ส่งข้อมูลไปยัง client ผ่าน WebSocket
  • Client รับข้อมูลและอัปเดต UI ทันที

 

✅ ตัวอย่างโค้ด Golang

 

package main

import (
    "database/sql"
    "encoding/json"
    "log"
    "net/http"
    "time"

    _ "github.com/lib/pq"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool { return true },
}

type Message struct {
    ID      int    `json:"id"`
    Content string `json:"content"`
}

var clients = make(map[*websocket.Conn]bool)

func main() {
    // เชื่อมต่อฐานข้อมูล PostgreSQL
    db, err := sql.Open("postgres", "postgres://user:password@localhost:5432/dbname?sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // WebSocket handler
    http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
        ws, err := upgrader.Upgrade(w, r, nil)
        if err != nil {
            log.Println("Upgrade error:", err)
            return
        }
        defer ws.Close()
        clients[ws] = true

        for {
            _, _, err := ws.ReadMessage()
            if err != nil {
                log.Println("Client disconnected:", err)
                delete(clients, ws)
                break
            }
        }
    })

    // Polling database ทุก 5 วินาที
    go func() {
        for {
            rows, err := db.Query("SELECT id, content FROM messages ORDER BY id DESC LIMIT 10")
            if err != nil {
                log.Println("DB query error:", err)
                time.Sleep(5 * time.Second)
                continue
            }

            var messages []Message
            for rows.Next() {
                var m Message
                if err := rows.Scan(&m.ID, &m.Content); err == nil {
                    messages = append(messages, m)
                }
            }
            rows.Close()

            data, _ := json.Marshal(messages)
            for client := range clients {
                err := client.WriteMessage(websocket.TextMessage, data)
                if err != nil {
                    log.Println("Send error:", err)
                    client.Close()
                    delete(clients, client)
                }
            }

            time.Sleep(5 * time.Second)
        }
    }()

    log.Println("🚀 Server started at :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

 

💬 หมายเหตุ:

  • ใน production ควรใช้ PostgreSQL LISTEN/NOTIFY, Redis Pub/Sub หรือ CDC แทนการ polling เพื่อให้ระบบ real-time อย่างแท้จริง
  • ปรับ connection pool, เพิ่ม retry logic และจัดการ concurrent connection ให้ดีสำหรับระบบที่มีผู้ใช้จำนวนมาก

 

✅ สิ่งที่ควรทดสอบ

 

  • ✅ WebSocket เชื่อมต่อกับฐานข้อมูลได้หรือไม่
  • ✅ ข้อมูลถูก push ไปยัง client ทันทีเมื่อมีการเปลี่ยนแปลง
  • ✅ ระบบจัดการ disconnect/reconnect ได้อย่างเหมาะสม
  • ✅ รองรับ load สูงจากหลาย client พร้อมกัน

 


 

🔧 ท้าให้ลอง!

 

  • ใช้ PostgreSQL LISTEN/NOTIFY แทน polling
  • ให้ client subscribe ข้อมูลเฉพาะที่เกี่ยวข้องกับตัวเอง (filtered message)
  • แยก WebSocket hub สำหรับจัดการ session, broadcast และ private message

 

🔜 EP ถัดไป:

 

EP.82 – การใช้งาน WebSocket กับระบบติดตามสถานะแบบเรียลไทม์ (Real-Time Status Tracking)
คุณจะได้เรียนรู้วิธีสร้างระบบแจ้งเตือนสถานะที่อัปเดตทันทีเมื่อมีการเปลี่ยนแปลง เช่น สถานะของออร์เดอร์ การเช็คอิน การแจ้งเตือนต่าง ๆ

 

อ่านบทความ Series อื่นๆ

🔵 Facebook: Superdev School  (Superdev)

📸 Instagram: superdevschool

🎬 TikTok: superdevschool

🌐 Website: www.superdev.school