2 คะแนน โดย GN⁺ 2025-05-01 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • บั๊กใน ระบบอัปเดตอัตโนมัติของ 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 ความคิดเห็น

 
GN⁺ 2025-05-01
ความคิดเห็นจาก Hacker News
  • สำหรับคนที่จะมาเจอกระทู้นี้ผ่านการค้นหาบนเว็บในอนาคต: screen.studio เป็นซอฟต์แวร์บันทึกหน้าจอสำหรับ macOS และตรวจสอบอัปเดตทุก 5 นาที แต่บั๊กที่อธิบายในโพสต์นี้คือมันดาวน์โหลดไฟล์อัปเดตขนาด 250MB ทุก ๆ 5 นาที

    • นักพัฒนาถือว่าสิ่งนี้เป็นพฤติกรรมปกติทั้งหมด แต่การดาวน์โหลดจริงกลับทำให้เกิดค่าบริการแบนด์วิดท์ $8000
    • สรุป: ซอฟต์แวร์บันทึกหน้าจอตรวจสอบอัปเดตทุก 5 นาที ซึ่งเท่ากับ 12 ครั้งต่อชั่วโมง
    • ฉันเลือกซอฟต์แวร์ตามระดับความไว้วางใจที่มีต่อวิจารณญาณของนักพัฒนา ลองพิจารณาดูว่าวิจารณญาณแบบนี้สมเหตุสมผลหรือไม่
  • Screen Studio คือโปรแกรมบันทึกหน้าจอสำหรับ macOS เป็นแอปเดสก์ท็อป พวกเขาอ้างว่าจำเป็นต้องมีการอัปเดตอัตโนมัติเพื่อให้ติดตั้งเวอร์ชันล่าสุดได้ง่าย

    • แต่อัปเดตอัตโนมัติกลับก่อให้เกิดผลเสียหลายอย่าง
    • ดาวน์โหลดอัปเดตโดยไม่ได้รับความยินยอมจากผู้ใช้ และสร้างทราฟฟิกไปยังไคลเอนต์
    • มันดาวน์โหลดซ้ำทุก 5 นาทีอย่างต่อเนื่อง ทำให้น่าสงสัยว่ามีการตรวจจับหรือไม่ว่าผู้ใช้อยู่บนการเชื่อมต่อแบบคิดตามปริมาณข้อมูล
    • มีบั๊กที่ทำให้ป๊อปอัปอัปเดตรบกวนการทำงาน
    • ตัวป๊อปอัปเองก็สร้างประสบการณ์ที่ไม่ดีให้ผู้ใช้ ควรอนุญาตตอนปิดแอป และที่เหลือจัดการในเบื้องหลัง
    • ผู้ใช้บางคนคอยจับตาดูการเชื่อมต่อขาออกของแอปอย่างใกล้ชิด และการตรวจสอบอัปเดตทุก 5 นาทีถือว่ามากเกินไป ไม่จำเป็นต้องทำระหว่างที่แอปกำลังทำงาน ควรตรวจตอนเริ่มต้นและถามตอนปิดจะดีกว่า
    • ความซับซ้อนเพิ่มเติมในแอปเป็นต้นเหตุของปัญหาทั้งหมดข้างต้น และยังสร้างต้นทุนให้ผู้พัฒนา
    • App Store อาจเป็นวิธีที่สมบูรณ์แบบในการจัดการอัปเดตในกรณีนี้
  • มันน่าเหลือเชื่อที่นักพัฒนาของแอปที่ไม่สำคัญอย่างโปรแกรมบันทึกหน้าจอจะคิดว่าจำเป็นต้องตรวจสอบอัปเดตทุก 5 นาที

    • วันละครั้งก็น่าจะเพียงพอแล้ว
  • ฉันสงสัยจริง ๆ ว่าจำเป็นต้องตรวจสอบอัปเดตทุก 5 นาทีหรือไม่ ตรวจครั้งเดียวตอนเริ่มต้นก็น่าจะพอ และแม้ผู้ใช้จะเปิดทิ้งไว้หลายวัน ก็ยังตรวจวันละครั้งหรือน้อยกว่านั้นได้

  • ฉันเข้มงวดกับการรีวิวโค้ดเสมอ ครั้งหนึ่งเมื่อผู้จัดการบอกให้ปล่อยให้ QA รับภาระมากขึ้น ฉันตอบไปว่า "พวกเราทุกคนอาจตกงานได้ เราอาจตกงานกันได้เพราะโค้ดแย่ ๆ แค่บรรทัดเดียวเสมอ"

    • ทั้งนักพัฒนาจูเนียร์และผู้มีประสบการณ์มักเขียนสิ่งที่อาจทำให้ PII รั่วไหลได้ ซึ่งในหลายระบบมีโอกาสสูงมากที่จะก่อปัญหาทางกฎหมาย
  • ปัญหาเรื่องแบนด์วิดท์ที่ถูกใช้ไปโดยไม่จำเป็นจากแพ็กเกจข้อมูลของผู้ใช้หลายพันคน

    • ความผิดพลาดจากความประมาทแบบนี้อาจสร้างความแออัดให้กับผู้ใช้อินเทอร์เน็ตทุกคน
    • ถ้าความผิดพลาดนี้ไม่ได้มีค่าใช้จ่าย $8000 แต่ถูกกลบด้วย free tier ของ Google Cloud หรือแผนอื่น ๆ ก็ยังสงสัยว่าพวกเขาจะถือว่าเป็นบั๊กร้ายแรงและรีบแก้ไขหรือไม่
    • มีการออกแบบที่ผิดพลาดอีกมากแค่ไหนที่กำลังสร้างทราฟฟิกและใช้ทรัพยากรร่วมกันโดยเปล่าประโยชน์
  • ตอนที่ฉันเคยปล่อยแอปพลิเคชันเดสก์ท็อปสำหรับ Mac:

    • เราใช้ Sparkle เพื่อจัดการอัปเดต การเลือกทำระบบอัปเดตเองของพวกเขาเป็นการตัดสินใจที่ผิด
    • แอปของเราซับซ้อนมากและจัดส่งมาพร้อม Mono แต่ก็มีขนาดประมาณ 10MB เวอร์ชัน Windows มีขนาด 2MB และรวมไบนารีทั้ง 32 บิตและ 64 บิตไว้ด้วย ฉันสงสัยว่าทำไมพวกเขาถึงต้องปล่อยโปรแกรมบันทึกหน้าจอขนาด 250MB
    • ดูเหมือนว่าพวกเขาจะไม่ได้เรียนรู้อะไรเลย ทั้งบทความทำให้พวกเขาดูโง่เขลา
  • น่าแปลกที่ในสรุปไม่มีการพูดถึง 'การทดสอบที่ดีกว่า'

    • ข้อเสนอว่า 'เขียนโค้ดอย่างระมัดระวัง' ฟังดูเหมือนความผิดพลาดระดับพื้นฐานมาก
    • มันน่าหงุดหงิดมากที่นักพัฒนาใช้เครื่องของผู้ใช้เป็นเตียงทดสอบ
  • ฉันค่อนข้างอนุรักษ์นิยมกับการนำไลบรารีจากภายนอกมาใช้ (เพราะแต่ละไลบรารีมีโอกาสสร้างปัญหาในระยะยาว) แต่ระบบอัปเดตแอปนั้นคุ้มค่าที่จะใช้

    • โดยพื้นฐานแล้วนี่คือ edge case ใหญ่หนึ่งกรณี และหากแอปมีบั๊กร้ายแรง มันเป็นส่วนสำคัญของแผนการกู้คืน
    • บั๊กนี้ไม่ใช่ปัญหาเดียวของระบบอัปเดตของพวกเขา การตรวจทุก 5 นาทีเป็นเรื่องบ้าบอ และแสดงให้เห็นว่าพวกเขาไม่ได้คิดเรื่องนี้อย่างรอบคอบ
  • ฉันกำลังให้บริการพร็อกซีต้านการเซ็นเซอร์ที่ใช้ไฟล์ Proxy Auto-Configuration (PAC)

    • ถ้าไฟล์มี JS ที่ผิดพลาดอยู่ หรือขนาดไฟล์เกิน 1MB จะเกิดปัญหาที่ทุกแอปส่งคำขอไปยังเซิร์ฟเวอร์ต่อเนื่องหากถูกตั้งค่าไว้ทั้งระบบ
    • สิ่งนี้ลงเอยด้วยการ DDoS เซิร์ฟเวอร์ของฉันและทำให้ IP ถูกบล็อกในระดับ BGP
    • มีผู้ใช้มากกว่า 500,000 คนใช้งานทุกวัน เว็บเซิร์ฟเวอร์ของฉันเป็น VPS ราคา $20 ต่อเดือนที่ให้ทราฟฟิกไม่จำกัด ซึ่งช่วยให้ฉันไม่ต้องเจอสถานการณ์แบบเดียวกับ OP