
คำถามที่น่าสนใจในการ review code ของระบบงาน
เราทำการเปลี่ยน code มาใช้ภาษาโปรแกรมที่เร็วมาก ๆ แล้ว
แต่ทำไมยังช้าอยู่ เมื่อทำการเชื่อมต่อ database !!
Database มีทั้ง SQL และ NoSQL
โดยที่ code ทำงานเร็วมาก ๆ ในระดับ nano หรือ milisecond กันเลย
ส่วน database กลับใช้เวลาการทำงานหลายวินาที !!
นั่นหมายความว่าระบบงานของเราจะตันที่ Database (bottleneck)
แล้วมันเกิดจากอะไรบ้าง ?
เพื่อที่จะแก้ไขได้อย่างถูกต้อง
- Database นั้นมักจะทำการอ่านและเขียนข้อมูลจาก disk และผ่านระบบ network ดังนั้น disk ต้องเร็ว network ต้องเยอะ
- Business logic ที่ซับซ้อน
- มีการใช้งาน CPU เยอะ
- ในการ query ข้อมูล มี lock CPU เยอะ
- ในการ query ข้อมูล ใช้ memory เยอะ เนื่องจากข้อมูลเยอะ ยิ่งนานไปยิ่งช้า ไม่ทำ index ที่เหมาะสม
- ในการ query ข้อมูล มีข้อมูลเยอะเกินไป มีการ join มากเกินไปไหม หรือ บางข้อมูลไม่ได้ใช้ก็ดึงออกมา มันเปลือง
- ในการ query ต่าง ๆ จำเป็นต้องทำการ explain หรือ ตรวจสอบ cost หรือ resource ที่ต้องใช้งาน รวมทั้งระบบ monitoring ที่ดี เพื่อดู query ต่าง ๆ ว่าใช้งานอย่างไร ทำงานอย่างไร และมี slow query ตรงไหนบ้าง
- ถ้าข้อมูลเยอะขึ้น แล้วส่งผลต่อการทำงาน น่าจะต้องทำ sahrding และ partioning เสมอไหม
- ในการ update เยอะ ๆ เกิดการ lock หรือ deadlock ขึ้นมาได้ แนะนำให้ใช้ update/delete in batch จะลดปัญหาลงได้เยอะ
- มีผู้ใช้งานจำนวนสูงขึ้น ทำให้ระบบช้าลง
- Architecture ของ database ไม่เหมาะสมต่อการใช้งาน เช่น single node ไม่รอด น่าจะต้องมี replica มารองรับการ read หรือไม่ หรือต้องทำแบบ multi-master เพื่อรองรับการ write ที่มากขึ้น หรือยังแยกการ read และ write ออกจากกันด้วยการใช้ database model ที่เหมาะสม (polyglot database)
- เราคนจริง ไม่มีการใช้งาน caching หรือ pre-aggregate ใด ๆ สำหรับ query ข้อมูลบ่อย ๆ หรือ หนัก ๆ ดังนั้นควรจัดการให้ดี แต่ก็ต้องดูเรื่อง cached invalidate ด้วย เพื่อให้ข้อมูลถูกต้องอยู่อย่างเสมอ
- ออกแบบ data model ไม่เหมาะสมกับงาน ทั้ง Normalization และ De-nomalization
- ถ้าลึกกว่านั้นคือ เรื่องของ data type ที่ใช้จัดเก็บไม่เหมาะสมกับงาน
- การจัดการ database connection ที่ไม่ดี ซึ่งต้องใช้งาน connection pool หรือ proxy เข้ามาช่วย เพื่อ reuse connection ให้ดีขึ้น
- ถ้ามี load เข้ามาหนัก ๆ จำเป็นต้องออกแบบเพื่อรองรับเพื่อให้ระบบไม่พังไปด้วย เช่น rate limit, circuit breaker หรือ แทนที่จะทำงานแบบ synchronous ก็ปรับมาเป็น asynchronous ด้วย
ลองดูระบบของเราสิว่า มีปัญหากันตรงไหนบ้าง ?
ขอให้สนุกกับการ coding ครับ