stackoverflow
อ่านเจอบทความเกี่ยวกับสถาปัตยกรรมของ Stackoverflow
เป็น website ยอดนิยมสำหรับ developer ทั้งหลาย
แต่น้อยคนนักที่รู้ว่า website นี้สร้างด้วยเทคโนโลยีอะไร
รวมทั้งวัฒธรรมองค์กร รูปแบบการทำงาน
ดังนั้น เรามาทำความรู้จัก Staackoverflow ให้มากขึ้น

โดยผมแปลและสรุปมาจากบทความที่ Highscalability.com
StackOverflow Update: 560M Pageviews A Month, 25 Servers, And It’s All About Performance

ก่อนหน้านี้เคยอธิบายขั้นตอนการพัฒนาของ Stackoverflow 
มาครั้งนี้มีบทความอธิบายเพิ่มเติม โดยสิ่งที่ผมชอบและคิดว่ามันมีประโยชน์
ประกอบไปด้วยเรื่องต่างๆ ดังต่อไปนี้

1.  พัฒนาด้วย Microsoft technology

ตัวอย่างเช่น  IIS, MS SQL Server
แต่ก็ใช้ technology อื่นๆ เช่น Redis, ElasticSearch เป็นต้น
ซึ่งหมายความว่า ไม่ได้ยึดติดกับ technology  ใดๆ อะไรที่ดีกว่า ก็สามารถนำมาใช้งานได้

2. การจัดการข้อมูลผ่าน Caching

ทำการเก็บ caching ทั้งหมด 5 ระดับ ประกอบไปด้วย

  • ระดับที่ 1  เป็น caching ระดับ network เช่นการ caching ที่ browser ของผู้ใช้งาน, CDN ( Content Deliver Network ) และ proxy
  • ระดับที่ 2  เป็น caching ฝั่ง server โดยใช้ทั้ง caching ของ .Net, In-memory ของ server แต่ละตัว
  • ระดับที่ 3  เป็น Distributed memory caching  เก็บในรูปแบบ key-value โดยเลือกใช้ Redis ทำให้สามารถ share ข้อมูลข้าม server ได้ง่าย
  • ระดับที่ 4  เป็น caching ที่ Database โดยจะใช้ SQL Server cache ของ Ms SQL Server นั่นเอง
  • ระดับที่ 5  เป็น caching ที่อยู่ใน disk แบบ SSD ซึ่งจะทำการสร้าง caching ทิ้งไว้ ซึ่งถูกใช้บ่อยๆ เมื่อ caching ระดับ 4 ยังไม่มีข้อมูล

3.  รูปแบบการ coding

เป็นรูปแบบที่น่าสนใจเอามากๆ ดังนี้

  • นักพัฒนาส่วนใหญ่ทำงานแบบ remote
  • เขียน test ไม่มากเท่าไร
  • เมื่อทำการ compile เรียบร้อยแล้ว  จะ deploy code ขึ้น development server
  • ความสามารถต่างๆ จะถูกจัดการด้วย feature switching นั่นคือ feature toggle นั่นเอง
  • เครื่อง development server มี hardware เหมือนกับ production server
  • เมื่อทุกอย่างเรียบร้อยจะ deploy ไปที่ meta.stackoverflow สำหรับการทดสอบ ซึ่งมีคนทดสอบประมาณ 1,000 คนต่อวันเลยทีเดียว
  • เมื่อทุกอย่างผ่านทั้งหมด จะทำการ deploy ขึ้น production server ซึ่งจะถูกทดสอบด้วย community

4. รูปแบบการ deploy งาน

ทาง Stackoverflow ต้องการ deploy อย่างน้อยวันละ 5 ครั้ง
ดังนั้นสิ่งที่ build ไปเพื่อ deploy นั้น จะไม่ใช่ software ทั้งหมด
แต่มีเฉพาะส่วนที่ต้องการเท่านั้น เพื่อให้ทำงานได้ ซึ่งจะมีขนาดเล็กๆ
ทำให้สามารถวัดประสิทธิภาพของการทำงานส่วนนั้นๆ ได้ง่าย

ใช้ Continuous Integration ชื่อว่า TeamCity
โดยการทำงานจริงๆ คือการเขียน script เพื่อ copy สิ่งที่ต้องการ deploy ไปยัง server ต่างๆ
โดยมีขั้นตอนการทำงานดังนี้

  • ปิด HAProxy เพื่อให้พร้อมสำหรับการ deploy
  • บังคับให้ IIS ทำงานตาม request ต่างๆ ที่ค้างอยู่ให้สำเสร็จ
  • ปิดการใช้งาน website
  • ทำการ copy ไฟล์ต่างๆ
  • เปิดการใช้งาน website
  • เปิด HAProxy

การ deploy ต่างๆ จะใช้งานผ่าน puppet เพื่อให้สามารถทำงานได้รวดเร็ว ถูกต้อง และสามารถทำซ้ำได้เรื่อยๆ

5. โครงสร้างของทีมพัฒนา

ทีม devops และ ทีมพัฒนา ทำงานร่วมกัน
ทีมงานส่วนใหญ่ทำงานแบบ remote จากทางบ้าน
แต่มีการพูดคุย ทำงานร่วมกัน ของทีมที่สูงมากๆ
พนักงานส่วนใหญ่จะมาจาก Community ของ Stackoverflow นั่นเอง
ซึ่งจะมองหาคนที่มีความเชื่อเรื่อง coding
ซึ่งจะมองหาคนที่มีความเชื่อเรื่อง การช่วยเหลือผู้อื่น
ซึ่งจะมองหาคนที่มีความเชื่อเรื่อง การพูดคุย

6. รูปแบบการทดสอบ

ทาง Stackoverflow ยึดถือแนวทาง Move fast and break things ( Fast feedback ) เมื่อเกิดปัญหาให้แก้ไขทันที
และ Push  it live ( One Click Deploy นั่นเอง )

มี unit test ไม่มาก เพราะว่าใช้ community ช่วยทดสอบ และใช้เครื่องมือสำหรับวิเคราะห์ code
ส่วนการทำงานของ unit test, integration test และ UI test นั้น
จะทำงานทุกๆ ครั้ง เมื่อมีการ push code ขึ้นมา
เมื่อทำการทดสอบผ่านทั้งหมดแล้ว จะทำการ build สำหรับ production ต่อไป

ส่วนใดที่สำคัญมากๆ เช่นส่วนเกี่ยวกับการเงิน
จะต้องมีการทดสอบแบบ manual ด้วยเสมอ

7. มาดูเรื่อง Logging และ Monitoring กันบ้าง

ในตอนนี้กำลังพิจารณา logstash เพื่อนำมาจัดการเรื่อง logging
แต่ระบบปัจจุบัน ทำการเก็บข้อมูล logging ไว้ใน database ( MS SQL Server )
จะเก็บ log จากทุกๆ ส่วน ทั้ง proxy, web server, system log เป็นต้น

ส่วนระบบ Monitoring จะใช้ Opserver
และ Realog สำหรับการแสดงผลข้อมูล ซึ่งพัฒนาด้วยภาษา Go

8. Performance as a Feature

เนื่องจาก Stackoverflow มีผู้ใช้งานจำนวนสูงมาก ดังนั้นเรื่อง performance จึงเป็นความสามารถหลัก
ดังนั้น การปรับปรุงส่วนต่างๆ ให้ทำงานที่รวดเร็ว ถือว่าเป้นงานที่ท้ายทายสูงมาก

สุดท้ายเรื่อง บทเรียนต่างๆ ของ Stackoverflow

  • ไม่ได้ยึดติดกับ Microsoft มากเกินไป ถ้าเครื่องมืออะไรที่เหมาะสมกว่า  ก็ใช้ไปเลย
  • ต้องรู้อัตราส่วนระหว่าง read กับ write ของระบบ เพื่อเข้าใจการทำงานของระบบ
  • ทำเฉพาะในสิ่งที่จะทำให้งานเสร็จเท่านั้นก็พอ การทำอะไรที่มากเกินไป ถือว่าเสียเวลา เช่นการเขียน test เนื่องจากมี commuity ช่วยทดสอบ
  • เพิ่ม project เข้ามา เมื่อจำเป็นเท่านั้น
  • เพิ่ม code เข้าไป เมื่อจำเป็นเท่านั้น
  • อย่ากลัวการสร้างของใหม่ๆ ขึ้นมา ถ้าคิดว่าสร้างได้ดีกว่า ง่ายกว่า เล็กกว่า และ เร็วกว่า ทำมันไปเลย
  • ไม่จำเป็นต้องมีขั้นตอนการทำงานอะไรมากมาย
  • เรื่องที่สำคัญมากๆ คือ ค่าใช้จ่ายที่เกิดจาก code ที่ไร้ประสิทธิภาพ นั้นมันจะสูงกว่าที่คุณคิดไว้เยอะมากๆ

ทั้งหมดนี้ คือ สิ่งที่ได้มาจากการอ่าน เรื่องราวการพัฒนาระบบ Stackoverflow
น่าจะมีหลายเรื่องที่เรา สามารถนำไปประยุกต์ใช้งานได้