การดู : 0
12/04/2026 18:17น.

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