← Blog

คลิปที่ระบบบอกว่ามี แต่เปิดไม่เจอ — บั๊กที่อันตรายที่สุดของระบบเก็บหลักฐาน

CamBooth มีหน้าที่เดียว คือเก็บหลักฐานว่าตอนแพ็คสินค้าใส่อะไรลงกล่องไปบ้าง

ผลิตภัณฑ์ที่มีหน้าที่แบบนี้มีความล้มเหลวอยู่หนึ่งแบบที่ยอมรับไม่ได้เลย — บอกว่ามีหลักฐาน แต่พอถึงเวลาต้องใช้กลับไม่มี

และเราเจอบั๊กแบบนั้นจริง ๆ

อาการ

ถ้าลูกค้าตั้งค่าที่เก็บวิดีโอเป็นโฟลเดอร์ชื่อภาษาไทย ทุกอย่างจะดูปกติดี

  • โปรแกรมเปิดได้ กล้องทำงาน ตาชั่งอ่านค่าได้
  • ยิงบาร์โค้ดแล้วระบบเริ่มอัด
  • ปิดออเดอร์แล้วระบบบันทึกว่ามีคลิปของออเดอร์นี้
  • ไม่มีข้อความผิดพลาดใด ๆ

แต่ไฟล์วิดีโอไม่เคยถูกเขียนลงดิสก์เลย

ทุกอย่างเดินหน้าตามปกติจนกว่าจะมีเคสจริง — ลูกค้าแจ้งว่าได้ของไม่ครบ ร้านเปิดระบบไปหาคลิปของออเดอร์นั้น ระบบบอกว่ามี แต่เปิดไม่ขึ้น

สาเหตุ

ไลบรารีที่เราใช้เขียนไฟล์วิดีโอเปิดไฟล์ผ่านเส้นทางแบบเก่าที่รองรับเฉพาะอักขระในชุดอักษรของระบบ ซึ่งไม่ครอบคลุมภาษาไทย

เมื่อเจอชื่อโฟลเดอร์ภาษาไทย มันเปิดไฟล์ไม่ได้ — แต่ไม่ได้แจ้งข้อผิดพลาดกลับมาให้โปรแกรมรู้ มันเพียงแค่ไม่เขียนอะไรลงไป

โปรแกรมของเราจึงเดินหน้าต่อด้วยความเข้าใจว่าการอัดสำเร็จ แล้วบันทึกรายการคลิปลงฐานข้อมูลตามปกติ

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

ทำไมถึงไม่เจอเร็วกว่านี้

เพราะไม่มีอะไรให้เจอ

ความล้มเหลวที่มีข้อความผิดพลาดจะถูกพบเสมอ — มันขึ้นบนหน้าจอ มันเข้าไปอยู่ในบันทึกเหตุการณ์ มีคนโทรมาถาม

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

สภาพแวดล้อมทดสอบของทีมพัฒนาก็ใช้เส้นทางภาษาอังกฤษเป็นธรรมชาติ ปัญหานี้จึงมีอยู่ได้เฉพาะที่หน้างานลูกค้าเท่านั้น

วิธีแก้

ฝั่งอัด — เขียนลงไฟล์พักก่อนแล้วค่อยย้าย

เราอัดลงไฟล์ชั่วคราวที่ชื่อเป็นอักขระอังกฤษล้วน โดยวางไว้บนไดรฟ์เดียวกับปลายทาง แล้วย้ายไปยังโฟลเดอร์จริงเมื่อหยุดอัด

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

และถ้าเส้นทางเป็นอักขระอังกฤษอยู่แล้ว ระบบจะไม่ทำอะไรเพิ่มเลย ไม่มีค่าใช้จ่ายส่วนเกิน

ฝั่งอ่าน — สร้างชื่อเรียกชั่วคราว

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

วิธีนี้ไม่ได้คัดลอกไฟล์ จึงไม่กินพื้นที่และไม่ต้องรอ (ถ้าระบบไฟล์ไม่รองรับ จะถอยไปใช้การคัดลอกแทน)

ที่สำคัญที่สุด — ไม่เงียบอีกต่อไป

ถ้าเปิดไฟล์เพื่อเขียนไม่ได้จริง ๆ ด้วยเหตุผลใดก็ตาม โปรแกรมจะหยุดและแจ้งเป็นข้อความภาษาไทยทันที แทนที่จะบันทึกรายการคลิปที่ไม่มีอยู่จริงลงฐานข้อมูล

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

บทเรียนที่เราเอาไปใช้ต่อ

บั๊กนี้เปลี่ยนวิธีคิดของเราเรื่องหนึ่ง

ในระบบที่มีหน้าที่เก็บหลักฐาน “บันทึกว่ามี” กับ “มีจริง” ต้องไม่มีทางแยกออกจากกันได้ ถ้าการเขียนไฟล์ยังไม่ยืนยันว่าสำเร็จ ก็ยังไม่ควรมีแถวข้อมูลที่บอกว่ามีไฟล์นั้น

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

แต่สำหรับผลิตภัณฑ์ที่ลูกค้าเอาไปใช้ยืนยันความถูกต้องกับปลายทาง เราคิดว่านี่คือทางเลือกเดียวที่ยอมรับได้

CamBooth

บันทึกคลิปตอนแพ็คสินค้า ลดปัญหาการเคลม

ดูรายละเอียด →

อ่านต่อ

CamBooth

CamBooth — ยกฝั่งเว็บขึ้น Docker และย้ายฐานข้อมูลไป PostgreSQL

งานฝั่งเซิร์ฟเวอร์ — ติดตั้งเว็บด้วย Docker Compose ซ้อมย้ายฐานข้อมูลไป PostgreSQL จนผ่านจริงไม่ใช่แค่เขียนสคริปต์ทิ้งไว้ และเพิ่มเครื่องมือตรวจว่าโครงสร้างฐานข้อมูลบนเครื่องจริงตรงกับที่โค้ดคาดหวังหรือไม่

CamBooth

CamBooth — อัดคลิปตอนแพ็คสินค้า ลดข้อพิพาทเรื่องของไม่ครบ

บันทึกคลิปขณะแพ็คสินค้าเก็บเป็นหลักฐานทุกออเดอร์ มีทั้งโหมดมาตรฐาน (อัดคลิป + เสียง + ซับไตเติล) และโหมดเชื่อมต่อ Zort API

CamBooth

CamBooth 3.1.0 — รุ่นเชื่อม Zort และแก้ปัญหาโฟลเดอร์ภาษาไทย

เพิ่มรุ่นพิเศษที่ดึงรายการสินค้าจาก Zort มาแสดงเป็นตารางแทนการเปิดหน้าเว็บ โดยใช้โค้ดหลักร่วมกับรุ่นปกติ 90% พร้อมแก้บั๊กร้ายแรงที่ทำให้อัดคลิปลงโฟลเดอร์ชื่อภาษาไทยแล้วไฟล์หายโดยไม่มีใครรู้