จากเหตุการณ์ที่ระบบ Reddit ล่มจากการ upgrade Kubernetes นั้น
ก็ไปเจอการอธิบายเรื่องการสร้าง platform ของระบบ Ranking
หรือระบบแนะนำ post ต่าง ๆ ในหน้า feed นั่นเอง
ซึ่งพัฒนามาจาก service จนกลายเป็น platform ที่ให้ใช้งาน
โดยทำการพัฒนาใหม่ด้วยภาษา Go
มีแนวทางที่น่าสนใจดังนี้

โดยการทำงานของระบบ Ranking จะมี 3 ขั้นตอนหลัก

  • Candidate Generation ทำการดึงข้อมูลที่จะทำการ ranking เช่น post, user เป็นต้น
  • Filtering ทำการกรองข้อมูล
  • Scoring ทำการให้คะแนนและจัดเรียงข้อมูล ก่อนส่งกลับไปให้ user

แสดงดังรูป

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

ดังนั้นจึงได้เวลาปรับเปลี่ยนโครงสร้างการทำงาน
จากเดิมที่ทุก ๆ ขั้นตอนจะผูกมัดกันไปหมด (Tight coupling)
จึงทำการแก้ไขตามหลักของ UNIX ดังนี้

UNIX Toolbox Philosophy

  • Write programs that do one thing and do it well.
  • Write programs to work together.
  • Write programs to handle text streams, because that is a universal interface.

ซึ่งทำการแบ่งแต่ละขั้นตอนเป็น stage แยกกันไปเลย (input -> output)
เพื่อให้แต่ละ stage มีการทำงานเรื่องใดเรื่องหนึ่งไปเลย
โดยตั้งชื่อ project ว่า PipeDreme ขึ้นมา

พร้อมกับใช้งาน Go concurrency ด้วย
ในการทำงานหนึ่งพร้อมกัน
แต่การดึงข้อมูลจากที่ต่าง ๆ ไม่ว่าจะเป็น post, image และ vdo เป็นต้น
แสดงการทำงานดังรูป

ทีมพัฒนาเรื่องใช้งาน package errgroup ในการจัดการ
ซึ่งก็คือ sync.WaitGroup นั่นเอง
ทำให้จัดการเรื่อง error propagation และ context cancellation ได้ง่าย
ข้อมูลในแต่ละ stage จะทำการ copy มาเลย ไม่แก้ไขที่ original data
อีกทั้งจะรอให้แต่ละ stage ทำงานเสร็จก่อน จึงจะทำงานต่อไปได้
เพื่อลดปัญหาเรื่องของ data race

ยกตัวอย่าง เช่น ต้องดึงข้อมูลจากทั้ง 3 ที่มาให้เสร็จก่อน
จึงจะทำการ merge เป็นต้น

เป็นอีกแนวคิดที่น่าสนใจมาก ๆ
ลองนำไปใช้งานกันดู