การดู : 0

12/04/2026 18:15น.

Ep.26 Go กับ Compression บน WebSocket - ลดขนาดข้อมูล เพิ่มความเร็ว!

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 เพื่อให้เหมาะสมกับการใช้งาน