ประหยัดค่าเน็ตและค่า Server ด้วย gzip
18-08-2022 16:40:03
ปรัชญาที่สำคัญอันหนึ่งของเราในการทำระบบดิจิทัล คือต้องทำระบบที่ทุกคนเข้าถึงได้อย่างรวดเร็วและประหยัด โดยเฉพาะคนที่ใช้อุปกรณ์ Low spec หรือใช้เน็ตความเร็วไม่สูงนัก เช่น เน็ตมือถือ หรือแม้แต่เน็ตองค์กรที่แชร์กันเยอะและระบบ Network มีประสิทธิภาพไม่ค่อยดี ตามปรัชญานี้ ที่ผ่านมาก็คิดว่าทำได้ดีพอสมควร ทุกเว็บที่เราทำ หลายคนชมว่าโหลดเร็วดี ไม่เคยมีใครบ่น แต่ระยะหลังๆ ก็เริ่มเจอความท้าทาย ที่แม้จะยังไม่ใช่ปัญหา แต่จะเป็นปัญหาแน่นอนเมื่อเว็บให้บริการไปเรื่อยๆ
ปัญหานี้มาจากระบบ Search ภายในเว็บ ที่ผมมักจะออกแบบให้ดึงข้อมูลที่เป็น Text ทั้งหมดล่วงหน้ามาก่อน เมื่อผู้ใช้ทำการค้นหา ระบบจะ Filter เลือกข้อมูลที่ตรงกับการค้นหา จากข้อมูลที่โหลดไว้แล้วใน Memory ของเครื่องผู้ใช้ ทำให้สามารถแสดงผลการค้นหาได้ทันที ผู้ใช้จะไม่รู้สึกว่าต้องรอผลการค้นหาเลย
เนื่องจากรูปแบบไฟล์ที่ใช้ส่งข้อมูลผลการค้นหามาโหลดไว้ล่วงหน้า เป็นแบบ JSON ถ้าข้อมูลมีไม่เยอะมาก ขนาดอาจจะไม่ใหญ่มาก แต่ถ้าเว็บเริ่มมีข้อมูลเยอะ เช่นหลายร้อยรายการขึ้นไป ไฟล์ JSON จะมีขนาดใหญ่ขึ้นเป็นเงาตามตัว เช่นเป็นสิบ MB เป็นต้น ดังนั้น เราจึงต้องหาทางลดขนาดไฟล์ที่ขนส่งผ่าน HTTP ให้ได้
วิธีทั่วไปที่ทำได้เลย ก็คือการย่อขนาดไฟล์ที่ส่งจาก Server โดยใช้ gzip compression หลักการทำงานคือ server จะ zip ไฟล์ที่เข้าข่ายทั้งหมด ก่อนจะส่งไปยังเครื่องผู้ใช้ พอถึงเครื่องผู้ใช้ Browser จะ unzip ไฟล์เหล่านั้นเอง ทั้งหมดเกิดขึ้นทันทีโดยผู้ใช้ไม่รู้สึกว่ามีอะไรเกิดขึ้น
วิธีการก็ง่ายมาก คือการไปแก้ server configuration file เช่นใน nginx ก็แก้ nginx.conf โดยทำตามคำแนะนำ เช่น ในนี้ เป็นต้น
เมื่อลองทดสอบดู gzip สามารถลดขนาด JSON payload ลงได้เกือบ 10 เท่า และช่วยลดเวลาโหลดหน้าเว็บลงได้เล็กน้อย ประมาณ 10-30% (ดูภาพประกอบ ภาพบนคือก่อน zip ภาพล่างคือหลัง zip) เข้าใจว่าเหตุผลที่เวลาที่ใช้ลดลงไม่มาก เพราะว่าทั้ง Server และ Browser ต้องใช้เวลาไปกับการ zip และ unzip ไฟล์
ดังนั้นจะเห็นได้ว่า การย่อไฟล์ระหว่างการส่งข้อมูลมีทั้งข้อดีและข้อเสีย ข้อดีที่ชัดเจน คือลดขนาดไฟล์ที่ขนส่ง ทำให้ช่วยประหยัดทั้งค่า Data transfer ของ Server และค่าเน็ตของผู้ใช้ (โดยเฉพาะในกรณีที่ใช้เน็ตมือถือ) รวมทั้งทำให้ความเร็วในการโหลดเว็บ "อาจ" เพิ่มขึ้น อย่างไรก็ตาม ข้อเสียคือการย่อไฟล์ต้องใช้พลังของ CPU ทั้งสองฝั่ง ซึ่งในฝั่ง Server อาจทำให้เกิดปัญหา CPU throttle เวลาคนเข้าเว็บพร้อมกันเยอะๆ ส่วนในฝั่งผู้ใช้อาจเกิดปัญหาในกรณีผู้ใช้ใช้อุปกรณ์ที่ Spec ต่ำมากๆ
ประโยชน์ของการ zip จะชัดเจนขึ้นเรื่อยๆ เมื่อเว็บมี payload ขนาดใหญ่ขึ้น โดยเฉพาะ payload ที่อยู่ในรูปแบบที่ zip ได้ดี คือ text-based ทั้งหมด เช่น JSON เป็นต้น ซึ่งมีแนวโน้มจะมีขนาดใหญ่ขึ้นเรื่อยๆ เมื่อเว็บมีเนื้อหามากขึ้น