12/04/2026 18:17น.

EP.84 การทดสอบประสิทธิภาพของ WebSocket Server ด้วย Load Testing
#Go
#Golang
#WebSocket
#Load Testing
#WebSocket Server
#Go Benchmark
ในการพัฒนา WebSocket Server สำหรับแอปพลิเคชันแบบเรียลไทม์ เช่น Chat, Collaborative Editor หรือ Live Dashboard การรู้ว่าเซิร์ฟเวอร์ของเรารองรับผู้ใช้งานพร้อมกันได้มากแค่ไหนเป็นเรื่องสำคัญ
บทความนี้จะพาคุณเรียนรู้วิธี Benchmark และ Load Testing ระบบ WebSocket อย่างเป็นระบบ พร้อมตัวอย่างการใช้งานจริงและแนวทางวิเคราะห์ผลลัพธ์เพื่อเตรียมระบบให้พร้อมใช้งานระดับ Production
🔹 ทำไมต้องทดสอบ Load ของ WebSocket?
WebSocket ไม่เหมือน HTTP ทั่วไป เพราะเป็นการเชื่อมต่อแบบ Persistent (เชื่อมต่อค้างไว้ตลอด) ซึ่งทำให้รูปแบบการทดสอบและการใช้ทรัพยากรต่างไปจาก HTTP ปกติ
ปัญหาที่อาจเกิดขึ้นหากไม่ทดสอบ:
- Latency สูง เมื่อมีผู้ใช้งานจำนวนมาก
- การเชื่อมต่อหลุด (Connection Drop)
- Server crash จาก resource usage ที่ไม่คาดคิด
การทดสอบ Load ช่วยให้เราทราบข้อจำกัดของระบบทั้งด้าน:
- ความจุ (Capacity)
- ความเร็วในการตอบกลับ (Latency)
- ปริมาณการส่งข้อมูล (Throughput)
🔹 เครื่องมือ Load Testing ยอดนิยมสำหรับ WebSocket
| เครื่องมือ | จุดเด่น |
|---|---|
| k6 | เขียน script ด้วย JavaScript, ใช้งานง่าย, เหมาะกับ WebSocket |
| Gatling | รองรับการจำลองผู้ใช้แบบ scriptable และตั้งค่า flow ซับซ้อนได้ |
| Locust | ใช้ Python เขียน scenario ได้ยืดหยุ่นมาก |
| Artillery | ใช้งานง่าย, รองรับทั้ง HTTP และ WebSocket |
🔹 ตัวอย่างการทดสอบ WebSocket Server ด้วย k6
import ws from 'k6/ws';
import { check } from 'k6';
import { sleep } from 'k6';
export let options = {
vus: 100, // จำนวน Virtual Users (ผู้ใช้จำลอง)
duration: '30s', // ระยะเวลาทดสอบ
};
export default function () {
const url = 'ws://localhost:8080/ws';
const response = ws.connect(url, {}, function (socket) {
socket.on('open', function () {
console.log('Connected');
socket.send(JSON.stringify({ type: 'ping' }));
});
socket.on('message', function (message) {
check(message, {
'Message received': (msg) => msg.length > 0,
});
});
socket.on('close', function () {
console.log('Disconnected');
});
sleep(1); // รอให้เชื่อมต่อค้างไว้ 1 วินาที
});
check(response, {
'Connected successfully': (r) => r && r.status === 101,
});
}
คำอธิบาย:
vus: จำนวนผู้ใช้จำลองพร้อมกันduration: ระยะเวลาทดสอบws.connect: เชื่อมต่อกับ WebSocket serversocket.send: ส่งข้อความ pingsocket.on('message'): รับข้อความจากเซิร์ฟเวอร์check: ตรวจสอบว่าการตอบสนองถูกต้องหรือไม่
🔹 วิเคราะห์ผลหลังทดสอบ
หลังจากทดสอบด้วย k6 หรือเครื่องมืออื่น ๆ แล้ว คุณจะได้ข้อมูลที่สำคัญ เช่น:
| Metric | ความหมาย |
|---|---|
| Throughput | จำนวนข้อความที่ส่งได้ต่อวินาที |
| Latency | เวลาตอบสนองเฉลี่ยของ server |
| Connection Errors | จำนวนครั้งที่เชื่อมต่อไม่สำเร็จ |
| CPU / Memory | การใช้งานทรัพยากรของ server |
ตัวอย่างผลลัพธ์จาก k6:
Virtual Users: 100
Duration: 30s
Avg Response Time: 25ms
Max Response Time: 120ms
Connection Errors: 0
จากผลนี้ เราสามารถประเมินได้ว่า:
- ระบบตอบสนองรวดเร็วพอหรือไม่
- ควรเพิ่มจำนวน instance หรือ scale แบบ horizontal หรือไม่
🔹 Best Practices สำหรับ Load Testing
| แนวทาง | อธิบาย |
|---|---|
| เริ่มจาก Load น้อย → มาก | เพื่อดูว่าเมื่อไหร่ระบบเริ่มรับไม่ไหว |
| ทดสอบทั้งความถี่และขนาดข้อความ | ไม่ใช่แค่จำนวน user แต่รวมถึง payload |
| Monitor CPU/RAM ไปพร้อมกัน | ใช้ tools อย่าง htop, prometheus, grafana |
| จำลองหลายกลุ่มผู้ใช้ | เพิ่มความใกล้เคียงระบบจริง |
🚀 ท้าให้ลอง!
ทดลอง Load Test WebSocket Server ของคุณเอง:
- เขียน Script ด้วย k6 หรือ Locust
- ส่งข้อความหลากหลายประเภท
- วิเคราะห์ผล และปรับปรุงโค้ดหรือ infrastructure ให้แข็งแรง
🔜 EP. ถัดไป:
EP.85 การพัฒนา WebSocket Server ด้วยการใช้ GraphQL
เราจะพาคุณไปรู้จักแนวคิดการใช้ GraphQL Subscriptions ร่วมกับ WebSocket เพื่อพัฒนาแอปพลิเคชันแบบเรียลไทม์ที่มีโครงสร้างข้อมูลยืดหยุ่นและควบคุม payload ได้ดีกว่า REST
อ่านบทความ Series อื่นๆ
🔵 Facebook: https://www.facebook.com/superdev.academy.th
📸 Instagram: superdevschool
🎬 TikTok: https://www.tiktok.com/@superdevacademy?lang=th-TH
🌐 Website: https://www.superdevacademy.com/