top of page
ค้นหา
รูปภาพนักเขียนSathit Jittanupat

Traefix's Breaking Change



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


ประมาณเดือนที่แล้ว ใน log ของฝั่ง client มีบันทึก error แปลก ๆ เมื่อตรวจสอบอย่างละเอียดก็ยิ่งไม่เข้าใจ ปกติเมื่อผู้ใช้ป้อนข้อมูลโดยการคีย์ชื่อสินค้าบางส่วนลงไป โปรแกรมก็จะต้องเอาคำดังกล่าวไปใช้ค้นหาชื่อเต็มของสินค้ามาแนะนำช่วยเติมเต็มให้ เป็นกลไกการช่วยป้อนข้อมูลที่เรียกว่า "type ahead" วันดีคืนดีการทำงานจุดนี้กลับก่อให้เกิด error ทั้ง ๆ ที่ไม่ได้เป็นงานที่ซับซ้อนอะไรเลย



พยายามดักจับ error ครั้งล่าสุด และไล่เลียงขั้นตอนการทำงานของผู้ใช้โดยละเอียดก็ไม่พบความผิดปกติ จึงสันนิษฐานว่าอาจจะเกี่ยวกับการส่ง query ที่เข้ารหัสผิด มีตัวอย่างครั้งหนึ่ง เกิดจากเหตุบังเอิญที่ผู้ใช้ลืมสลับคีย์บอร์ดเป็นภาษาไทย คีย์คำว่า "];FCR5" (ลวดแพ5) พอส่งคำค้นดังกล่าวไปทำให้เกิด error ทั้ง ๆ ที่ควรจะตอบกลับมาตามปกติว่าค้นไม่เจอ


หลังจากที่ทดลองสุ่มใช้คำค้นด้วยข้อความหลายแบบ ก็พบว่าถ้ามีสัญญลักษณ์ ";" อยู่ในคำค้นจะทำให้เกิด error เมื่อ dump api มาตรวจสอบปรากฏว่า ฝั่ง client ตอนที่ส่งไปหา server ยังเป็น "];FCR5" แต่ทางฝั่ง server กลับส่ง query ไปหา database ผิด พบว่าเกิดจาก url ที่ได้รับเป็น "]&FCR5" โดนเปลี่ยนจาก ";" เป็น "&"


สัญญลักษณ์ "&" ใน url นี้มีความหมายพิเศษใช้แยก parameter ทำให้เมื่อ server parse url ออกมากลายเป็นตัดเอา "FCR5" มาเป็น parameter อีกตัวหนึ่ง



หลังจากที่ไล่เช็คเส้นทางของ api ก็พบว่าเหลือแค่จุดเดียวคั่นกลางระหว่าง client กับ server ก็คือ ตัว reverse proxy ซึ่งใช้มาจนลืมเพราะไม่เคยมีปัญหา แล้วก็ Bingo!! เจอสาเหตุว่าเป็นที่ Traefix version 2.7.2


เมื่อรู้สาเหตุของปัญหา ก็หาทางแก้ได้ วิธีที่ง่าย และตรงไปตรงมา คือ เปลี่ยนกลับไปใช้ Traefix version 2.7.1



ส่วนวิธีระยะยาวเผื่อในอนาคตจำเป็นต้อง update Traefix ผมแก้ด้วยการเพิ่ม api ทางฝั่ง server ให้สามารถรับคำสั่ง query ที่ส่งมาทาง request body แทนที่จะส่งมาทาง url string ข้อเสียของวิธีนี้อยู่ตรงที่ เมื่อไม่ expose query แนบมากับ url ทำให้การตรวจสอบ log ว่ามีการเรียกใช้ query อะไรบ้างยากกว่าเดิม


ขณะเดียวกันทางฝั่ง client ก็เพิ่มโค้ดเพื่อ work around หลบพฤติกรรมแปลก ๆ ของ Trefix version ใหม่ ด้วยการตรวจสอบถ้ามีสัญญลักษณ์ ";" ก็จะติดต่อ server ด้วย api ช่องทางใหม่แทน


โลกของซอฟต์แวร์บน Cloud ทุกวันนี้ เราไม่สามารถหยุดโปรแกรมไว้ที่เดิมได้ ถึงแม้ว่าตัวโปรแกรมเองจะไม่ได้ปรับปรุงฟีเจอร์อะไรอีก แต่บางครั้ง environment รอบ ๆ ก็เปลี่ยนแปลง และบังคับต้องปรับเปลี่ยนให้เข้ากันจึงจะใช้งานต่อไปได้ ไม่มีคำว่า "งาน จบ" สำหรับ developer ที่ดูแลโปรแกรม


ดู 0 ครั้ง0 ความคิดเห็น

โพสต์ล่าสุด

ดูทั้งหมด

Comments


Post: Blog2_Post
bottom of page