3 คะแนน โดย GN⁺ 2024-10-28 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

การใช้ SQLite เป็นที่เก็บคอนเทนต์แบบสแตติกของเว็บเซิร์ฟเวอร์

ภูมิหลัง

  • Clace เป็นแพลตฟอร์มที่ออกแบบมาเพื่อให้บริการเว็บแอปพลิเคชันสำหรับเครื่องมือภายในเป็นหลัก
  • Clace รวมความสามารถที่ปกติเว็บเซิร์ฟเวอร์และแอปพลิเคชันเซิร์ฟเวอร์แยกกันทำ เข้ามาไว้ด้วยกัน
  • ในช่วงเริ่มต้นของการพัฒนา Clace การตัดสินใจว่าจะจัดเก็บข้อมูลแอปพลิเคชันและเมทาดาทาอย่างไรเป็นเรื่องสำคัญ
  • การเก็บเมทาดาทาไว้ในฐานข้อมูลเป็นทางเลือกที่สมเหตุสมผล ส่วนไฟล์สแตติกโดยทั่วไปจะเก็บไว้ในระบบไฟล์

การใช้ SQLite เพื่อให้บริการไฟล์

  • Clace ตัดสินใจใช้ SQLite แทนระบบไฟล์เพื่อจัดเก็บไฟล์ของแอป
  • วิธีนี้ทำให้สามารถสลับเวอร์ชันได้แบบอะตอมมิก จึงจัดการหลายไฟล์ในทรานแซกชันเดียวได้เมื่อมีการอัปเดต
  • ระหว่างการสร้างและอัปเดตแอป ไฟล์ทั้งหมดจะถูกอัปโหลดเข้าไปในฐานข้อมูล SQLite และในโหมดพัฒนาจะใช้ระบบไฟล์ในเครื่อง

ข้อดีของการใช้ SQLite

  • การอัปเดตแบบทรานแซกชัน: อัปเดตหลายไฟล์ได้พร้อมกัน และรับประกันว่าจะไม่มีเว็บแอปที่เสียหายระหว่างการอัปเดต
  • การย้อนกลับการดีพลอย: หากเกิดข้อผิดพลาดสามารถย้อนการดีพลอยได้ และการ rollback ทรานแซกชันของฐานข้อมูลทำได้ง่ายกว่าการเก็บกวาดระบบไฟล์
  • การลบข้อมูลซ้ำของไฟล์ระหว่างเวอร์ชัน: แม้ไฟล์เดียวกันจะมีอยู่ในหลายเวอร์ชัน ก็จะจัดเก็บเนื้อหาไฟล์เพียงครั้งเดียว
  • การลบข้อมูลซ้ำระหว่างแอป: ป้องกันความซ้ำซ้อนเมื่อมีไฟล์เดียวกันอยู่ในหลายแอป
  • ความง่ายในการสำรองข้อมูล: ใช้ SQLite เพื่อสำรองสถานะของระบบได้อย่างง่ายดาย
  • การแฮชคอนเทนต์: บันทึกค่า SHA ของคอนเทนต์ตอนอัปโหลดไฟล์ เพื่อให้เบราว์เซอร์แคชได้ง่ายขึ้น
  • การบีบอัด: เนื้อหาไฟล์ถูกบันทึกแบบบีบอัดด้วย Brotli และสามารถจัดเก็บในรูปแบบต่าง ๆ ได้อย่างสะดวก

ประสิทธิภาพ

  • แนวทางการเข้าถึงฐานข้อมูล SQLite ของ Clace ให้ประสิทธิภาพที่ยอดเยี่ยม
  • ไม่มีการทดสอบเบนช์มาร์กโดยตรง เพราะไม่มีอิมพลีเมนเทชันที่เทียบเท่ากันซึ่งใช้ระบบไฟล์
  • ตามเบนช์มาร์กของทีม SQLite นั้น SQLite อาจให้ประสิทธิภาพดีกว่าระบบไฟล์ในบางลักษณะงาน

การรองรับหลายโหนด

  • ขณะนี้ Clace ทำงานบนโหนดเดียว
  • เมื่อมีการเพิ่มการรองรับหลายโหนด มีแผนจะใช้ฐานข้อมูล Postgres แบบแชร์แทน SQLite ในเครื่อง
  • เรื่องนี้อาจทำให้เกิดปัญหาด้าน latency และมีแผนจะใช้ฐานข้อมูล SQLite ในเครื่องเป็น file cache เพื่อลด latency

เหตุผลที่แนวทางนี้ไม่ใช่เรื่องปกติ

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

สรุปโดย GN⁺

  • Clace เป็นแพลตฟอร์มสำหรับพัฒนาและดีพลอยเครื่องมือภายใน โดยใช้ SQLite เพื่อดึงข้อดีของการจัดเก็บไฟล์ออกมาให้ได้มากที่สุด
  • การใช้ SQLite ช่วยให้ได้ประโยชน์หลายด้าน เช่น การอัปเดตแบบทรานแซกชัน การย้อนกลับ การลบข้อมูลซ้ำ และความง่ายในการสำรองข้อมูล
  • แม้แนวทางนี้จะไม่ใช่วิธีที่พบได้ทั่วไปเพราะความสะดวกและเหตุผลทางประวัติศาสตร์ของระบบไฟล์ แต่ก็ช่วยเพิ่มประสิทธิภาพด้วยการใช้ความสามารถและสมรรถนะของ SQLite
  • โปรเจ็กต์ที่มีความสามารถคล้ายกันและน่าสนใจ ได้แก่ Firebase และ AWS Lambda

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

 
GN⁺ 2024-10-28
ความคิดเห็นจาก Hacker News
  • เมื่อหลายปีก่อน มีการทดลองใช้ SQLite เพื่อเสิร์ฟไฟล์แบบสแตติก โดยได้แรงบันดาลใจจากบทความ "35% Faster Than The Filesystem" มีการสร้างปลั๊กอินสำหรับเสิร์ฟไฟล์แบบสแตติกจาก SQLite ผ่าน Datasette แต่ไม่ได้ใช้งานมากนัก หากต้องการเสิร์ฟไฟล์ด้วย SQLite เครื่องมือ CLI sqlite-utils insert-files อาจมีประโยชน์

  • การอัปเดตแบบทรานแซ็กชันเป็นข้อดีสำคัญ เพราะสามารถอัปเดตหลายไฟล์พร้อมกันได้ ไม่ว่าเซิร์ฟเวอร์จะใช้ SQLite หรือไฟล์ซิสเต็ม ก็ยังไม่สามารถป้องกันไม่ให้เว็บแอปพังระหว่างอัปเดตได้ทั้งหมด ควรทำให้ทุกทรัพยากรย่อยของหน้าอ้างอิงด้วย content hash หรือชื่อเวอร์ชันที่เฉพาะเจาะจง

  • ตอนทำงานที่บริษัทพัฒนาเกมขนาดเล็กในช่วงปี 2011/2012 มีการเก็บแอสเซ็ตทั้งหมดไว้ในฐานข้อมูล sqlite3 และสร้างไฟล์ pak เพื่อเก็บออฟเซ็ตของไฟล์ ทำให้โหลดแอสเซ็ตในเกมมือถือได้รวดเร็ว และยังเก็บเมทาดาทาไว้ในฐานข้อมูลเพื่อค้นหาไฟล์ที่คล้ายกันได้ง่าย

  • การใช้ SQLite แทนไฟล์ซิสเต็มมีข้อดีตรงที่สามารถคิวรีไฟล์ได้ และยังใช้ SQL แบบ type-safe ผ่าน Kysely ได้ด้วย

  • แนวคิดการใช้ SQLite เพื่อเสิร์ฟคอนเทนต์แบบสแตติกยังไม่สมบูรณ์ เว็บเซิร์ฟเวอร์สมัยใหม่ใช้กลยุทธ์ที่เหมาะสมที่สุดในการจัดการไฟล์สแตติกอยู่แล้ว SQLite รองรับ memory-mapped I/O แต่ไม่เหมาะกับเว็บไซต์ขนาดใหญ่

  • SQLite เหมาะกับเว็บไซต์ที่มีทราฟฟิกต่ำกว่า 100K hits ต่อวัน เว็บไซต์ของ SQLite เองรองรับ HTTP requests ได้ราว 400K~500K ต่อวัน และโดยมากมี load average ต่ำกว่า 0.1

  • CMS สำหรับ static site generator จะใช้ฐานข้อมูล SQLite ในการพัฒนาและอัปเดตเว็บไซต์ จากนั้นจึงดัมพ์ออกเป็นหน้าแบบสแตติกลงไฟล์ซิสเต็มเพื่อดีพลอย

  • ในงานคอมพิวติ้งเชิงวิทยาศาสตร์สมรรถนะสูง วิธีที่ยืดหยุ่นและมีประสิทธิภาพสูงในการเข้าถึงข้อมูลมักเป็นฐานข้อมูล SQLite แบบอ่านอย่างเดียวที่อยู่บนแรมดิสก์

  • น่าสนใจที่จะเปรียบเทียบแนวทางนี้กับกรณีที่ไฟล์ซิสเต็มสามารถทำ deduplication, snapshot, versioning และ compression ได้ เพราะหากใช้ไฟล์ซิสเต็มขั้นสูง การสลับไดเรกทอรีไปเป็นเวอร์ชันใหม่อาจทำได้ง่ายกว่า

  • แนวทางการใช้ฐานข้อมูลเป็นไฟล์ซิสเต็มมีข้อดีอยู่บ้าง แต่เมื่อเกิดปัญหาขึ้นมาก็อาจกลายเป็นฝันร้ายได้