Code Mania 11: สรุปแกะสถาปัตยกรรม วงใน จากผู้ใช้หลักร้อยถึงหลักล้าน โดยคุณบอย ภัทราวุธ ซื่อสัตยาศิลป์ CTO แห่ง wongnai.com

พอดีเมื่วานนี้ทางทีมงาน TechTalkThai มีโอกาสได้มาเข้าร่วมงาน Code Mania ครั้งที่ 11 (ครั้งที่ 3 แบบเลขฐาน 2) ซึ่งจัดขึ้นโดยทีมงานสมาคมโปรแกรมเมอร์ไทย ที่คณะวิศวกรรมศาสตร์ จุฬาลงกรณ์มหาวิทยาลัย ก็เลยขอสรุปเนื้อหาในส่วนของหัวข้อ “แกะสถาปัตยกรรม วงใน จากผู้ใช้หลักร้อยถึงหลักล้าน โดยคุณบอย ภัทราวุธ ซื่อสัตยาศิลป์ CTO แห่ง wongnai.com” มาให้อ่านกันดังนี้ครับ

wongnai_banner

แกะสถาปัตยกรรม วงใน จากผู้ใช้หลักร้อยถึงหลักล้าน โดยคุณบอย ภัทราวุธ ซื่อสัตยาศิลป์ CTO แห่ง wongnai.com

เรื่องราวเส้นทางของ wongnai.com ที่ค่อยๆ เติบโตขึ้นมาจากผู้ใช้งานจำนวนหลักร้อยคน จนวันนี้เติบโตมาเป็นผู้ใช้งานหลักล้านคนบน Cloud ของ Amazon AWS

สำหรับใครที่ไม่รู้จักวงใน (ก็น่าจะรู้จักกันทุกคน) wongnai.com คือบริษัท Startup สัญชาติไทยอายุ 5 ปีที่รวมรีวิวต่างๆ ในประเทศไทยเอาไว้ โดยเริ่มต้นจากตลาดแรกคือการรีวิวอาหาร ลองเข้าไปดูได้ครับที่ https://www.wongnai.com/

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

ระบบของวงในแบ่งออกเป็น 4 ส่วนหลักๆ ดังนี้

  • User-Generated Content Website (CMS, SEO)
  • Search (Location-based Service)
  • Social Network (Feed, Follow, Like, Comment)
  • Commerce (Deals, Payment)

โดยผู้ใช้งานจะเข้าใช้งานได้จาก Web และ Mobile Application ปัจจุบันแต่ละวันมีผู้ใช้งาน 300,000 Session, มี 53 ล้าน Page View/เดือน และมีผู้ใช้งานผ่านทาง Mobile ถึง 80% และเป็น Mobile App 66% เป็น Mobile Web 33%

ช่วงเวลาที่มีผู้ใช้งานเยอะ มีด้วยกันสามช่วง ได้แก่ ช่วงอาหารกลางวัน, ช่วงอาหารมื้อเย็น และช่วงที่มีการส่ง Notification นอกจากนั้นก็อาจจะมี Traffic เพิ่มขึ้นในช่วงที่มีการโพสต์ลง Social Network หรือเกิด Drama ด้วย และช่วงวันหยุดเสาร์อาทิตย์ก็มีคนเข้าเยอะ ต่างจากเว็บข่าวที่ช่วงวันหยุดจะไม่ค่อยมีคนเข้าไปอ่านข่าว หรือวันพิเศษอย่างวาเลนไทน์หรือวันหยุดยาวก็อาจจะมี Traffic เพิ่มได้เช่นกัน

วงในเริ่มต้นจากการใช้ Apple iMac เป็น Dev Server เครื่องเดียวที่บ้านของผู้ก่อตั้ง และมี Server Dell R210 เครื่องเดียวทำหน้าที่เป็น Production Server ที่ CAT แต่เมื่อใช้ไปซักพักก็พบว่าประสิทธิภาพไม่พอ เลยค่อยๆ ย้ายไป Cloud

ปี 2012 ที่มีจำนวนผู้ใช้งานเป็นจำนวนเยอะมาก ตอนนั้นใช้ Mailchimp ในการส่งเมล์หาผู้ใช้งานจำนวนราวๆ 200,000 คน ซึ่งราคากระโดดขึ้นมาจากผู้ใช้งานจำนวนหลักหมื่นคนเยอะมาก ทำให้ต้องเริ่ม Setup Mail Server ขึ้นมาเองจาก OpenEMM และประหยัดค่าใช้จ่ายลงไปมาก แต่ก็มีปัญหาเรื่องการส่งอีเมล์ช้าเพราะ Bandwidth เต็ม และมีปริมาณคนเปิดน้อยลงเพราะตก Junk เป็นบางส่วน เลยเปลี่ยนไปใช้ Amazon SES ที่สามารถส่งได้ถึง 90 อีเมล์ต่อวินาทีและไม่ตก Junk โดยตอนย้ายไปใช้นั้นก็ติดปัญหาอยู่บ้างเหมือนกัน เพราะ Amazon SES มีการตรวจสอบในช่วงแรกๆ ก่อนว่าการส่งเมล์นี้ส่งไปเมล์จริงหรือ Spam ดังนั้นต้องใช้เวลาเยอะมากในการที่ Amazon SES จะเริ่มเรียนรู้ว่าอีเมล์ของเราน่าเชื่อถือได้

การใช้ Cloud ยังช่วยเรื่อง SEO ด้วย เพราะเว็บวงในมีเกินกว่า 100,000 หน้า แต่เมื่อตรวจสอบใน Google Webmaster Tools พบว่า Google ค้นหาเจอแค่หลักหมื่นหน้า ทำให้ทีมงานเข้าไปตรวจสอบและพบว่า Latency ในการเข้าเว็บสูงมากเพราะมีคอขวดที่ระบบเครือข่าย ทำให้ Google มองว่าหน้าเว็บช้าเกินไปและไม่ทำการ Index ทุกหน้าให้จนหมด ทำให้วงในต้องมองหา Infrastructure ที่มีระบบเครือข่ายดีขึ้น

ปี 2013 ตั้งเป้ากันไว้ว่าจะมีผู้ใช้งานให้ได้ถึง 1 ล้านคน และพร้อมที่จะ Scale ระบบขึ้นไปให้รองรับผู้ใช้งานระดับนั้นให้ได้ ด้วยเหตุผลทั้งหมดที่เล่ามานี้จึงทำให้ Cloud กลายเป็นทางออกของวงใน ทำให้วงในตัดสินใจใช้ Amazon AWS เลย

การย้ายไป Amazon AWS นั้นก็มีปัจจัยเยอะ เพราะวงในเองมีภาพนับล้านภาพ และ Mobile Application เองก็ควรจะต้องทำงานต่อได้ทันทีถึงแม้จะย้าย Back-end ไปบน Cloud ก็ตาม โจทย์จึงกลายเป็นการย้ายในการทำให้ระบบมี Zero Downtime ทำให้การวางแผนกลายเป็นเรื่องที่สำคัญมากสำหรับวงในในเวลานั้น

ด้วยปัญหานี้ วงในจึงต้องค่อยๆ ทะยอยย้ายรูปขึ้นไป โดยมีการใส่ Flag เอาไว้สำหรับทำ Content Routing ให้แต่ละรูปว่ารูปไหนที่ย้ายขึ้นไปแล้วบ้างจะได้ตรวจสอบได้ง่ายๆ และให้ผู้ใช้งานถูก Redirect ไปดึงจาก Amazon S3 โดยตรงเลย ซึ่งตอนนั้นค่าใช้จ่ายที่ต้องเสียให้ Amazon AWS ไปในจังหวะ Migrate คือราวๆ 4,000 เหรียญ ส่วนเดือนถัดๆ มาก็ลดลงเหลือเดือนละ 500 เหรียญ

Database และ ORM ก็ใช้เป็น MySQL กับ Hibernate โดยสำหรับข้อมูล Feed และข้อมูล Review นั้นประกอบไปด้วยข้อมูลจำนวนมาก ตอนออกแบบ Database ก็เลยต้องมีทั้งการทำ Normalize และ Denormalize แต่ก็ทำให้เกิดการ Join Table จำนวนมากในแต่ละ Request และทุกๆ Table ของวงในก็ใหญ่มาก มี 500,000 Review, 2,000,000 Users, 200,0000 Locations และ 3,000,000 Photos ทำให้ต้องมองหาวิธีการอื่นที่มีประสิทธิภาพดีกว่า วงในเลยลองทำการ Query จากแต่ละ Table แยกกันโดยไม่ต้อง Join คล้ายๆ กับสิ่งที่ NoSQL ทำ ซึ่งผลลัพธ์ก็ดีขึ้น

อีกปัญหาหนึ่งก็คือ Schema Changes ที่เพิ่งเจอในปีที่ผ่านมาที่เปิด Wongnai Beauty ที่ทำการรวม Database ของสองระบบเข้าด้วยกัน ทำให้ต้องมีการปรับปรุงโครงสร้างของ Database ทั้งจำนวน Column ที่ต้องเพิ่มลด และปัญหาในการย้าย Database โดยตอนแรกมองว่าการ Alter Table มันน่าจะง่าย แต่พอทำจริงก็พบว่าการ Alter คือการ Allocate พื้นที่ใหม่หมดเลย และค่อยๆ Copy ข้อมูลไป ทำให้เกิด I/O สูงมาก และใช้เวลานานมากในการย้าย I/O และการอยู่บน Cloud ของ Amazon AWS ที่เป็น Amazon RDS ก็ไม่ได้มีประสิทธิภาพสูงเพียงพอในการย้ายข้อมูลเหล่านี้ให้ได้อย่างมีประสิทธิภาพ ซึ่ง AWS ให้เพียง 300 IOPS/100GB และ Burst ได้ 3,000 IOPS ได้ในเวลาที่จำกัด ทำให้เว็บ Down ไปประมาณ 1 วันเต็มๆ เลย หลังจากนั้นเลยแก้ด้วยการเปิดเครื่องเพิ่มมารองรับการย้ายแยกกับ Production โดยเฉพาะ

การเปลี่ยน Schema นี้ใช้ Liquibase และพบปัญหาว่าเวลาเพิ่มทีละ 2 Column นั้น มันเพิ่มทีละ 1 Column 2 ครั้งแทน ทำให้ใช้เวลาค่อนข้างนานในการเปลี่ยน Schema ครั้งนี้

แต่ทั้งๆ ที่เจอปัญหาเหล่านี้ ทำไมยังคงใช้ SQL อีก? เพราะวงในต้องการ ACID Transaction และในช่วง 5 ปีที่แล้ว NoSQL ยังไม่เก่งมากนัก Seach ก็ไม่เก่งเท่า RDBMS ในสมัยนั้น

ส่วนการ Search นี้ถือเป็น Key Feature ของวงในเลย เพราะการค้นหาข้อมูลนั้นมีรูปแบบของการใส่ข้อความที่หลากหลาย ซึ่งก็จะมีการเสิร์ชต่อเดือนหลายสิบล้านครั้ง และผลลัพธ์ที่ผู้ใช้งานคาดหวังนั้นก็หลากหลายมาก วงในใช้ Apache Solr ที่มีข้อดีคือการอ่านข้อมูลเร็ว แต่ข้อเสียคือเขียนช้า ซึ่งวงในต้องการให้เขียนเร็วด้วยเพราะวงในมีการอัพเดตบ่อยมาก เช่น รูปใหม่ รีวิวใหม่ หรือ Like เพิ่มที่ทั้งหมดนี้มีผลกระทบต่อการจัด Ranking อยู่ตลอด

ช่วงแรกวงในลองให้มีการอัพเดต Index แบบ Real-time เลย ซึ่งก็พบว่ายังไม่เวิร์คมากนัก ทำให้ต้องเขียนโปรแกรมขึ้นไปอีกหนึ่ง Layer สำหรับการทำ Batch Processing ส่งผลให้ประสิทธิภาพดีขึ้นมาก และเตรียมวางแผนแยกตัว Read / Write ของ Apache Solr ออกจากกันจะได้ Scale ได้ ส่วนสาเหตุที่ไม่ได้ใช้ Amazon Elasticsearch Service ก็เพราะเทสต์ยาก และไม่อยากยึดติดกับ Amazon AWS มากนัก เลยยังคงใช้ Solr จะได้ย้าย Cloud เมื่อไหร่ก็ได้โดยไม่ต้องแก้โค้ดใหม่มากนัก

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

การทำ Scheduled Task นั้นใช้ Quartz ของ Terracotta เพื่อทำการคำนวน Ranking ตามข้อมูลฟีลด์ต่างๆ กัน รวมถึงเอาไว้ทำระบบ Leaderboard และการอัพเดตข้อมูลเชิงสถิติต่างๆ

ส่วน Web Stack ทั้งหมดใช้ Java เพราะทีมงานมีความคุ้นเคยกับ Java และในเมื่อ 5 ปีก่อนก็ไม่ได้มีเทคโนโลยีให้เลือกขนาดนั้น Node.js ก็ยังใหม่จนไม่กล้าใช้ ปัจจุบันนี้ใช้ Apache, Tomcat, Jenkins, Zookeeper, Solr, SES, Cassandra Cluster

Frontend ใช้ JSP โดยยังไม่มี Pre-processor ในสมัยนั้น เลยต้องเขียนเองบน Maven Lifecycle และใช้ Minify JS, CSS ไฟล์เดียวในตอนแรก มี YUI Compressor ตอนหลังเลยหันมาใช้ RequireJS จะได้เขียนแยกโมดูลได้

ที่ไม่ใช้ Angular เพราะต้องการ SEO ซึ่งการจะทำให้ Angular ทำ SEO ได้นั้นก็ต้องเขียนโค้ดเพิ่มเติมอีกค่อนข้างเยอะ

ในการทำ DevOps ก่อนหน้านี้มีการใช้ Apache Sonar (ตอนนี้เป็น SonarQube ไปแล้ว) ตอนนี้ใช้ Jenkins

ต่อไปจะมีการทำ Personalization เพิ่มด้วยการนำ Machine Learning, Scala และ Apache Spark เตรียมย้ายไปใช้ Microservices แทน

ส่วนการทำงาน ใช้ Asana, Slack, Agile, Manual First, TDD, Daily Scrum, 2-week Sprint, Retrospect

ตอนนี้วงในยังไม่ได้ใช้ Auto-scaling ของ Amazon AWS แต่ตอนแรกที่ย้ายมาใช้ Cloud ก็ดู Auto-scaling เอาไว้ แต่เมื่อก่อนนั้นการทำ Auto-scaling ยังทำได้ยาก และรู้สึกว่ายังไม่จำเป็นมากเลยยังไม่ได้ทำ

ทั้งทีมตอนนี้มี 6x Full Stack Web Dev, 3x iOS + 1 Part Time, 2x Android Dev, 1x QA, 1x UX/UI Designer ตอนนี้กำลังจ้างเพิ่มอยู่ เข้าไปที่ https://www.wongnai.com/careers ได้เลย

wongnai-jobs-logo

ทั้งหมดนี้ถ้ามีข้อมูลส่วนไหนผิดพลาดก็แจ้งเข้ามาได้ที่ info@techtalkthai.com ได้เลยนะครับ


About techtalkthai

ทีมงาน TechTalkThai เป็นกลุ่มบุคคลที่ทำงานในสาย Enterprise IT ที่มีความเชี่ยวชาญทางด้าน Network, Security, Server, Storage, Operating System และ Virtualization มารวมตัวกันเพื่ออัพเดตข่าวสารทางด้าน Enterprise IT ให้แก่ชาว IT ในไทยโดยเฉพาะ

Check Also

ผลการจัดอันดับ Supercomputer ล่าสุดออกแล้ว! IBM รั้ง 2 อันดับเร็วสุดในโลก ตามด้วยจีน

ผลการจัดอันดับ Supercomputer ของ TOP500 ครั้งที่ 53 ออกมาแล้วอย่างเป็นทางการ และถือเป็นครั้งแรกในประวัติศาสตร์ที่ทุกระบบในการจัดอันดับนี้มีความเร็วเกินกว่า 1 Petaflops ทั้งหมด เข้าสู่ยุคของ Supercomputer ความเร็วระดับ Peteflops แล้ว โดยใน 10 อันดับแรกมีดังนี้

TechTalk Webinar: ยกระดับการจัดการคลังสินค้าสู่ระบบดิจิทัล ด้วย Infor Warehouse Management System โดย Infor

Infor ขอเรียนเชิญเหล่าผู้บริหารธุรกิจและผู้จัดการ IT ในอุตสาหกรรมโรงงานและการผลิต, ค้าปลีก รวมถึง Logistics เข้าร่วมฟัง TechTalk Webinar ในหัวข้อเรื่อง "ยกระดับการจัดการคลังสินค้าสู่ระบบดิจิทัล ด้วย Infor Warehouse Management System โดย Infor" เพื่อทำความรู้จักกับเทคโนโลยี Warehouse Management สมัยใหม่ ในวันศุกร์ที่ 5 กรกฎาคม 2019 เวลา 14.00 – 15.30 น. โดยมีกำหนดการและวิธีการลงทะเบียนดังนี้