12/04/2026 18:17น.

EP.83 การใช้ WebSocket สร้างแอปพลิเคชันแบบ Collaborative
#WebSocket
#Golang
#Go
#ระบบเรียลไทม์
ใน EP.83 นี้ เราจะมาเรียนรู้การสร้าง Collaborative Application ด้วย Golang และ WebSocket เพื่อให้ผู้ใช้งานหลายคนสามารถทำงานร่วมกันแบบเรียลไทม์ เช่น:
- การแก้ไขเอกสารพร้อมกันหลายคน
- Whiteboard ที่วาดพร้อมกันได้หลายคน
- ระบบ Team Chat ที่ทุกคนส่งข้อความถึงกันได้แบบสด ๆ
🔍 ทำไมต้องใช้ WebSocket สำหรับ Collaborative Application?
แอปพลิเคชันที่เน้นการทำงานร่วมกันแบบเรียลไทม์ ไม่เหมาะกับ HTTP ทั่วไป เพราะ HTTP เป็นแบบ Request-Response ซึ่งส่งผลให้เกิดความล่าช้า (latency) และไม่สามารถส่งข้อมูลได้แบบต่อเนื่องทันที
WebSocket เข้ามาแก้ปัญหานี้ได้ด้วยการเป็น Full-duplex connection ซึ่งช่วยให้เซิร์ฟเวอร์สามารถส่งข้อมูลไปยังผู้ใช้งานทุกคนได้ทันทีเมื่อมีการเปลี่ยนแปลง
✅ ตัวอย่างแอปที่เหมาะกับ WebSocket
- ระบบเอกสารออนไลน์ที่หลายคนแก้ไขได้พร้อมกัน (Google Docs style)
- Whiteboard ออนไลน์แบบทีม
- ระบบ Team Chat แบบกลุ่ม
⚙️ การตั้งค่า WebSocket Server ด้วย Golang
ในตัวอย่างนี้ เราจะใช้ Gorilla WebSocket ซึ่งเป็นไลบรารียอดนิยมสำหรับจัดการ WebSocket ในภาษา Go
1. Import packages
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
2. สร้าง Upgrader สำหรับยกระดับ HTTP → WebSocket
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true // อนุญาตให้ทุก origin เชื่อมต่อ (Production ควรจำกัด Origin)
},
}
3. สร้าง map เก็บ client
var clients = make(map[*websocket.Conn]bool)
💬 การจัดการการเชื่อมต่อและ Broadcast
ฟังก์ชันส่งข้อความไปยังทุก client
func broadcastMessage(message []byte) {
for client := range clients {
err := client.WriteMessage(websocket.TextMessage, message)
if err != nil {
client.Close()
delete(clients, client)
}
}
}
ฟังก์ชันจัดการการเชื่อมต่อใหม่
func handleConnections(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 {
_, msg, err := ws.ReadMessage()
if err != nil {
log.Println("Read error:", err)
delete(clients, ws)
break
}
broadcastMessage(msg)
}
}
main function สำหรับเริ่มเซิร์ฟเวอร์
func main() {
http.HandleFunc("/ws", handleConnections)
log.Println("WebSocket server started on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
🧠 การจัดการ Conflict และ Synchronization
เมื่อผู้ใช้หลายคนทำงานกับข้อมูลเดียวกัน อาจเกิด conflict ได้ เช่น การแก้ไขข้อความพร้อมกัน
แนวทางการจัดการ:
| วิธี | อธิบาย |
|---|---|
| Operational Transformation (OT) | ใช้โครงสร้างข้อความแบบ operation เพื่อ sync ข้อมูลจาก client แต่ละคน |
| Last Write Wins (LWW) | ยอมให้ข้อมูลล่าสุดแทนที่เสมอ (เหมาะกับกรณีที่ไม่ซีเรียสเรื่อง conflict) |
| Versioning | เพิ่ม version ID ให้กับแต่ละข้อความหรือเอกสารเพื่อตรวจสอบความถูกต้อง |
สำหรับระบบแชทหรือ whiteboard เบื้องต้น อาจใช้การแนบ timestamp และ user_id กับแต่ละข้อความเพื่อจัดการลำดับและความถูกต้องได้ง่าย ๆ
🧪 ตัวอย่างการประยุกต์ใช้
| ประเภทระบบ | รายละเอียด |
|---|---|
| Whiteboard | ผู้ใช้วาดภาพพร้อมกัน → ส่งจุดพิกัดและสีไปยังผู้ใช้งานทั้งหมด |
| Chat แบบกลุ่ม | ผู้ใช้ส่งข้อความ → เซิร์ฟเวอร์กระจายข้อความไปยังทุกคนทันที |
| Document Editor | ใช้ OT หรือ LWW เพื่อจัดการการแก้ไขเอกสารแบบ real-time |
⚠️ สิ่งที่ต้องระวัง
| หัวข้อ | คำแนะนำ |
|---|---|
| Resource Management | จำกัดจำนวน client ต่อ server เพื่อป้องกัน overload |
| Security | ตรวจสอบ origin และมีการยืนยันตัวตนก่อนให้เชื่อมต่อ |
| Scalability | ใช้ Redis Pub/Sub หรือ Message Queue (เช่น NATS, Kafka) สำหรับระบบที่ต้องทำงานข้ามหลายเครื่อง |
🚀 ท้าให้ลอง!
ลองสร้าง Collaborative App ขนาดเล็กด้วย Go + WebSocket เช่น:
- ✅ Whiteboard ออนไลน์
- ✅ Chat ห้องเรียนแบบเรียลไทม์
- ✅ Document editor แบบง่าย ๆ
ลองเพิ่มระบบ login และ filter เฉพาะกลุ่มผู้ใช้ แล้วให้ WebSocket ส่งข้อมูลแยกตามห้องหรือกลุ่ม
🔜 EP. ถัดไป
EP.84: การทดสอบประสิทธิภาพ WebSocket Server ด้วยเครื่องมือ Load Testing
เราจะมาเรียนรู้วิธี Benchmark ระบบ WebSocket ด้วยเครื่องมือที่สามารถจำลองการเชื่อมต่อจำนวนมาก พร้อมวิเคราะห์ความสามารถในการรองรับ load แบบ production จริง
อ่านบทความ Series อื่นๆ
🔵 Facebook: Superdev School (Superdev)
📸 Instagram: superdevschool
🎬 TikTok: superdevschool
🌐 Website: www.superdev.school