25/04/2026 02:47น.

EP.109 การปรับปรุง Performance สำหรับ WebSocket บนมือถือ
#WebSocket บนมือถือ
#Golang
#Go
#WebSocket Server
#WebSocket
การใช้ WebSocket บนอุปกรณ์พกพา (Mobile Devices) มีข้อจำกัดเฉพาะที่แตกต่างจาก Desktop อย่างชัดเจน ไม่ว่าจะเป็น...
- ⚡ ข้อจำกัดด้านพลังงาน (Battery)
- 🌐 ความไม่เสถียรของเครือข่าย (Mobile Network)
- 🔁 การเปลี่ยนแปลงเครือข่ายแบบฉับพลัน (เช่น จาก Wi-Fi ไป 5G)
- 😴 การทำงานในโหมด Background หรือ Sleep Mode
เป้าหมายของ EP นี้: เราจะมาเรียนรู้เทคนิคและตัวอย่างโค้ดจริงสำหรับปรับปรุง WebSocket Server ให้สามารถทำงานได้ “เร็ว เสถียร และประหยัดพลังงาน” บนอุปกรณ์พกพาได้อย่างมีประสิทธิภาพในระดับ Production
🔋 1. ปัญหาหลักของ WebSocket บนมือถือ
| ปัญหา | ผลกระทบ |
|---|---|
| การเชื่อมต่อหลุดบ่อย (frequent disconnect) | ข้อมูลสูญหาย / Latency เพิ่มขึ้น |
| ใช้พลังงานมาก | แบตหมดเร็ว ผู้ใช้ปิดแอป |
| Timeout ไม่เหมาะสม | Reconnect บ่อยโดยไม่จำเป็น |
| Background mode ถูกจำกัด | Sync ข้อมูลไม่ได้แบบ real-time |
การออกแบบ WebSocket ที่ดีบนมือถือต้อง รองรับสภาวะไม่แน่นอนของเครือข่าย และ ลดภาระที่ไม่จำเป็นต่อแบตเตอรี่ อย่างมีประสิทธิภาพ
🔧 2. เทคนิคการปรับปรุงประสิทธิภาพสำหรับ Mobile
🕐 2.1 ปรับ Timeout ให้เหมาะสมกับ Mobile Network
Mobile network มี latency และ jitter สูงกว่า desktop
เพิ่มเวลารอ pongWait และลด pingPeriod ให้น้อยลง เช่น:
const (
pongWait = 30 * time.Second // ขยาย timeout จาก 10 → 30 วินาที
pingPeriod = (pongWait * 9) / 10
)
- อย่าตั้งค่า timeout ต่ำเกินไป เพราะ network drop บนมือถือพบได้บ่อย
- กรณีผู้ใช้สลับแอป อาจไม่ตอบ ping ได้ทันเวลา
🔄 2.2 ระบบ Reconnect อัตโนมัติบน Client
เมื่อการเชื่อมต่อหลุด Client ควรมี logic เชื่อมใหม่อัตโนมัติ
function connectWS() {
const ws = new WebSocket("wss://yourserver/ws");
ws.onopen = () => console.log("✅ Connected");
ws.onclose = () => {
console.log("🔁 Disconnected. Reconnecting...");
setTimeout(connectWS, 3000); // Reconnect หลัง 3 วิ
};
ws.onerror = () => ws.close();
}
connectWS();
🧠 แนะนำ: ใช้ Exponential Backoff (เพิ่มเวลารอในการ reconnect) เพื่อลดการ reconnect ถี่เกินไปบน server
🪫 2.3 ลดการใช้พลังงานของอุปกรณ์
WebSocket ที่ส่งถี่เกินไปจะกินแบตโดยไม่จำเป็น
เทคนิคที่ช่วยลดพลังงาน:
- ✅ ส่งข้อมูลแบบ Batch (รวมหลาย message ก่อนส่ง)
- ✅ ใช้ Delta Update (ส่งเฉพาะข้อมูลที่เปลี่ยน)
- ✅ ลดจำนวน Ping/Pong
ตัวอย่างใน Go:
if time.Since(lastMessageSent) > 5*time.Second {
conn.WriteMessage(websocket.TextMessage, []byte("heartbeat"))
lastMessageSent = time.Now()
}
📶 2.4 รองรับ Network Switching (Wi-Fi ↔ 4G/5G)
เมื่อ IP เปลี่ยน, WebSocket เดิมจะใช้งานไม่ได้
ให้ client ส่ง Reconnect Token (หรือ Session ID) มาใหม่ แล้วเชื่อม session เดิมกลับได้
ตัวอย่างฝั่ง Server (Go):
func handleReconnect(token string, conn *websocket.Conn) {
user, ok := sessionStore[token]
if ok {
user.Connection = conn
user.LastActive = time.Now()
log.Printf("User %s reconnected successfully\n", user.ID)
}
}
📌 อย่าลืมเก็บ Session Token ฝั่ง client แบบ secure เช่น ใน Secure Storage
🧠 3. Best Practices สำหรับ WebSocket บนมือถือ
| หัวข้อ | แนวทาง |
|---|---|
| 🔋 ประสิทธิภาพ | Batch message, ลด ping, ใช้ heartbeat |
| 🔄 ความเสถียร | เพิ่ม logic reconnect ฝั่ง client |
| 🕐 Timeout | ยืดหยุ่นกว่า desktop |
| 🌐 เครือข่าย | Reconnect Token รองรับ IP เปลี่ยน |
| 🧯 Resource | Cleanup connection zombie เสมอ |
🚀 ท้าให้ลอง!
ลองทำตามขั้นตอนนี้เพื่อทดสอบความเสถียรของ WebSocket บนมือถือ:
- เปิด WebSocket บนมือถือ
- ออกจากแอป (background)
- เปลี่ยนจาก Wi-Fi → 5G
- ดูว่าเชื่อมต่อใหม่อัตโนมัติไหม
- ดูว่า server มีการ cleanup หรือ resource leak หรือไม่
✅ หากทำครบ Server จะทำงานได้ เบา, เร็ว, ทนทาน, และ ไม่กินแบต แม้ใช้งานบนมือถือ!
🌟 EP ถัดไป:
📘 EP.110: Auto-Scaling และ Load Balancing สำหรับ WebSocket Server
เตรียมพบกับแนวทางการออกแบบ WebSocket Server ที่สามารถ ปรับขนาดตามโหลด ได้แบบอัตโนมัติด้วย Kubernetes, Load Balancer, Sticky Session, และ Redis Pub/Sub เพื่อรองรับผู้ใช้หลักหมื่นคนพร้อมกัน! ☁️⚙️
อ่านบทความ Series อื่นๆ
🔵 Facebook: https://www.facebook.com/superdev.academy.th
🔴 YouTube : Superdev Academy
📸 Instagram: Superdev Academy
🎬 TikTok: https://www.tiktok.com/@superdevacademy?lang=th-TH
🌐 Website: https://www.superdevacademy.com/