Disqus-logo-vector
พอดีได้ดู VDO เกี่ยวกับการอธิบายถึงสถาปัตยกรรมของระบบ Disqus
ซึ่งเป็นระบบให้บริการการ comment ที่มีผู้ใช้งานจำนวนมาก
โดยระบบนี้มันทำงานแบบ Realtime เสียด้วย
จึงได้ทำการสรุปจาก VDO ที่ดูมาไว้ที่นี่
มาดูกันว่าเขาพัฒนาระบบกันอย่างไรนะ …

ที่มาของข้อมูล :: VDO  Making Disqus Realtime 
และมี Slide อยู่ที่นี่  Scaling Realtime at Disqus
เป็นการพูดตั้งแต่ปี 2013 แต่น่าจะยังพอมีประโยชน์บ้างนะ

Disqus คืออะไร

ระบบให้บริการเกี่ยวกับการ comment
ดังจะเห็นบ่อยๆ จาก blog ต่างๆ
เมื่อปี 2013 มีการใช้งานหลักพันล้าน unique IP ต่อเดือน

Disqus สร้างด้วยอะไรบ้าง

  • Python
  • Django
  • Nginx + Push stream module
  • Thoonk
  • Redis

โดยระบบ Realtime นี้จะเรียกว่า Realertime

จากการทดสอบสามารถรองรับผู้ใช้งานพร้อมๆ กันจำนวน  1.5 ล้าน connection
รองรับผู้ใช้งานพร้อมๆ กัย 45,000 connection ต่อวินาที
รองรับจำนวนข้อความ 165,000 ข้อความต่อวินาที
และมีค่า latency น้อยกว่า 0.2 วินาที

การทดสอบนั้นใช้ trafic จากระบบจริงๆ

ซึ่งเรียกว่า Darktime testing เพราะว่าใช้ข้อมูลผู้ใช้งานจากทุกๆ ที่ทั่วโลก
มาจากหลายล้าน website ซึ่งจะได้รับ feedback จากผู้ใช้งานทันที

ยังไม่พอ มีการทดสอบที่เรียกว่า Darkest time อีก
ซึ่งจะใช้ traffic ทั้งหมดจาก dark time มายัง queue, publish/subscribe แบบ 1 thread เท่านั้น
โดยข้อดีของการทดสอบแบบนี้
ทำให้เห็นได้ทันทีว่า code ตรงไหนมีปัญหาอย่างชัดเจน

มาดูเรื่องสถาปัตยกรรมของ Realertime ดีกว่า

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

โครงสร้างการทำงานของระบบนี้กัน

Screen Shot 2557-04-30 at 8.23.09 PM


จากภาพนั้น ประกอบไปด้วย

1. Django คือ web framework

2. Thoonk queue คือ queue ที่ถูกสร้างขึ้นมาครอบ Redis
เพื่อจัดการคิวของ comment ที่ส่งเข้ามายังระบบ
ซึ่งทำงานในลักษณะของ State machine
จึงทำให้ง่ายต่อการดูว่ายังมี comment ใดยังไม่ถูกดึงเข้าไปทำงาน
และง่ายต่อการจัดการเมื่อเกิดข้อผิดพลาด

3. Gevent  เป็น library สำหรับการทำ synchronous API ซึ่งขี่อยู่บน libel event loop
และทำการจัดรูปแบบของข้อมูล
เพื่อจะส่งข้องมูลไปยัง Nginx pub endpoint

4. Nginx ที่ติดตั้ง push stream module
โดย Nginx จะทำงานเป็น publish/subscribe
ดังนั้นถ้า client ยังเปิด connection และ subscribe ไว้
ก็จะได้รับข้อมูลแบบ realtime อยู่เสมอ

โอ้วแม่เจ้า … Nginx + push stream module  มันแหล่มจริงๆ นะ

5. ทางฝั่ง client จะเปิด connection ผ่านมาด้วย WebSocket เนื่องจากมันเร็วนั่นเอง
แต่กำลังจะเปลี่ยนไป EventSource เนื่องจากมันจะถ้า build-in มากับ browser เลย
และจัดการง่ายกว่า

นี่เป็นเพียงรายละเอียดคร่าวๆ ของระบบ Realertime เท่านั้น …

สิ่งที่ทางทีมพัฒนาได้เรียนรู้

  1. ทำให้รู้ว่า Redis และ NGinx publish/subcribe มันมีประสิทธิภาพอย่างมาก
  2. การทดสอบแบบ end-to-end นั้นดี แต่ก็แลกด้วย cost ต่างๆ จำนวนมากเช่นกัน
  3. ต้องทำความเข้าใจก่อนว่าจะทดสอบ load test อะไรของระบบ
  4. บางครั้งทำให้เกิดการค้นพบครั้งยิ่งใหญ่ เช่น การใช้งาน Nginx + push stream module เป็นต้น ทำให้ลดจำนวน server ที่ใช้งานลงไปจพนวนมาก
  5. การทดสอบด้วยข้อมูลและ traffic จริงๆ มันเป็นทางเลือกที่ดีและง่าย เพื่อสร้าง traffic จำนวนมาก
  6. การเพิ่มเครื่องเพื่อรองรับผู้ใช้งานที่เพิ่มขึ้นนั้น เป้นสัญญาณที่บอกว่าสถาปัตยกรรมของระบบมีปัญหา ต้องรีบทำการ tunning แล้วนะ เช่นลดการใช้งาน resource เป็นต้น
  7. ทำให้รู้ว่า ไม่จำเป็นต้องพัฒนาขึ้นมาใหม่ทั้งหมด  เพราะว่าอาจจะมีเทคโนดลยีก่อนหน้าอยู่แล้ว เพียงแต่เรายังค้นหาไม่เจอเท่านั้นเอง
  8. ใส่ความพยายามในการสร้างระบบตั้งแต่เนิ่นๆ ไม่เช่นนั้นระบบอาจจะไฟไหม้แบบ Disqus ได้

ปล. ตอนนี้ระบบ backend ของ Disqus เปลี่ยนไปใช้ Go ล่ะนะ …

Tags: