จากโพสเดิมเขียนเรื่องการหาสาเหตุของปัญหาโดยใช้ tcpdump และ wireshark วันนี้เจอโจรแล้ว เจ้าโจรที่ว่าคือการ set connection ใน header ของ HTTP ในสมัยก่อนยุค HTTP 1.0 เราจะเปิด request ใด ๆ จะต้องทำ connection ไปยังปลายทางทุก ๆ ครั้งไปเช่นในเว็บเพจหนึ่งมี html หนึ่งเพจ 10 รูป เราจำเป็นต้องเปิด connection ไม่ต่ำกว่า 11 ครั้งเพื่อให้ได้ข้อมูลที่เราต้องการ ต่อมาจึงได้มีการพัฒนาโปรโตคอล HTTP ขึ้นมาเป็นยุค HTTP 1.1 ซึ่งมีความสามารถเพิ่มขึ้นมาคือ Keep-Alive connection ซึ่งทำให้เราลด bandwidth และ latency ที่เกิดขึ้นได้อย่างมากเพราะเราสามารถเปิด connection ค้างไว้และทำการ req/ack กันได้ตลอดโดยไม่จำเป็นต้อง syn กันบ่อย ๆ
ที่มาของปัญหาคือว่าร้อยปีร้อยชาติโปรแกรมผมก็ไม่เคยต้องไป override connection ของ http มันเองหรอก เพราะเราควรจะให้ Web Server เช่น Apache, IIS, BEA Weblogic and etc ทำหน้าที่ดูแลเรื่องนี้แทน Developer อย่างเรา แต่เนื่องจากบริษัทที่ทำงานด้วยเจ้าของระบบที่ส่งข้อมูลมาให้บอกว่า connection ที่ตอบกลับต้องเขียนให้เป็นเป็น close นะ ไม่งั้นคุณจะไม่ผ่านการทดสอบเราและเราจะไม่ให้คุณขึ้น production เอาสิฟะ ก็ต้องทำตามที่เค้าเรียกร้อง จนเกิดปัญหาในโพสที่ผ่านมานั่งปวดหัวเป็นวันเลยตรู กว่าจะจับโจรได้

Keep-Alive problem

Keep-Alive Solution
Lesson Learn: บทเรียนที่ได้จากปัญหาครั้งนี้คือ อย่าเชื่อใครทุกอย่าง แม้เค้าจะเป็น Specialist ในด้านนั้นก็เถอะ เราควรจะพิสูจน์และทดสอบด้วยตัวเราเองก่อนจะเชื่อใครทั้งหมด

เก่งนะเรา