2 นาที

ZSTD vs Brotli vs GZIP: การเลือกการบีบอัดสำหรับ API

เปรียบเทียบ ZSTD, Brotli และ GZIP สำหรับ API: ความเร็ว อัตราส่วน การใช้ CPU และค่าตั้งต้นเชิงปฏิบัติสำหรับ payload JSON และไบนารีในโปรดักชัน

ZSTD vs Brotli vs GZIP: การเลือกการบีบอัดสำหรับ API

สิ่งที่การบีบอัด API คือ (และเมื่อใดที่คุ้มค่า)

การบีบอัดการตอบกลับของ API หมายถึงเซิร์ฟเวอร์ของคุณเข้ารหัสเนื้อหาการตอบกลับ (มักจะเป็น JSON) ให้เป็นสตรีมไบต์ที่เล็กลงก่อนส่งผ่านเครือข่าย ไคลเอนต์ (เบราว์เซอร์ แอปมือถือ SDK หรือบริการอื่น) จะถอดการบีบอัดนั้นก่อนใช้งาน บน HTTP การเจรจานี้ทำผ่านเฮดเดอร์อย่าง Accept-Encoding (ไคลเอนต์รองรับอะไร) และ Content-Encoding (เซิร์ฟเวอร์เลือกอะไร)

สิ่งที่มันทำให้กับ API

การบีบอัดให้ประโยชน์หลักๆ สามอย่าง:

  • ลดแบนด์วิดธ์: การตอบกลับที่เล็กลงใช้ไบต์น้อยลงทั้งระบบ
  • ลดความหน่วงบนลิงก์ที่จำกัด: ไบต์ที่น้อยลงมักหมายถึงดาวน์โหลดเร็วขึ้นบนมือถือ ไวไฟที่แออัด และการเรียกข้ามภูมิภาค
  • ลดค่าขาออก: หากคุณจ่ายค่าข้อมูลขาออก การลดขนาดการถ่ายโอนสามารถลดบิลได้โดยตรง

การแลกเปลี่ยนชัดเจน: การบีบอัดประหยัดแบนด์วิดธ์แต่แลกกับ CPU (การบีบอัด/ถอดการบีบอัด) และบางครั้ง หน่วยความจำ (บัฟเฟอร์) ว่าคุ้มหรือไม่ขึ้นกับคอขวดของคุณ

เมื่อการบีบอัดได้ผลมากที่สุด

การบีบอัดเด่นเมื่อการตอบกลับเป็น:

  • ข้อความเยอะและซ้ำกันบ่อย เช่น JSON, การตอบ GraphQL, HTML หรือบันทึก
  • ขนาดกลางถึงใหญ่ ที่การลดหลายสิบหรือหลายร้อยกิโลไบต์มีความหมาย
  • ให้บริการบนเครือข่ายช้า/มีค่าใช้จ่ายสูง เช่น บนมือถือ ลูกค้าต่างประเทศ หรือติดต่อข้ามภูมิภาค

ถ้าคุณส่งรายการ JSON ขนาดใหญ่ (แคตตาล็อก ผลลัพธ์การค้นหา ข้อมูลวิเคราะห์) การบีบอัดมักเป็นหนึ่งในวิธีที่ทำได้ง่ายสุดเพื่อปรับปรุงประสิทธิภาพ

เมื่อการบีบอัดช่วยได้น้อย

การบีบอัดมักไม่คุ้มเมื่อการตอบกลับเป็น:

  • เล็กมาก (เช่น ไม่กี่ร้อยไบต์) ค่าใช้จ่ายของเฮดเดอร์และ CPU อาจมากกว่าการประหยัด
  • บีบอัดแล้วก่อนหน้า (JPEG/PNG MP4 ZIP PDF หลายไฟล์) การบีบอัดซ้ำมักให้ผลลดลงเล็กน้อยหรือเพิ่มขนาดได้
  • บริการที่ติดขัดด้วย CPU (endpoint ที่รันหนักอยู่แล้ว) การเพิ่มการบีบอัดอาจเพิ่ม tail latency

แกนการตัดสินใจที่คุณจะใช้ตลอดไกด์นี้

เมื่อเลือกระหว่าง ZSTD vs Brotli vs GZIP สำหรับการบีบอัด API การตัดสินใจเชิงปฏิบัติมักขึ้นกับ:

  1. การลดขนาด (compression ratio)
  2. ความหน่วงเวลา (เวลาเริ่มส่งไบต์จากเซิร์ฟเวอร์รวมกับเวลาถอดรหัสของไคลเอนต์)
  3. การรองรับไคลเอนต์ (ผู้เรียกและตัวกลางรองรับอะไรบ้าง)

ที่เหลือในบทความนี้คือการถ่วงดุลทั้งสามข้อให้เข้ากับ API และรูปแบบทราฟิกของคุณ

ZSTD vs Brotli vs GZIP: เปรียบเทียบอย่างรวดเร็ว

ทั้งสามแบบลดขนาด payload แต่แต่ละแบบมีการปรับจูนให้เหมาะกับข้อจำกัดต่างกัน—ความเร็ว อัตราส่วนการบีบอัด และความเข้ากันได้

สรุปแบบภาพเดียว

  • ZSTD (Zstandard): มักเป็นสมดุลที่ดีที่สุดสำหรับ API เมื่อคุณให้ความสำคัญกับ latency ต่ำและ CPU ที่คาดเดาได้ อัตราส่วนดีโดยไม่ช้า
  • Brotli: มักชนะในแง่ ขนาดเล็กสุดบนสาย โดยเฉพาะสำหรับการตอบข้อความเยอะ (JSON, เนื้อหาแบบ HTML) การตั้งค่าสูงขึ้นอาจใช้ CPU มากกว่า
  • GZIP: เป็นทางเลือก "ใช้งานได้ทุกที่" รองรับอย่างกว้างขวางและง่ายในการใช้งาน แต่โดยทั่วไปมัก ช้ากว่าหรือให้ขนาดใหญ่กว่า ทางเลือกสมัยใหม่เทียบกับงบ CPU เดียวกัน

จุดแข็งปกติ (และความหมายสำหรับ API)

ความเร็วของ ZSTD: ดีเมื่อ API ของคุณอ่อนไหวต่อ tail latency หรือเซิร์ฟเวอร์ของคุณผูกมัดด้วย CPU มันสามารถบีบอัดได้เร็วพอที่ค่าโอเวอร์เฮดมักไม่น่าสำคัญเมื่อเทียบกับเวลาเครือข่าย—โดยเฉพาะการตอบ JSON ขนาดกลางถึงใหญ่

อัตราส่วนการบีบอัดของ Brotli: ดีที่สุดเมื่อแบนด์วิดธ์เป็นปัจจัยหลัก (ไคลเอนต์มือถือ ค่า egress สูง จัดส่งผ่าน CDN) และการตอบเป็นข้อความเสียส่วนใหญ่ ขนาดเล็กกว่าอาจคุ้มค่าแม้การบีบอัดจะใช้เวลามากขึ้น

ความเข้ากันได้ของ GZIP: ดีที่สุดเมื่อคุณต้องการการรองรับไคลเอนต์สูงสุดโดยความเสี่ยงเจรจาน้อย (SDK เก่า ไคลเอนต์ฝังตัว พร็อกซีเดิม) มันเป็นพื้นฐานที่ปลอดภัยแม้จะไม่ใช่ตัวที่ดีที่สุดเสมอไป

"ระดับการบีบอัด" เปลี่ยนแปลงอะไรจริงๆ

"ระดับ" การบีบอัดคือพรีเซ็ตที่แลก เวลา CPU กับ ขนาดเอาต์พุตที่เล็กกว่า:

  • ระดับต่ำ: การบีบอัดเร็วขึ้น ขนาดใหญ่กว่า เหมาะกับ API แบบเรียลไทม์
  • ระดับสูง: ขนาดเล็กกว่า แต่ช้าลง (และบางครั้งใช้หน่วยความจำมากขึ้น) เหมาะกับการตอบที่ใหญ่และแคชได้

การถอดการบีบอัดโดยทั่วไปถูกกว่าการบีบอัดสำหรับทั้งสามแบบ แต่ระดับสูงมากยังสามารถเพิ่มภาระ CPU ของไคลเอนต์—สำคัญกับมือถือ

กฎง่ายๆ

  • ตัวเลือกเริ่มต้น: ใช้ ZSTD สำหรับ API JSON/REST/GraphQL ส่วนใหญ่ที่ latency สำคัญ
  • สลับไป Brotli: เมื่อคุณมุ่งเน้นที่ ขนาดต่ำสุดบนสาย (การตอบข้อความเยอะ การจัดส่งผ่าน CDN เครือข่ายช้า) และรับภาระ CPU เพิ่มได้
  • ยึดกับ GZIP: เมื่อคุณต้องการ ความเข้ากันได้กว้าง หรือโครงสร้างพื้นฐาน/เครื่องมือของคุณไม่รองรับการเข้ารหัสใหม่ๆ

อัตราส่วนการบีบอัดกับความหน่วง: การแลกเปลี่ยนหลัก

การบีบอัดมักถูกขายว่า “การตอบเล็กลง = API เร็วขึ้น” ซึ่งมักเป็นจริงบนเครือข่ายช้า/แพง—แต่ไม่ใช่เสมอไป หากการบีบอัดเพิ่มเวลาการใช้ CPU ของเซิร์ฟเวอร์มากพอ คุณอาจได้คำขอที่ช้าลงแม้ไบต์จะน้อยลง

เวลาหมดลงที่ไหน

ช่วยแยกค่าใช้จ่ายออกเป็นสองส่วน:

  • เวลาในการบีบอัด (ฝั่งเซิร์ฟเวอร์): งานก่อนที่เซิร์ฟเวอร์จะเริ่มส่งไบต์ ซึ่งสามารถเพิ่มเวลาในการตอบโดยตรง (TTFB)
  • เวลาในการถอดการบีบอัด (ฝั่งไคลเอนต์): งานหลังจากได้รับไบต์ โดยทั่วไปถูกกว่า แต่มีผลบนอุปกรณ์กำลังต่ำหรือไคลเอนต์ที่ต้องประมวลผลสูง

อัตราส่วนการบีบอัดสูงสามารถลดเวลาในการส่ง แต่ถ้าการบีบอัดเพิ่ม (เช่น) 15–30 ms ต่อการตอบ คุณอาจเสียเวลามากกว่าที่ประหยัด—โดยเฉพาะบนการเชื่อมต่อที่เร็ว

กับดัก tail-latency เมื่อมีโหลดสูง

ภายใต้โหลด การบีบอัดสามารถทำร้าย p95/p99 latency มากกว่า p50 เมื่อการใช้ CPU พุ่ง คำร้องจะรอคิว การรอคิวจะขยายค่าใช้จ่ายต่อคำร้องเล็กๆ ให้กลายเป็นความหน่วงใหญ่—ค่าเฉลี่ยอาจดูโอเค แต่ผู้ใช้ช้าที่สุดจะได้รับผลกระทบมาก

วัดมันเหมือนฟีเจอร์ประสิทธิภาพ

อย่าเดา รัน A/B test หรือการเปิดตัวแบบค่อยเป็นค่อยไปและเปรียบเทียบ:

  • p50 และ p95 latency (และถ้าเป็นไปได้ p99)
  • การใช้ CPU และการอิ่มตัว ของอินสแตนซ์ API
  • ขนาดการตอบและเวลาเริ่มส่งไบต์ (TTFB)

ทดสอบด้วยรูปแบบทราฟิกและ payload ที่สมจริง ระดับการบีบอัดที่ดีที่สุดคือระดับที่ลดเวลารวม ไม่ใช่แค่ไบต์

ค่า CPU และหน่วยความจำที่ฝั่งเซิร์ฟเวอร์และไคลเอนต์

สร้างร่วมกับทีมของคุณ
พาทีมของคุณมาทำงานใน workspace เดียวกันเพื่อสร้าง ปรับใช้ และทบทวนการเปลี่ยนแปลงด้านประสิทธิภาพด้วยกัน

การบีบอัดไม่ฟรี—มันย้ายงานจากเครือข่ายไปยัง CPU และหน่วยความจำทั้งสองด้าน ใน API นั่นแปลว่าเวลาจัดการคำร้องเพิ่ม ขนาดหน่วยความจำต่อคำร้องเพิ่ม และบางครั้งไคลเอนต์ช้าลง

CPU ใช้ไปที่ไหน

CPU ส่วนมากใช้ไปกับการบีบอัด การตอบกลับ การบีบอัดต้องหาลวดลาย สร้างสถานะ/พจนานุกรม และเขียนผลลัพธ์ที่เข้ารหัส

การถอดการบีบอัดถูกกว่าตามปกติ แต่ยังสำคัญ:

  • เซิร์ฟเวอร์ อาจถอดการบีบอัด คำขอ (ไม่บ่อยสำหรับ API JSON แต่พบบ่อยกับการอัปโหลดหรือ batch event)
  • ไคลเอนต์ ถอดการบีบอัด การตอบกลับ ก่อนจะ parse JSON ซึ่งเป็นเส้นทางวิกฤต

หาก API ของคุณผูกมัดด้วย CPU อยู่แล้ว การเปิดการบีบอัดระดับสูงสามารถเพิ่ม tail latency แม้ payload จะหดลง

พิจารณาหน่วยความจำ

การบีบอัดอาจเพิ่มการใช้หน่วยความจำในหลายทาง:

  • บัฟเฟอร์: การใช้งานต้องการบัฟเฟอร์อินพุต/เอาต์พุต ขนาด payload ที่ใหญ่ขึ้นหมายถึงบัฟเฟอร์ใหญ่ขึ้น
  • การบัฟเฟอร์เต็ม vs การสตรีม: การบีบอัดแบบสตรีมเริ่มส่งก่อนและทำให้หน่วยความจำคงที่กว่า ในขณะที่การบัฟเฟอร์เต็มสามารถเพิ่ม peak memory ต่อคำร้องได้

ในสภาพแวดล้อมคอนเทนเนอร์ peak memory สูงอาจทำให้เกิด OOM kill หรือต้องตั้งข้อจำกัดแคบลงซึ่งลดความหนาแน่นของการใช้งานได้

ผลกระทบต่อ autoscaling และขีดจำกัดคอนเทนเนอร์

การบีบอัดเพิ่มรอบ CPU ต่อการตอบ ลด throughput ต่ออินสแตนซ์ ส่งผลให้ออโต้สเกลเกิดขึ้นเร็วขึ้นและเพิ่มค่าใช้จ่าย รูปแบบทั่วไป: แบนด์วิดธ์ลดแต่การใช้ CPU เพิ่ม—ดังนั้นการเลือกที่ถูกต้องขึ้นกับทรัพยากรไหนที่คุณขาดแคลน

ทำไมความเร็วถอดการบีบอัดสำคัญสำหรับไคลเอนต์

บนมือถือหรืออุปกรณ์กำลังต่ำ การถอดการบีบอัดแข่งกับการเรนเดอร์ การประมวลผล JavaScript และแบตเตอรี่ รูปแบบที่ประหยัดไม่กี่ KB แต่ใช้เวลาถอดนานกว่าอาจรู้สึกช้ากว่า โดยเฉพาะเมื่อ "เวลาไปสู่ข้อมูลที่ใช้งานได้" สำคัญ

ZSTD สำหรับ API: จุดแข็ง ข้อจำกัด และค่าปรับเริ่มต้นที่ดี

Zstandard (ZSTD) เป็นฟอร์แมตร่วมสมัยที่ออกแบบมาเพื่อให้ได้อัตราส่วนที่ดีโดยไม่ทำให้ API ช้าลง สำหรับ API ที่เน้น JSON เป็นส่วนใหญ่ มันเป็นค่า "ดีฟอลต์" ที่แข็งแรง: ตอบกลับเล็กกว่า GZIP อย่างชัดเจนที่ latency เท่าเดิมหรือน้อยกว่า และการถอดการบีบอัดบนไคลเอนต์เร็วมาก

ZSTD เหมาะที่สุดกับอะไร

ZSTD มีค่าสูงเมื่อคุณใส่ใจเวลาแบบ end-to-end ไม่ใช่แค่ไบต์เล็กที่สุด มันมักบีบอัดเร็วและถอดการบีบอัดได้เร็วมาก—เป็นประโยชน์สำหรับ API ที่ทุกมิลลิวินาทีของ CPU แข่งขันกับการจัดการคำร้อง

มันทำงานได้ดีในช่วงขนาด payload กว้าง: JSON ขนาดเล็กถึงกลางมักเห็นประโยชน์ ขณะที่การตอบขนาดใหญ่ได้ประโยชน์มากขึ้นอีก

ระดับการบีบอัดที่สมเหตุสมผลสำหรับ API

สำหรับ API ส่วนใหญ่ เริ่มด้วยระดับต่ำ (โดยทั่วไประดับ 1–3) ซึ่งมักให้การแลกเปลี่ยนระหว่าง latency/ขนาดที่ดีที่สุด

ใช้ระดับสูงเฉพาะเมื่อ:

  • Payload ใหญ่ (หลายร้อย KB ถึง MB)
  • แบนด์วิดธ์แพงหรือติดข้อจำกัด
  • คุณวัดแล้วว่า CPU ไม่ใช่คอขวด

แนวทางปฏิบัติที่เป็นเหตุผลคือใช้ดีฟอลต์ต่ำทั่วทั้งระบบ แล้วเพิ่มระดับเฉพาะเส้นทางที่ตอบกลับใหญ่ๆ

สตรีมมิ่งและโหมดพจนานุกรม

ZSTD รองรับการสตรีม ซึ่งช่วยลด peak memory และเริ่มส่งข้อมูลได้เร็วขึ้นสำหรับการตอบขนาดใหญ่

โหมดพจนานุกรมช่วยได้มากสำหรับ API ที่ส่งวัตถุที่คล้ายกันบ่อยครั้ง (คีย์ซ้ำ โครงสร้างคงที่) เหมาะเมื่อ:

  • Payload ค่อนข้างเล็กแต่เกิดบ่อย
  • คุณจัดการพจนานุกรมที่มีเวอร์ชันได้อย่างปลอดภัย

ข้อจำกัดด้านความเข้ากันได้ที่ควรระวัง

การรองรับฝั่งเซิร์ฟเวอร์ทำได้โดยตรงในสแตกหลายตัว แต่ความเข้ากันได้ของไคลเอนต์อาจเป็นตัวตัดสิน บางไคลเอนต์ HTTP พร็อกซี และเกตเวย์อาจไม่ประกาศหรือยอมรับ Content-Encoding: zstd โดยดี

ถ้าคุณให้บริการผู้บริโภคภายนอก ให้มี fallback (โดยปกติคือ GZIP) และเปิดใช้ ZSTD ก็ต่อเมื่อ Accept-Encoding ระบุชัดเจนว่ารองรับมัน

Brotli สำหรับ API: เมื่อชนะและเมื่อไม่ควรใช้

เปลี่ยนบทเรียนเป็นเครดิต
รับเครดิตโดยการแบ่งปันสิ่งที่คุณเรียนรู้จากการสร้างและปรับจูน API บน Koder.ai

Brotli ออกแบบมาให้บีบอัดข้อความได้น้อยสุด ใน JSON HTML และ payload อื่นๆ ที่มีคำมาก มันมักชนะ GZIP ในอัตราส่วนการบีบอัด—โดยเฉพาะที่ระดับการบีบอัดสูงๆ

จุดที่ Brotli ชนะ

การตอบข้อความเยอะเป็นจุดแข็งของ Brotli ถ้า API ของคุณส่งเอกสาร JSON ขนาดใหญ่ (แคตตาล็อก ผลลัพธ์การค้นหา บล็อบการตั้งค่า) Brotli สามารถลดไบต์ได้อย่างเห็นได้ชัด ช่วยบนเครือข่ายช้าและลดค่า egress

Brotli ยังดีเมื่อคุณสามารถ บีบอัดครั้งเดียวแล้วให้บริการหลายครั้ง (การตอบที่แคชได้ ทรัพยากรที่มีเวอร์ชัน) ในกรณีนั้นระดับ Brotli สูงๆ คุ้มเมื่อค่า CPU ถูกเฉลี่ยบนหลายคำขอ

จุดที่ Brotli ทำให้ผิดหวัง

สำหรับการตอบแบบไดนามิกที่สร้างตามคำขอ (ไม่มีการแคช) อัตราส่วนที่ดีที่สุดของ Brotli มักต้องระดับสูงซึ่งกิน CPU มากและเพิ่มความหน่วง เมื่อคำนึงถึงเวลาในการบีบอัดแล้ว ผลลัพธ์จริงเหนือกว่า ZSTD (หรือ GZIP ปรับแต่งดี) อาจน้อยกว่าที่คาด

นอกจากนี้ Brotli น้อยน่าสนใจสำหรับ payload ที่ไม่บีบอัดได้ดี (ข้อมูลที่บีบอัดแล้ว ฟอร์แมตไบนารีบางแบบ) ในกรณีนั้นคุณจะเผาผลาญ CPU เปล่าๆ

แนะนำระดับการใช้งาน

  • การบีบอัดเวลารันไทม์: ใช้ระดับต่ำ (โดยทั่วไป 1–4) เพื่อหลีกเลี่ยงการสปายค์ของ CPU
  • บีบอัดล่วงหน้า/คงที่: ระดับสูง (มัก 8–11) คุ้มเมื่อเฉลี่ยบนหลายคำขอ

หมายเหตุการรองรับไคลเอนต์

เบราว์เซอร์รองรับ Brotli ดีผ่าน HTTPS ซึ่งเป็นเหตุผลที่มันเป็นที่นิยมสำหรับทราฟฟิกเว็บ สำหรับไคลเอนต์ API ที่ไม่ใช่เบราว์เซอร์ (SDK มือถือ อุปกรณ์ IoT สแต็ก HTTP เก่า) การรองรับอาจไม่สม่ำเสมอ—ดังนั้นเจรจาให้ถูกต้องผ่าน Accept-Encoding และเก็บ fallback (ปกติคือ GZIP)

คำถามที่พบบ่อย

เมื่อใดที่การบีบอัดการตอบกลับ API คุ้มค่าที่จะเปิดใช้งาน?

ใช้การบีบอัดการตอบกลับเมื่อการตอบกลับเป็นข้อความเยอะ (JSON/GraphQL/XML/HTML) ขนาดปานกลางถึงใหญ่ และผู้ใช้ของคุณอยู่ในเครือข่ายที่ช้า/แพง หรือคุณจ่ายค่าทราฟฟิกขาออกที่สำคัญ ให้ข้ามการบีบอัด (หรือเพิ่มเกณฑ์ให้สูง) สำหรับการตอบกลับขนาดเล็ก สื่อที่บีบอัดแล้ว (JPEG/MP4/ZIP/PDF) และบริการที่ใช้งาน CPU หนักซึ่งงานต่อคำร้องเพิ่มจะทำให้ p95/p99 แย่ลง

ทำไมการบีบอัดถึงทำให้ API ช้าลงทั้งที่การตอบกลับเล็กลง?

เพราะมันแลกแบนด์วิดธ์กับ CPU (และบางครั้งหน่วยความจำ) เวลาการบีบอัดอาจทำให้เซิร์ฟเวอร์เริ่มส่งไบต์ช้าลง (TTFB) และตอนที่มีโหลดสูงจะทำให้คำร้องรอคิว—บ่อยครั้งจะทำให้ tail latency แย่ลง แม้ว่าขนาด payload จะเล็กลง การตั้งค่าที่ “ดีที่สุด” คือค่าที่ลดเวลาแบบ end-to-end ไม่ใช่แค่ลดขนาดไบต์

ฉันควรเลือกใช้ ZSTD, Brotli, หรือ GZIP อย่างไร?

ลำดับค่าดีฟอลต์ที่ปฏิบัติได้สำหรับหลาย API คือ:

  • zstd เป็นอันดับแรก (เร็ว อัตราส่วนดี)
  • ตามด้วย br (มักจะเล็กที่สุดสำหรับข้อความ แต่ใช้ CPU มากกว่าได้)
  • แล้ว gzip (เข้ากันได้กว้างที่สุด)

ท้ายที่สุดให้เลือกตามที่ไคลเอนต์ระบุใน Accept-Encoding และเก็บ fallback ที่ปลอดภัย (ปกติคือ gzip หรือ identity)

ระดับการบีบอัดแบบไหนที่เหมาะสมเป็นค่าเริ่มต้นสำหรับการตอบกลับ API แบบไดนามิก?

เริ่มด้วยค่าต่ำและวัดผล

  • ZSTD: ระดับ 1–3 (หรือขึ้นถึง 3–5) สำหรับ API JSON แบบไดนามิกส่วนใหญ่
  • Brotli: ระดับ 1–4 สำหรับการบีบอัดเวลารันไทม์; เก็บ 8–11 ไว้สำหรับเนื้อหาที่ถูกบีบอัดล่วงหน้าหรือคงที่
  • GZIP: ระดับ 5–6 เป็นค่าเริ่มต้นที่ดี

ระดับสูงขึ้นมักให้การลดขนาดที่น้อยลงแต่สามารถเพิ่ม CPU และทำให้ p95/p99 แย่ลง

ฉันควรบีบอัดทุกการตอบกลับหรือเฉพาะเมื่อเกินขนาดที่กำหนด?

ใช้เกณฑ์ขนาดขั้นต่ำเพื่อไม่ให้เสีย CPU กับ payload เล็กๆ

  • จุดเริ่มต้นทั่วไป: 1–2 KB
  • ถ้าคุณ CPU-bound หรือมีการส่งคำร้องถี่มาก: พิจารณา 4 KB

จูนแยกตามเส้นทางโดยเปรียบเทียบไบต์ที่ประหยัดได้กับเวลาที่เซิร์ฟเวอร์เพิ่มขึ้นและผลกระทบต่อ p50/p95/p99

ชนิด payload แบบไหนบีบอัดได้ดี (และแบบไหนมักจะไม่คุ้ม)?

เน้นที่ชนิดเนื้อหาที่เป็นโครงสร้างและมีความซ้ำสูง:

  • ดีมาก: JSON, GraphQL, XML, HTML, บันทึกข้อความขนาดใหญ่
  • “อาจได้ผล”: Protobuf/MessagePack (มักบีบอัดได้—วัดผลจริง)
  • ปกติไม่คุ้มค่า: JPEG/PNG/WebP, MP4, ZIP/gz, หลายไฟล์ PDF

แนวทางที่ใช้กันคือเปิดการบีบอัดเฉพาะสำหรับค่า Content-Type แบบข้อความและปิดสำหรับฟอร์แมตที่บีบอัดอยู่แล้ว

Accept-Encoding และ Content-Encoding ทำงานอย่างไรสำหรับ API?

การบีบอัดต้องทำตามการเจรจา HTTP:

  • ไคลเอนต์ส่ง Accept-Encoding (เช่น zstd, br, gzip)
  • เซิร์ฟเวอร์ตอบด้วย Content-Encoding ที่รองรับ

ถ้าไคลเอนต์ไม่ส่ง Accept-Encoding การตอบที่ปลอดภัยที่สุดมักจะเป็น ไม่บีบอัด อย่าตอบด้วย Content-Encoding ที่ไคลเอนต์ไม่ได้โฆษณา มิฉะนั้นไคลเอนต์อาจแปลไม่ได้

ทำไมต้องมี Vary: Accept-Encoding เมื่อใช้การบีบอัด?

เพิ่ม:

  • Vary: Accept-Encoding

ซึ่งป้องกัน CDN/proxy จากการแคชตัวแปรแบบหนึ่ง (เช่น gzip) แล้วส่งให้ไคลเอนต์ที่ไม่ได้ร้องขอหรือถอดรหัสไม่ได้ หากคุณรองรับหลายการเข้ารหัส เฮดเดอร์นี้จำเป็นสำหรับการแคชที่ถูกต้อง

ข้อบกพร่องการบีบอัดที่พบบ่อยที่สุดในโปรดักชันคืออะไร?

ความผิดพลาดที่พบบ่อยได้แก่:

  • บีบอัดซ้ำสองครั้ง (ต้นทางบีบอัดแล้วเกตเวย์บีบอัดอีกครั้ง)
  • หัวข้อ/บอดี้ไม่ตรงกัน (Content-Encoding ระบุ gzip แต่บอดี้ไม่ได้ถูกบีบอัด)
  • การเจรจาผิดพลาด (ละเลย Accept-Encoding)
  • การแทรกแซงของ proxy/CDN (ตัดหรือเปลี่ยนเฮดเดอร์)
  • Content-Length ผิดพลาด เมื่อสตรีม/บีบอัด

เมื่อดีบัก ให้จับเฮดเดอร์ดิบและยืนยันการถอดความด้วยเครื่องมือ/ไคลเอนต์ที่เชื่อถือได้

ฉันควรเปิดตัวและมอนิเตอร์การบีบอัด API อย่างไรอย่างปลอดภัย?

เปิดตัวเหมือนฟีเจอร์ด้านประสิทธิภาพ:

  • เริ่มด้วย canary หรือกลุ่มเล็ก แล้วค่อยๆ เพิ่ม (เช่น 1% → 5% → 25% → 100%)
  • เก็บการย้อนกลับที่เร็ว (feature flag หรือ config ของเกตเวย์)
  • มอนิเตอร์:
    • การใช้งาน CPU / การอิ่มตัว
    • p50/p95/p99 latency และ TTFB
    • ขนาดตอบกลับ (แยกระหว่างบีบอัดและไม่บีบอัด)
    • ข้อผิดพลาด/timeout และความล้มเหลวในการถอดรหัสของไคลเอนต์

ถ้า tail latency เพิ่มภายใต้โหลด ลดระดับ บวกเกณฑ์ หรือสลับไปใช้โค้ดคอมเพรสชันที่เร็วกว่าบ่อยครั้งคือ ZSTD

Related posts