12/04/2026 18:15น.

Ep.26 Go กับ Compression บน WebSocket - ลดขนาดข้อมูล เพิ่มความเร็ว!
#Go
#Golang
#ภาษา Go
#Compression
#WebSocket
#ลดขนาดข้อมูล
#เพิ่มความเร็ว
#Per-Message Deflate
#การศึกษาการเขียนโปรแกรม
#การเขียนโปรแกรม
#การเขียนโปรแกรม Go
#การเขียนโปรแกรมสำหรับมือใหม่
#ฝึกเขียนโปรแกรม
#ภาษาโปรแกรม
#โปรแกรม
#ภาษาโปรแกรมมิ่ง
#โปรแกรมเมอร์
#Superdev School
Go กับ Compression บน WebSocket - ลดขนาดข้อมูล เพิ่มความเร็ว!
ใน EP นี้ เราจะเรียนรู้การทำ Compression หรือการบีบอัดข้อมูลบน WebSocket เพื่อช่วยลดขนาดของข้อมูลที่ส่งผ่านเครือข่าย และเพิ่มประสิทธิภาพของการสื่อสารในระบบของคุณครับ
Compression คืออะไร?
Compression คือการลดขนาดของข้อมูลก่อนที่จะส่งไปยังปลายทาง เพื่อ :
1. ลดการใช้แบนด์วิดท์ (Bandwidth)
2. เพิ่มความเร็วในการส่งข้อมูล
3. ลดเวลาแฝง (Latency)
ข้อดีของ Compression บน WebSocket
- เหมาะกับข้อมูลขนาดใหญ่ เช่น JSON หรือข้อความยาว
- เพิ่มความเร็วในการโหลดข้อมูล สำหรับเครือข่ายที่มีข้อจำกัด
- ลดค่าใช้จ่าย โดยเฉพาะในระบบที่มีการคิดค่าบริการตามแบนด์วิดท์
การใช้ Per-Message Deflate บน WebSocket
Per-Message Deflate เป็นหนึ่งในวิธีบีบอัดข้อมูลที่ได้รับการรองรับมาตรฐานใน WebSocket และสามารถใช้งานได้ง่ายใน Go ผ่านแพ็กเกจ github.com/gorilla/websocket
ขั้นตอนการเปิดใช้งาน Compression
1. ใช้ EnableCompression เพื่อเปิดใช้งานการบีบอัด
2. ใช้ SetCompressionLevel เพื่อกำหนดระดับการบีบอัด
ในตัวอย่างนี้ :
เปิดใช้งาน Compression ด้วย EnableCompression : true
WebSocket จะบีบอัดข้อมูลอัตโนมัติเมื่อส่งข้อความระหว่างเซิร์ฟเวอร์และไคลเอนต์
ตัวอย่างการเปิดใช้งาน Compression บน WebSocket Server
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
EnableCompression: true, // เปิดใช้งาน Compression
}
func handleConnections(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Error upgrading connection:", err)
return
}
defer conn.Close()
log.Println("New client connected")
for {
_, msg, err := conn.ReadMessage()
if err != nil {
log.Println("Error reading message:", err)
break
}
log.Printf("Received: %s", msg)
if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("Error writing message:", err)
break
}
}
}
func main() {
http.HandleFunc("/ws", handleConnections)
log.Println("WebSocket server with compression started at :8080/ws")
http.ListenAndServe(":8080", nil)
}
การตั้งค่า Compression Level
หากต้องการปรับระดับการบีบอัด สามารถใช้ SetCompressionLevel จากแพ็กเกจ compress/flate:
ระดับการบีบอัดที่แนะนำ :
flate.BestSpeed : สำหรับการบีบอัดที่รวดเร็ว
flate.BestCompression : สำหรับการบีบอัดสูงสุด
flate.DefaultCompression : ค่ามาตรฐาน
import "compress/flate"
// ตั้งค่าระดับการบีบอัด
conn.SetCompressionLevel(flate.BestCompression) // บีบอัดสูงสุดการเปิดใช้งาน Compression บน WebSocket Client
WebSocket Client ต้องรองรับ Compression เช่นกัน โดยใน JavaScript WebSocket API จะรองรับการบีบอัดอัตโนมัติหากเซิร์ฟเวอร์เปิดใช้งาน
ตัวอย่างโค้ดฝั่ง Client :
const socket = new WebSocket("ws://localhost:8080/ws");
socket.onopen = () => {
console.log("Connected to server with compression");
socket.send("Hello from client!");
};
socket.onmessage = (event) => {
console.log("Received:", event.data);
};
การตรวจสอบ Compression
1. การตรวจสอบด้วย Wireshark หรือ DevTools
ใช้ Wireshark จับข้อมูลแพ็กเก็ตและดูขนาดข้อมูล
ใช้ Developer Tools ของเบราว์เซอร์เพื่อตรวจสอบ Traffic ใน WebSocket
2. การบันทึกขนาดข้อความก่อนและหลังบีบอัด
สามารถบันทึกขนาดข้อความเพื่อดูผลลัพธ์ของการบีบอัด :
ตัวอย่าง :
log.Printf("Original size: %d bytes", len(originalMessage))
log.Printf("Compressed size: %d bytes", len(compressedMessage))
สรุปง่ายๆ
- Compression ช่วยลดขนาดของข้อมูลและเพิ่มความเร็วในการสื่อสาร
- ใช้ EnableCompression เพื่อเปิดใช้งาน Compression บน WebSocket
- ปรับระดับ Compression ด้วย SetCompressionLevel เพื่อให้เหมาะสมกับการใช้งาน