การดู : 0

12/04/2026 18:17น.

EP.83 การใช้ WebSocket สร้างแอปพลิเคชันแบบ Collaborative

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