500px_logo_color
จากบทความเรื่อง How 500px serves up over 500TB of high res photos
เห็นว่าน่าสนใจเลยนำมาแปล และ สรุปกันหน่อย

โดยเป็นการอธิบายภาพรวมของ
ทีมพัฒนาระบบ 500px ว่าเป็นอย่างไร ?
โครงสร้างของระบบว่าเป็นอย่างไร ?

ซึ่งสามารถรองรับข้อมูลรูปภาพคุณภาพสูง
โดยมีขนาดรวมกันมากกว่า 500TB ได้อย่างไร

ระบบ 500px คืออะไร ?

อ่านว่า 500 pixel
คือ online community สำหรับนักถ่ายภาพ และ รูปภาพความละเอียดสูง

  • มีผู้ใช้งานหลายล้านคนทั่วโลก
  • มีทั้งเข้ามา share รูปภาพ
  • มีทั้งเข้ามาค้นหารูปภาพ
  • มีทั้งเข้ามาซื้อรูปภาพ
  • มีทั้งเขามาขายรูปภาพ

โครงสร้างของทีมพัฒนาเป็นอย่างไร ?

“Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.”
— Melvyn Conway, 1967

มีพนักงานแบบ full-time จำนวน 40 คน
ทีม Engineering ประกอบไปด้วย 5 ทีม

  1. Web app team พัฒนาส่วนของ Front-end
  2. Search team ดูเรื่องโครงสร้าง และ พัฒนาระบบการค้นหาข้อมูล
  3. Media team ดูเรื่องของ upload service, service การ resize และ convert รูป
  4. Mobile team พัฒนา mobile application ทั้ง iOS และ Android
  5. Platform team ดูทุกสิ่งทุกอย่างที่เกี่ยวกับ operation, devtool, QA/Release engineering

ทำงานเป็นแบบ Cross functional team
ซึ่งช่วยทำให้ความรู้เกี่ยวกับระบบมันกระจาย และ ขยายไปยังทุกคนในบริษัท
และป้องกันไม่ให้เกิด silo หรือ ความเป็นเจ้าของใน service ใด service หนึ่ง

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

ทุกคนมีเป้าหมายเดียวกัน คือ
ส่งมอบสิ่งที่มีคุณค่า และ ของที่ใช่ ให้กับผู้ใช้งาน

มาดูสถาปัตยกรรมกันบ้าง ?

ระบบงานส่วนใหญ่พัฒนาด้วย Ruby On Rails (ROR)
มีโครงสร้างของระบบแบบ microservice
แต่ละ service จะประกอบไปด้วยสองส่วนหลัก ๆ คือ Web และ APIs
โดยแต่ละ service จะแยกออกจากกันอย่างชัดเจน
ซึ่งติดต่อกันผ่าน API เท่านั้น

Server จะอยู่บน AWS ทั้งหมด
ส่วนข้อมูลรูปภาพอยู่ที่ Amazon S3 ทั้งหมดเช่นกัน
และยังใช้ software อื่น ๆ อีกมากมาย

ส่วน Data Store ที่ใช้งานเป็นหลัก ประกอบไปด้วย

  • MySQL
  • MongoDB
  • Redis
  • Memcached
  • Elasticsearch

โครงสร้างของระบบหลักดังรูป
Screen Shot 2558-08-24 at 7.56.28 PM

และยังมีส่วนการทำงานที่น่าสนใจอีก เช่น

ระบบการค้นหาข้อมูล ใช้ Elasticsearch

ข้อมูลที่ต้องการค้นหา จะส่งมายัง RabbitMQ ซึ่งเป็น messaging server
จากนั้นจะมีตัวจัดทำ index หรือ indexer ซึ่งพัฒนาด้วยภาษา Go
เพื่อจัดเก็บข้อมูลที่ต้องการค้นหาใน Elasticseach ต่อไป

โดยหลังเปลี่ยนภาษาโปรแกมในส่วนของ indexer จาก Ruby มาเป็น Go แล้ว
ผลที่ได้คือ เวลาในการทำงานลดลงจาก 20 ชั่วโมง เหลือ 20 นาที
เป็นผลการทำงานที่น่าสนใจอย่างมาก

ส่วนระบบอื่น ๆ ที่ต้องการใช้งานระบบค้นหาข้อมูล
สามารถใช้งานผ่าน Search service API เท่านั้น

แสดงโครงสร้างการทำงานดังรูป
Screen Shot 2558-08-24 at 7.58.10 PM

ระบบการ upload, resize และการ process รูปภาพ

ข้อมูลรูปภาพจะจัดเก็บไว้ที่ Amazon S3 ทั้งหมด
ซึ่งในส่วนของ Media Service และ Converter Service พัฒนาด้วยภาษา Go เช่นกัน
เนื่องจากเขียน code ไม่เยอะ ทำงานเร็ว
และ service ต่าง ๆ ต้องทำงานแบบ concurrent ซึ่ง Go สนับสนุนอยู่แล้ว
ที่สำคัญมันช่วยลดจำนวนเครื่อง server ลงไปอย่างมากอีกด้วย
นั่นหมายถึง ค่าใช้จ่ายที่ลดลงอย่างมหาศาล

แสดงโครงสร้างการทำงานดังรูป
Screen Shot 2558-08-24 at 8.02.09 PM

แนวคิดในการออกแบบระบบที่น่าสนใจ

แต่ละ service จะถูกแบ่งออกตามกลุ่มของ business เช่น

  • Search
  • Upload
  • Recommendation

จะไม่แบ่งตาม layer หรือชั้นของเทคโนโลยี เช่น Frontend และ Backend
ห้ามทำโดยเด็ดขาด เนื่องจากคุณจะไม่สามารถส่งมอบอะไรได้เลย !!

ในการเริ่มต้นนั้น แต่ละกลุ่มของ business ควรทำงานเป็นทีม
ซึ่งในแต่ละทีมควรมีสมาชิกให้ครบทั้ง 5 ทีม (ขึ้นอยู่กับ business นั้น ๆ)

แนวทางในอนาคต เขาจะทำอะไรกันบ้าง ?

  • เริ่มนำ Docker มาใช้งาน สำหรับจัดการ microservice
  • กำลังศึกษาเรื่องการขยายระบบให้ดีขึ้น และ รวดเร็วขึ้น ด้วย Consul และ Mesos
  • Automation ทุก ๆ อย่างต้องทำงานแบบอัตโนมัติ
  • Monitoring everything ต้องทำการ monitoring ค่า และ การทำงานต่าง ๆ เพื่อทำให้รู้ เข้าใจ และแก้ไขปัญหาต่าง ๆ ได้ดีขึ้น

เป็นยังไงกันบ้าง สำหรับสิ่งที่มองไม่เห็นของระบบ 500px

Reference Websites
http://stackshare.io/500px/how-500px-serves-up-over-500tb-of-high-res-photos
http://www.infoq.com/presentations/500px-services
The Twelve-Factor App