การดู : 241

25/04/2026 02:47น.

EP.109 การปรับปรุง Performance สำหรับ WebSocket บนมือถือ

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 เปลี่ยน
🧯 ResourceCleanup connection zombie เสมอ

 

🚀 ท้าให้ลอง!

 

ลองทำตามขั้นตอนนี้เพื่อทดสอบความเสถียรของ WebSocket บนมือถือ:

  1. เปิด WebSocket บนมือถือ
  2. ออกจากแอป (background)
  3. เปลี่ยนจาก Wi-Fi → 5G
  4. ดูว่าเชื่อมต่อใหม่อัตโนมัติไหม
  5. ดูว่า 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/