5 เทคนิคการปรับปรุงเว็บไซต์ให้ทำงานได้รวดเร็วขึ้น by

31
May
0

บทความนี้ค่อนข้างจะเป็นบทความภาคต่อจาก ทำไมเว็บไซต์ของคุณช้า หรือล่มบ่อย? โดยเป็นรูปแบบ Software Architecture (สถาปัตยกรรมของซอฟต์แวร์) ที่ต้องใช้ในการรันเว็บ application แต่ก่อนจะไปถึงขั้นนั้นคงต้องถามตัวเองให้ดีก่อนว่าเว็บไซต์ของคุณเป็นเว็บไซต์ที่ใช้งานหนักทางด้านไหน? คนนิยมทำอะไรบนเว็บไซต์ของคุณเพื่อที่จะได้ปรับปรุงเปลี่ยนแปลงรูปแบบการวางระบบของเราได้เหมาะสม ได้แก่

  • เว็บไซต์ของคุณมีรูปแบบ operation ใดมากกว่ากันระหว่าง Read กับ Write? เป็นเว็บที่เน้น Read อย่างเดียวหรือเป็นส่วนมากหรือไม่
  • หากเว็บไซต์ของคุณจำเป็นต้องใช้งาน read มากๆ ลองคิดดูให้ดีว่าข้อมูลที่แสดงให้ User เห็นจำเป็นต้องเป็นข้อมูลที่ Real Time แค่ไหน ข้อมูล update ช้าลงแค่ 5-10 นาทีจะเป็นอะไรหรือไม่ เช่น สถิติการใช้งานต่างๆ ที่มักต้องใช้ข้อมูลจากหลายๆ ส่วนมาประมวลผลรวมกันมากๆ อาจคำนวณแค่เพียงทุกๆ 5-10 นาที แต่ทุกครั้งที่คนคลิกเพื่อดูข้อมูลเราเพียงแสดงข้อมูลที่ผ่านการคำนวณเก็บไว้อยู่แล้วมาแสดงเท่านั้น (Cache)
  • หากเว็บไซต์ของคุณจำเป็นต้องใช้งาน write มากๆ ลองคิดดูให้ดีว่าข้อมูลของคุณจำเป็นต้อง Durability สูงหรือไม่ (ข้อมูลเมื่อเปลี่ยนแปลงแล้วต้องคงอยู่ตลอดไปหรือไม่) เช่นระบบ chat ที่ใช้เพียงคนคุยกันแค่ไม่กี่ครั้งก็ล้างข้อมูลทิ้งหมดแล้ว ข้อมูลเก่าๆ ไม่มีการใช้งานอีก แบบนี้อาจพิจารณาการเก็บข้อมูลทั้งหมดใน Memory แทน
  • หาก write เยอะ ข้อมูลที่คุณต้องเปลี่ยนในการเซพข้อมูลลงหนึ่งครั้ง สามารถเปลี่ยนแนวคิดจากการ write ทุกครั้งที่เปลี่ยนแปลงทันทีมา write เฉพาะตอนที่ web server สิ้นสุดการทำงานครั้งสุดท้ายเพียงแค่ครั้งเดียวได้หรือไม่
  • และอื่นๆ อีกมาก

หลายคนจึงอาจเกิดข้อสงสัยขึ้นมาว่าแล้วเราจะทำอะไรได้บ้าง? ก็มีวิธีต่างๆ ดังต่อไปนี้

1. ใส่ index ในฐานข้อมูลเพื่อการ query ที่รวดเร็ว

โดยปกติแล้วการทำ query ถ้ามีการกำหนด WHERE หรือ ORDER BY และมีการเรียกใช้งานบ่อยๆ แล้วเราควรจะเพิ่ม INDEX เข้าไปด้วยเพื่อให้กระบวนการค้นหาข้อมูลสามารถกระทำได้เร็วขึ้น โดยหากใส่ INDEX ถูกที่แล้วจะสามารถเร่งความเร็วได้ทั้งกระบวนการ SELECT, UPDATE, DELETE เลยทีเดียว เนื่องจากทั้งสามกระบวนการนี้จำเป็นต้องค้นหาข้อมูลให้พบก่อนจึงจะทำงานต่อไปของตัวมันเองได้

ข้อควรระวัง: ถ้าใส่ index มากเกินไป จะกระทบ performance ด้านการ write ได้ ดังนั้นให้ใส่เฉพาะที่จำเป็นเท่านั้น (แต่ทั้งนี้และทั้งนั้น performance ที่กระทบถ้า index ไม่เยอะเวอร์เกินไปจริงๆ จะไม่ค่อยรู้สึกมาก เพราะจะไปติด bottleneck ที่อื่นก่อนซะมากกว่า)

2. ใช้การเก็บข้อมูลลง Memory เช่น Memcache

เว็บไซต์ประเภท Read เยอะๆ ส่วนใหญ่แล้ววิธีการแก้ปัญหาก็คือการเก็บ Cache ลง Memory เอาไว้ก่อนนั่นเอง เพราะการ access Memory (RAM) จะสามารถเข้าถึงข้อมูลได้เร็วกว่าข้อมูลบน disk (Database) อยู่หลายเท่า เพียงแต่ว่าโชคร้ายที่ RAM ของเรานั้นมีจำกัดเสียเหลือเกิน ทำให้ข้อมูลทั้งหมดยังคงจำเป็นต้องเก็บลง Database อยู่ และเก็บเพียงข้อมูลส่วนที่เรียกใช้บ่อยๆ ภายใน RAM แต่จุดสำคัญคือต้องไม่ลืม update ค่าที่เก็บใน Cache เมื่อมีการเปลี่ยนแปลงข้อมูลเกิดขึ้น เพื่อให้ข้อมูลไม่ผิดไปจากที่ต้องการ โดยเมื่อเกิดเหตุจำเป็นต้อง reboot server ข้อมูลใน cache แม้จะหายไปตาม memory แต่ก็สามารถเรียกกลับคืนมาจาก database ได้โดยง่าย เพราะข้อมูลตัวจริงไม่ได้มีการแก้ไข

ข้อควรระวัง : พื้นที่การเก็บ Cache มีจำกัดเนื่องจาก Memory มีจำกัด เราไม่สามารถ Cache ข้อมูลทุกอย่างจาก database ลง Memory ได้

3. เก็บในรูปไฟล์ HTML โดยตรง

อีกวิธีหนึ่งสำหรับเว็บไซต์ประเภท Read เยอะๆ คือการเก็บในรูปไฟล์ html ไปเลยตรงๆ อันนี้ไม่ได้หมายความว่าให้ทำเว็บโดยห้ามใช้พวก server side script แต่คือส่วนของการประมวลผลข้อมูล และการส่งข้อมูลไปเก็บไว้ใน server จากผู้ใช้นั้นยังคงต้องใช้ server side script อยู่ เพียงแต่เฉพาะส่วนของการแสดงผลเท่านั้นที่เซพเป็น text file ประเภท html โดยตรงเพราะ server ไม่ต้องประมวลผล script ใดๆ ฝั่ง server เลย ทำให้สามารถให้บริการแก่ผู้คนจำนวนมากได้ โดยเมื่อมีการแก้ไขข้อมูลใดๆ ในหน้านั้นๆ จึงค่อยไปสร้างไฟล์ html วิธีนี้จะลด Load ทั้งการ access database และการใช้ CPU ในการประมวลผลแต่ละหน้าลงได้มาก เช่นการแสดงผลกระทู้เว็บบอร์ดที่กระทู้ใดไม่ค่อยมีการแก้ไขก็จะแทบไม่กิน CPU server เลยทีเดียว

ข้อควรระวัง : ใช้พื้นที่ harddisk เป็นจำนวนมากในการเก็บข้อมูล โดยเฉพาะอย่างยิ่งเว็บไซต์ที่มีหน้าข้อมูลอยู่หลายหมื่น หลายแสนหน้าจะยิ่งใช้พื้นที่เยอะมากตาม และหากข้อมูลในแต่ละหน้ามีการเปลี่ยนแปลงบ่อย จะต้องเกิดการสร้างไฟล์ html ขึ้นบ่อยตาม และในท้ายที่สุดก็จะช้ากว่าการเรียกใช้ server side script ธรรมดา

4. ทำ transaction ตอน query ประเภท write

เรื่องนี้หลายคนอาจจะคาดไม่ถึง พวก Database ที่มีคุณสมบัติสามารถทำ Transaction ได้ (ถ้าใน MySQL ก็คือ Engine ประเภท InnoDB ถ้าใช้ MyISAM จะไม่มีคุณสมบัติตัวนี้) นอกจากประโยชน์ของการทำ Transaction จะเป็นความปลอดภัยของข้อมูลที่แก้ไขจะได้ถูกต้อง 100% แล้ว การทำ transaction ยังหมายถึงการจับมัดก้อน query ประเภท write ให้ไปแก้ไขที่ database พร้อมๆ กันในครั้งเดียวอีกด้วย ซึ่งส่งผลให้เร่งความเร็วการ write ขึ้นได้หากเว็บไซต์ของคุณมีการ write ข้อมูลบ่อยๆ และ write หลายอย่างหรือในหลายครั้งในเวลาใกล้ๆ กัน ทดสอบได้ง่ายๆ ด้วยการสั่ง START TRANSACTION ครอบส่วนของ for ที่วนลูป insert ลง database สัก 100 ครั้ง แล้วจับเวลาที่ใช้ไปก็จะเห็นผลชัดเจนครับ

ข้อควรระวัง: START TRANSACTION แล้วอย่าลืม COMMIT ด้วย ไม่เช่นนั้น database ของคุณจะทำงานไม่เสร็จและอาจทำให้เกิดปัญหากับ database ได้ และหากมีการ write เพียงไม่กี่ครั้งต่อ 1 request อาจใช้วิธีนี้แล้วไม่ค่อยเห็นผลชัดเจนนัก

5. ใช้รูปแบบสถาปัตยกรรมซอฟต์แวร์ที่หลากหลายให้เหมาะสมกับงานที่ทำในแต่ละส่วนเฉพาะทาง

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

  • ใช้ Redis  (Redis ทำงานคล้ายกับ Memcache แต่จะดีกว่าเนื่องจากรับประกันว่า reboot เครื่องแล้วข้อมูลที่เคยอยู่ใน RAM จะไม่หายไป) ล้วนๆ เป็นฐานข้อมูลในการจัดเก็บข้อมูล Chat Log เพราะข้อมูลเก่าๆ จะถูกทำลายทิ้งเรื่อยๆ โดยอัตโนมัติอยู่แล้ว จึงไม่จำเป็นต้อง write ลง disk ให้เสียเวลา
  • ใช้ MySQL เก็บข้อมูลหลักของตัวเว็บเนื่องจากสามารถ Query ข้อมูลได้ซับซ้อน ใช้ MongoDB ในการเก็บ Log เนื่องจาก write เร็วและใช้ Redis ในการเก็บ cache ทั้ง Read และ Write
  • อื่นๆ

ตอนนี้ผมยังไม่ค่อยรู้รูปแบบสถาปัตยกรรมมากนัก จึงยกตัวอย่างได้น้อย เอาไว้มีข้อมูลแล้วจะเขียนให้ละเอียดๆ อีกทีครับ

Enjoy this article?

Consider subscribing to our RSS feed!

ไม่มีความเห็น

ยังไม่มีความเห็น

ใส่ความเห็น

RSS feed for comments on this post