Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 2077

คำถาม :: Code ทำงานเร็วมาก แต่เมื่อเชื่อมต่อ Database กลับช้า ?

$
0
0

คำถามที่น่าสนใจในการ 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 ครับ



Viewing all articles
Browse latest Browse all 2077

Trending Articles