2 คะแนน โดย GN⁺ 2023-08-12 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • บทความนี้กล่าวถึงประสบการณ์ของผู้เขียนในการดูแลประสิทธิภาพของ Postgres ในแอปพลิเคชัน SaaS โดยฐานข้อมูลเริ่มมีปัญหาในการรองรับภาระงาน
  • ทีมของผู้เขียนขยายระบบในแนวตั้งโดยเปลี่ยนไปใช้อินสแตนซ์ที่ใหญ่ขึ้นทุกครั้งที่ฐานข้อมูลยุ่งเกินไป แต่สุดท้ายก็ไปถึงจุดที่ใช้ขนาดใหญ่ที่สุดอยู่แล้วและกำลังจะเข้าสู่ภาวะโอเวอร์โหลด
  • มีการเสนอแนวทางแก้ปัญหาที่เป็นไปได้สองแบบ คือการ shard การเขียนไปยังคลัสเตอร์ฐานข้อมูลอิสระ และการแยกโมโนลิทออกเป็นหลายบริการที่เชื่อมต่อกัน (microservices)
  • ทั้งสองแนวทางช่วยเพิ่มความจุ และเปิดทางเลือกที่น่าสนใจในด้านความทนทานต่อความขัดข้องและความยืดหยุ่นในการปฏิบัติการ แต่ก็จะเพิ่มความซับซ้อนอย่างมาก
  • ผู้เขียนมองว่าต้นทุนที่แท้จริงของความซับซ้อนคือความใส่ใจที่ต้องใช้ ซึ่งจะทำให้ทุกการตัดสินใจทางเทคนิคหลังจากนั้นซับซ้อนขึ้น
  • ผู้เขียนเสนอว่า ก่อนจะเพิ่มความซับซ้อนครั้งใหญ่ โดยทั่วไปมักยังมีโอกาส “เค้น” ประสิทธิภาพเพิ่มออกมาจากระบบเดิมได้อีกเล็กน้อย ผ่านการปรับเวิร์กโหลด การจูนประสิทธิภาพ หรือการเสริมระบบในบางรูปแบบ
  • ในกรณีของพวกเขา การปรับแต่งคิวรีหนัก ๆ การจูนค่าตั้งของ Postgres และการย้ายคิวรีอ่านอย่างเดียวที่มีต้นทุนสูงบางส่วนไปยังฐานข้อมูลสำเนา ช่วยลดการใช้ CPU สูงสุดรายสัปดาห์ของฐานข้อมูลจาก 90% เหลือ 30%
  • ผู้เขียนสรุปว่า แม้ความซับซ้อนจะเป็นสิ่งจำเป็นและหลีกเลี่ยงไม่ได้ แต่ก็ควรเลื่อนการเพิ่มความซับซ้อนออกไปให้นานที่สุด และรีดประสิทธิภาพจากระบบที่มีอยู่ให้ได้มากที่สุดก่อน

1 ความคิดเห็น

 
GN⁺ 2023-08-12
ความคิดเห็นจาก Hacker News
  • บทความเน้นย้ำถึงความสำคัญของการดึงศักยภาพของระบบที่มีอยู่ในปัจจุบันออกมาให้สูงสุด ก่อนจะพิจารณาการเปลี่ยนหรืออัปเกรด
  • เสนอว่าทีมต่าง ๆ ควรใช้สิ่งที่มีอยู่ในตอนนี้ให้เกิดประโยชน์ แม้จะไม่สมบูรณ์แบบ และหาวิธีบรรลุเป้าหมายด้วยทรัพยากรเดิม
  • มีการพูดถึงแนวคิดในการออกแบบแอปพลิเคชันไม่ให้ต้องใช้ join ในฐานข้อมูล โดยเสนอว่าพื้นที่จัดเก็บมีราคาถูก และทุกอย่างควรถูก denormalize และอัปเดตภายในทรานแซกชัน
  • มีการเสนอให้ใช้ UUID เพื่อหลีกเลี่ยง hot partition เพื่อให้ขยายระบบแบบแนวนอนได้ แทนที่จะพึ่งพาเลขจำนวนเต็มที่ในท้ายที่สุดอาจกลายเป็นจุดล้มเหลว
  • มีการแชร์กรณีความสำเร็จที่ทีมหนึ่งปรับปรุงประสิทธิภาพของระบบได้อย่างมาก ด้วยการเปลี่ยนวิธีแก้ปัญหา แทนที่จะเพิ่มฮาร์ดแวร์หรือความซับซ้อนเข้าไป
  • บทความไม่เห็นด้วยกับการแยก monolith ออกเป็นหลายบริการที่เชื่อมต่อกันทั้งหมดในคราวเดียว และเสนอให้ระบุส่วนที่หากแยกแล้วจะสร้างผลกระทบมากที่สุดแทน
  • เน้นความสำคัญของการปรับแต่งคิวรีในเว็บแอปที่สร้างบน ORM ซึ่งมักยังมีช่องว่างให้ปรับปรุงได้มาก
  • เตือนถึงภาระทางความคิดและความซับซ้อนของการทำงานกับระบบ microservice โดยชี้ว่าระบบเหล่านี้มักนำไปสู่ downtime และความสับสน
  • แยกความแตกต่างระหว่าง efficiency (ลดความสูญเปล่าและหลีกเลี่ยงความซับซ้อน) กับ optimization (ใช้อัลกอริทึมเฉพาะทางโดยแลกกับต้นทุนด้านความซับซ้อนที่เพิ่มขึ้น)
  • แสดงความกังวลต่อการย้ายไปใช้โครงสร้างพื้นฐานที่ซับซ้อนกว่า โดยชี้ว่านี่อาจไม่ใช่ยาครอบจักรวาลอย่างที่หลายคนคาดหวัง
  • สนับสนุนความเรียบง่ายมากกว่าความซับซ้อน โดยเฉพาะเมื่อทรัพยากรมีจำกัดและระบบไม่ได้มีความสำคัญในระดับวิกฤตมาก
  • ท้ายที่สุด บทความกล่าวถึงการ sharding ตาม tenant (ลูกค้า) ว่าเป็นแนวทางแก้ปัญหาด้านการขยายระบบที่เป็นไปได้