การพัฒนาเว็บบอร์ดที่มีคนเข้าวันละล้านคน ยากกว่าการพัฒนาเว็บบอร์ดที่มีคนเข้าวันละหมื่นคนอย่างไร?

Pantip.com ก่อตั้งขึ้นตั้งแต่ปี พ.ศ. 2539 พี่วันฉัตรซึ่งเป็นผู้ก่อตั้งเว็บ ดาวน์โหลดโค้ด Guestbook ของ Matt’s Script Archive มาปรับแต่งให้เป็นเว็บบอร์ด สถาปัตยกรรมของโค้ดตัวนี้เป็น Text File 100% โค้ดตัวนี้ทำงานได้ดีในวันแรกที่เปิดเว็บ จนหนึ่งปีผ่านไป มีคนเข้าเว็บวันละหลักหลายพันคน และมีการ Flood กระทู้เกิดขึ้น โค้ดตัวนี้ก็เริ่มแสดงปัญหาออกมาให้เห็น

โครงสร้างของเว็บบอร์ด Pantip ประกอบด้วยสองหน้าหลักคือ 1. หน้า Index เป็นหน้าที่แสดงหัวข้อกระทู้เรียงจากใหม่ไปเก่า ซึ่งก็คือห้องต่างๆ ในปัจจุบัน และ 2. หน้า Topic หรือหน้ากระทู้ ส่วนบนเป็นข้อความเจ้าของกระทู้ ถัดไปคือความคิดเห็นเรียงจากความคิดเห็นที่ 1 ขึ้นก่อน

หน้า Index เป็นไฟล์ที่มีข้อมูลหลายร้อยบรรทัด บรรทัดบนๆ เป็น HTML สำหรับแสดงเนื้อหา Above the Fold ของแต่ละห้อง บรรทัดถัดจากนั้นคือ HTML ของหัวข้อกระทู้ โดยที่ 1 บรรทัดเท่ากับ 1 กระทู้

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

ทีนี้หายนะมันเริ่มเกิดขึ้นเมื่อมีคนตั้งกระทู้ใหม่เยอะๆ ตอบกระทู้เยอะๆ และมีตัวป่วนเข้ามา Flood กระทู้เยอะๆ การแย่งกันอัพเดทไฟล์ Index ขนาดใหญ่เพียงไฟล์เดียว ทำให้เกิดอาการ “ด๋อย” ในที่สุด บ่อยครั้งที่จะพบว่าส่วน Above the Fold ของห้องหายไปหรือเละเทะ และบ่อยครั้งที่กระทู้มีการกระโดดหายไปเป็นก้อนๆ

ตอนที่ผมเริ่มเข้าไปทำ Pantip ในปี 2540 ก็หาวิธีแก้ปัญหานี้แบบชั่วคราวโดยใช้เทคนิค SSI เพื่อแยกส่วน Above the Fold กับส่วนหัวข้อกระทู้ออกเป็นสองไฟล์ หน้า Index ของแต่ละห้องจะมีแค่ HTML ของส่วน Above the Fold จากนั้นจะ Include ส่วนหัวข้อกระทู้ที่อยู่อีกไฟล์เข้ามา วิธีนี้ช่วยให้หน้า Index ด๋อยน้อยลง ถ้าด๋อยก็จะเกิดกับส่วนหัวข้อกระทู้เท่านั้น ซึ่งสามารถเขียนสคริปต์ซ่อมได้ง่ายกว่า

ในปี 2542 มีการยกเครื่องใหม่ให้เป็นเว็บ Pantip เวอร์ชัน 2 ในตอนนั้นเว็บ Pantip ย้ายกลับมาอยู่ในไทยแล้ว (โดน Hosting ต่างประเทศเชิญออกเพราะกินแบนด์วิธเขาเยอะมาก) ช่วงแรกที่ย้ายกลับมาไทยก็อาศัย Hosting ของ Internet Thailand แต่ต่อมาคนเข้าเว็บมากขึ้นเรื่อยๆ ก็เลยซื้อเซิร์ฟเวอร์ใช้เอง 1 ตัว (เป็นเครื่องประกอบที่ไม่มีแบรนด์) พอจะต้องยกเครื่องเว็บใหม่ ก็มานั่งคิดว่าจะใช้สถาปัตยกรรมแบบไหนดี

ตอนนั้นคนเข้าเว็บ Pantip วันละหลักหมื่นคน แต่เซิร์ฟเวอร์แบรนด์ดังในยุคนั้นราคาไม่ถูกเลย และงบโฆษณาออนไลน์ในไทยก็ยังไม่มากนัก ทำให้รายได้ของ Pantip มีไม่มาก การลงทุนซื้อเซิร์ฟเวอร์จึงเป็นเรื่องใหญ่ ส่วนทางฝั่งซอฟต์แวร์ PHP กับ MySQL เริ่มเป็นที่นิยมมากขึ้น เว็บต่างประเทศใช้กันเยอะ ถึงแม้ว่าตอนนั้นจะยังหาโปรแกรมเมอร์ไทยที่ใช้สองอย่างนี้เป็นได้ยากอยู่

Linux, Apache, MySQL, PHP

ผมตัดสินใจเปลี่ยนจากภาษา Perl ที่ดูยุ่งยากเหลือเกิน มาเป็นภาษา PHP ที่เข้าใจง่ายกว่า และเริ่มใช้ MySQL ซึ่งในตอนนั้นเป็นเวอร์ชัน 3 มาเป็นฐานข้อมูลหลักของเว็บ โดยที่ทั้งเว็บและฐานข้อมูลอยู่บนเซิร์ฟเวอร์เดียวกัน (ยังไม่มีเงินแยกเครื่อง)

หน้า Index เปลี่ยนจาก Text File มาเป็น MySQL ส่วนหน้า Topic ผมยังไม่มั่นใจว่า MySQL จะรับไหวหรือเปล่า เลยเก็บเป็น Text File แบบเดิม หนึ่งเดือนแรกผ่านไป ระบบของเว็บราบรื่นดี แต่พอเข้าเดือนที่สาม ปัญหาเริ่มเกิด เพราะปริมาณกระทู้ในระบบเพิ่มมากขึ้น โดยที่หน้า Index มีการ Join Table อยู่ ทำให้เว็บช้าลงเรื่อยๆ และขึ้นข้อความ Too many connections อยู่บ่อยๆ ผมพยายาม Optimize ในฝั่งของ MySQL ทั้งส่วนของ Query และส่วน Config ให้มากที่สุด แต่สุดท้ายก็ไปไม่รอด

การแก้ปัญหาในตอนนั้นก็เลยสร้าง Text File ของหน้า Index ขึ้นมาเพื่อใช้เป็น Cache โดยตั้ง Cron ให้ Query ข้อมูลจาก MySQL มาพ่นลง Text File ทุก 5 นาที เพื่อหลีกเลี่ยงไม่ให้ผู้ใช้เข้าถึง MySQL ตรงๆ แบบเรียลไทม์ ซึ่งก็ช่วยให้สถานการณ์ดีขึ้น แต่เวลาต่อมาคอขวดย้ายมาอยู่ที่ Cron Script เพราะต้อง Join ข้อมูลหลายแสนเรคคอร์ด สุดท้ายเลยตัดสินใจทำในสิ่งที่เสียดายมากๆ คือการลบกระทู้เก่าๆ ออกจากระบบ ทั้งนี้เพื่อให้จำนวนเรคคอร์ดใน MySQL ลดลง และยังช่วยลดพื้นที่ฮาร์ดดิสก์ด้วย (ในยุคนั้นฮาร์ดดิสก์ 1 GB ราคาหลายหมื่นบาท) ความจำเป็นที่จะต้องลบกระทู้เก่าออก กับความเสียดายกระทู้ดีๆ นำมาซึ่งฟีเจอร์ “เก็บเข้าคลังกระทู้เก่า” ที่ให้สมาชิกช่วยกันเลือกได้ว่าอยากเก็บกระทู้ไหนไว้ เมื่อถึงเวลาที่จะต้องลบกระทู้เก่าออก ระบบจะย้ายกระทู้ที่สมาชิกเลือกไว้ไปเก็บอีกที่

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

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

จนในที่สุดก็เกิดโครงการ Pantip 3G ซึ่งเป็นการยกเครื่อง Pantip เป็นเวอร์ชัน 3 ขึ้นมา ในยุคนี้ Pantip มี Server Rack 2 ตู้ สามารถวางเซิร์ฟเวอร์ได้หลายสิบตัว มีรายได้มากพอที่จะตัดสินใจเพิ่มเซิร์ฟเวอร์ได้ง่ายขึ้นกว่าสมัยก่อน MySQL เริ่มไม่มีอนาคตเมื่อถูก Sun Microsystems ซื้อไป และ Oracle มาซื้อ Sun อีกที ขณะที่ NoSQL เริ่มถูกพูดถึงมากขึ้น ซึ่งในที่สุดเราตัดสินใจใช้ MongoDB ด้วยเหตุผลว่าเรียนรู้ได้ไม่ยากนักเมื่อเทียบกับ NoSQL ตัวอื่นๆ และมีเว็บใหญ่ๆ อย่าง Craigslist, SourceForge, Foursquare ที่ใช้งานอยู่ ทำให้พออนุมานได้ว่าน่าจะเป็นระบบฐานข้อมูลที่มีอนาคตพอสมควร

MongoDB

โจทย์ของการพัฒนา Pantip 3G ท้าทายกว่าสมัยก่อนมาก เราอยากให้กระทู้ไม่ด๋อย และอยากให้ระบบสามารถเก็บกระทู้ไปได้ตลอดกาลโดยไม่ต้องลบกระทู้เก่าออก ในขณะที่เรามีคนเข้าเว็บวันละเป็นล้านคน เปิดเว็บใหม่มา 5 เดือน มีกระทู้ใหม่ 500,000 กระทู้ จำนวนความคิดเห็นอีกเป็นล้าน จำนวนรูปภาพที่สมาชิกอัปโหลดอีกหลายล้าน และทั้งหมดนี้เพิ่มจำนวนขึ้นเรื่อยๆ ทุกวินาที

การพัฒนาเว็บบอร์ดที่มีคนเข้าวันละล้านคนจึงไม่ได้มีแค่การพัฒนา Function ให้ใช้งานได้ถูกต้อง ตั้งกระทู้ได้ แสดงความคิดเห็นได้ เหมือนเว็บบอร์ดที่มีคนเข้าวันละหมื่นคน แต่ยังต้องดูเรื่อง Performance ว่าจะรองรับจำนวนผู้ใช้และปริมาณข้อมูลมหาศาลได้อย่างไร ต้องดูเรื่อง Scalability ว่าจะรองรับการขยายตัวในอนาคตได้อย่างไร และต้องดูเรื่อง Moderation หรือการพัฒนาฟีเจอร์สำหรับทีมงานดูแลเว็บให้สามารถดูแลกระทู้จำนวนมหาศาลได้อย่างราบรื่น

ดังนั้น ที่มีคนตั้งกระทู้ถามใน Pantip ว่า เขียน Website แบบ pantip กี่บาทครับ ก็ตอบได้ว่าถ้าจะทำเว็บบอร์ดที่มีแค่ Function ใช้งานได้ดี รองรับผู้ใช้ได้ประมาณหลักหมื่นคนต่อวัน แนะนำให้ใช้ SMF แล้วจ้างดีไซน์เนอร์กับโปรแกรมเมอร์มาช่วยปรับแต่งธีม ค่าใช้จ่ายหลักหมื่นบาทเอาอยู่ครับ แต่ถ้าจะเอาแบบ Pantip เป๊ะๆ เลย ทั้งในแง่ Function, Performance, Scalability, Moderation รองรับผู้ใช้ได้หลักล้านคนต่อวัน ก็ต้องใช้เงินหลักล้านบาทครับ

ป.ล. ลองอ่านความเห็นเพิ่มเติมจากบล็อกของน้องในทีม Pantip 3G นะครับ เว็บเหมือน Pantip ทำไม่ยากหรอกแต่ที่ยาก …

ถ้าอ่านแล้วชอบ ฝากแชร์ด้วยนะครับ
  •  
  •  
  •  
  •  
  •  
  •  
  •  

, , ,