- บั๊กใน ระบบอัปเดตอัตโนมัติของ Screen Studio แอปอัดหน้าจอสำหรับ macOS ทำให้เกิดปัญหา ดาวน์โหลดไฟล์ 250MB ซ้ำทุก 5 นาที
- ผลคือเกิดทราฟฟิกบน Google Cloud สูงถึง 2PB (2,000,000GB) ใน 1 เดือน และกลายเป็น บิลช็อกประมาณ $8,000
- สาเหตุมาจากโค้ดที่ตกหล่นง่าย ๆ คือ ลืมใส่ลอจิกหยุดการร้องขอซ้ำหลังดาวน์โหลดอัปเดตแล้ว
- ผู้ใช้บางรายได้รับ ความเสียหายจริงถึงขั้นถูกยกเลิกบริการอินเทอร์เน็ต และทีมพัฒนายอมรับผิดอย่างเต็มที่
- เรื่องนี้ตอกย้ำบทเรียนเรื่อง การตั้งค่าแจ้งเตือนค่าใช้จ่ายคลาวด์, การทบทวนโค้ดที่อาจก่อค่าใช้จ่าย, และการเตรียมกลไกควบคุมเซิร์ฟเวอร์อัปเดต
ภาพรวมของเหตุการณ์
- Screen Studio เป็น แอปอัดหน้าจอเดสก์ท็อป สำหรับ macOS และมี ฟีเจอร์อัปเดตอัตโนมัติ
- ไฟล์อัปเดตมีขนาด ประมาณ 250MB และแอปจะ ตรวจสอบเซิร์ฟเวอร์ทุก 5 นาที
- จากบั๊กนี้ หลังตรวจพบอัปเดตแล้ว คำขอทุก ๆ 5 นาทีจะไม่หยุดลงและยังคงดาวน์โหลดต่อไป
จุดเริ่มต้นของการรีแฟกเตอร์อันน่าเศร้า
- เดิมทีป๊อปอัปอัปเดตจะรบกวนระหว่างการบันทึกหน้าจอ ทำให้เกิดปัญหา UX
- ระหว่างการรีแฟกเตอร์เพื่อปรับปรุงเรื่องนี้ ได้ เผลอลบลอจิกที่หยุดตัวจับเวลาหลังอัปเดตออกไป
- ผลลัพธ์คือแอปถูกฝังลอจิกที่ ดาวน์โหลดไฟล์อัปเดตซ้ำ ๆ เอาไว้ภายใน
บริบทที่น่ากลัว: สถานะการรันอยู่เบื้องหลัง
- ผู้ใช้จำนวนไม่น้อยเปิดแอป ทิ้งไว้ทำงานอยู่เบื้องหลังเป็นเวลาหลายสัปดาห์
- ในสภาพนี้ อินสแตนซ์หลายพันตัวจะ ดาวน์โหลด 250MB อัตโนมัติทุก 5 นาที
หายนะในรูปของตัวเลข
- ดาวน์โหลดทุก 5 นาที = วันละ 288 ครั้ง
- ทราฟฟิกดาวน์โหลดต่อผู้ใช้ต่อวัน = 72GB
- หากเกิดขึ้นต่อเนื่องราว 30 วัน และสมมติว่ามีผู้ใช้ 1,000 คน:
- 250MB × 288 × 30 × 1,000 = ทราฟฟิกราว 2PB
- ค่าใช้จ่ายที่คาดว่าจะเกิดบน Google Cloud: ประมาณ $8,000
ความผิดพลาดต่อเนื่องเป็นลูกโซ่
- ไม่ได้ตั้งค่าแจ้งเตือนค่าใช้จ่ายบน Google Cloud
- ชะล่าใจเพราะค่าใช้จ่ายรายเดือนเดิมอยู่แค่ราว $300
- สุดท้ายเพิ่งรู้ตัวเมื่อ วงเงินบัตรเครดิตเต็มและธุรกรรมถูกปฏิเสธ
ความเสียหายของผู้ใช้
- ผู้ใช้รายหนึ่งได้รับแจ้งจาก ISP (ผู้ให้บริการอินเทอร์เน็ต) ว่าจะ ยกเลิกสัญญาการให้บริการ เพราะทราฟฟิกนี้
- ในพื้นที่นั้นไม่มีผู้ให้บริการทางเลือก → ส่งผลกระทบต่อการใช้ชีวิตอย่างรุนแรง
- ทีมงาน ยอมรับความรับผิดชอบและเสนอชดเชยค่าใช้จ่าย และโชคดีที่สถานการณ์คลี่คลายลงด้วยดี
- แต่ประสบการณ์ที่ สร้างความเสียหายให้ผู้ใช้ ครั้งนี้ทิ้งบทเรียนและการทบทวนตัวเองอย่างลึกซึ้งให้กับนักพัฒนา
สรุปบทเรียน
- ต้องตั้งค่าแจ้งเตือนค่าใช้จ่ายคลาวด์
- ลอจิกอัปเดตอัตโนมัติต้องเขียนอย่างระมัดระวังอย่างยิ่ง
- โค้ดทุกส่วนที่มีโอกาสก่อค่าใช้จ่ายต้องได้รับการตรวจทานเป็นพิเศษ
- ควรใส่ สัญญาณควบคุมจากเซิร์ฟเวอร์ (เช่น forced update flag) ไว้ในงานออกแบบ
- ต้องตรวจสอบสถานะการใช้งานคลาวด์เป็นประจำ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สำหรับคนที่จะมาเจอกระทู้นี้ผ่านการค้นหาบนเว็บในอนาคต: screen.studio เป็นซอฟต์แวร์บันทึกหน้าจอสำหรับ macOS และตรวจสอบอัปเดตทุก 5 นาที แต่บั๊กที่อธิบายในโพสต์นี้คือมันดาวน์โหลดไฟล์อัปเดตขนาด 250MB ทุก ๆ 5 นาที
Screen Studio คือโปรแกรมบันทึกหน้าจอสำหรับ macOS เป็นแอปเดสก์ท็อป พวกเขาอ้างว่าจำเป็นต้องมีการอัปเดตอัตโนมัติเพื่อให้ติดตั้งเวอร์ชันล่าสุดได้ง่าย
มันน่าเหลือเชื่อที่นักพัฒนาของแอปที่ไม่สำคัญอย่างโปรแกรมบันทึกหน้าจอจะคิดว่าจำเป็นต้องตรวจสอบอัปเดตทุก 5 นาที
ฉันสงสัยจริง ๆ ว่าจำเป็นต้องตรวจสอบอัปเดตทุก 5 นาทีหรือไม่ ตรวจครั้งเดียวตอนเริ่มต้นก็น่าจะพอ และแม้ผู้ใช้จะเปิดทิ้งไว้หลายวัน ก็ยังตรวจวันละครั้งหรือน้อยกว่านั้นได้
ฉันเข้มงวดกับการรีวิวโค้ดเสมอ ครั้งหนึ่งเมื่อผู้จัดการบอกให้ปล่อยให้ QA รับภาระมากขึ้น ฉันตอบไปว่า "พวกเราทุกคนอาจตกงานได้ เราอาจตกงานกันได้เพราะโค้ดแย่ ๆ แค่บรรทัดเดียวเสมอ"
ปัญหาเรื่องแบนด์วิดท์ที่ถูกใช้ไปโดยไม่จำเป็นจากแพ็กเกจข้อมูลของผู้ใช้หลายพันคน
ตอนที่ฉันเคยปล่อยแอปพลิเคชันเดสก์ท็อปสำหรับ Mac:
น่าแปลกที่ในสรุปไม่มีการพูดถึง 'การทดสอบที่ดีกว่า'
ฉันค่อนข้างอนุรักษ์นิยมกับการนำไลบรารีจากภายนอกมาใช้ (เพราะแต่ละไลบรารีมีโอกาสสร้างปัญหาในระยะยาว) แต่ระบบอัปเดตแอปนั้นคุ้มค่าที่จะใช้
ฉันกำลังให้บริการพร็อกซีต้านการเซ็นเซอร์ที่ใช้ไฟล์ Proxy Auto-Configuration (PAC)