ปัญหาเบราว์เซอร์ไม่รองรับบั่นทอนเทคนิคใหม่ SQLite บน GitHub Pages

ทีมชุมชน BigGo
ปัญหาเบราว์เซอร์ไม่รองรับบั่นทอนเทคนิคใหม่ SQLite บน GitHub Pages

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

วิธีการนี้ซึ่งเคยถูกสาธิตครั้งแรกในปี 2021 ทำการคอมไพล์ SQLite เป็น WebAssembly และนำระบบไฟล์เสมือนมาใช้ที่ดึงข้อมูลส่วนย่อยของฐานข้อมูลผ่านคำขอ HTTP Range ซึ่งทำให้สามารถสอบถามชุดข้อมูลขนาดใหญ่ (สูงถึง 670MB ในตัวอย่างเดิม) ในขณะที่โหลดเฉพาะข้อมูลที่จำเป็นสำหรับแต่ละคำถามเท่านั้น แนวทางนี้เคยสัญญาว่าจะขจัดความต้องการเซิร์ฟเวอร์แบ็กเอนด์สำหรับเว็บไซต์สแตติกที่มีข้อมูลจำนวนมาก แต่การอภิปรายในชุมชนล่าสุดเผยให้เห็นปัญหาการทำงานที่แพร่หลาย

แนวทางทางเทคนิคดั้งเดิม:

  • คอมไพล์ SQLite เป็น WebAssembly ผ่าน Emscripten
  • ระบบไฟล์เสมือนที่ใช้ HTTP Range requests
  • ขนาดเพจ 1 KiB เพื่อการแบ่งส่วนข้อมูลที่เหมาะสม
  • ระบบดึงข้อมูลล่วงหน้าด้วยการขยายขนาดคำขอแบบทวีคูณ
  • การดำเนินการฐานข้อมูลแบบอ่านอย่างเดียวบนโฮสต์แบบคงที่

บั๊กคำขอ Range ใน Firefox

ผู้ใช้หลายคนรายงานว่าพบข้อผิดพลาดเครือข่ายเมื่อพยายามรันตัวอย่าง SQLite โดยผู้ใช้ Firefox ได้รับผลกระทบเป็นพิเศษ ปัญหาหลักเกิดจากวิธีที่ Firefox จัดการกับคำขอ HTTP Range สำหรับเนื้อหาที่ถูกบีบอัด

มันคงจะน่าสนใจกว่าถ้าตัวอย่างทุกตัว อย่างน้อยสำหรับผม ไม่ส่งกลับค่า [error: NetworkError: A network error occurred.]

ปัญหานี้เกี่ยวข้องกับการตีความข้อกำหนด HTTP ที่คลุมเครือเกี่ยวกับการเข้ารหัสเนื้อหา Firefox เพิ่ม 'identity' เข้าไปในรายการการเข้ารหัสที่รองรับใน Accept-Headers ในขณะที่เบราว์เซอร์อื่นแทนที่รายการด้วย 'identity' เมื่อ GitHub Pages ได้รับคำขอแบบ range จาก Firefox มันอาจส่งกลับส่วนย่อยของไฟล์ที่ถูกบีบอัดซึ่งทำให้เครื่องมือ SQLite ไม่สามารถอ่านได้ พฤติกรรมนี้ไม่ได้เกิดขึ้นเสมอมา – ผู้ใช้หลายคนระบุว่าตัวอย่างเคยทำงานได้อย่างถูกต้องในเวอร์ชัน Firefox ก่อนหน้า

ปัญหาความเข้ากันได้ของเบราว์เซอร์หลัก:

  • Firefox: บั๊กของ HTTP Range request กับเนื้อหาที่ถูกบีบอัด (Bug 1874840)
  • Safari: มีรายงานความล้มเหลวที่ไม่สม่ำเสมอจากผู้ใช้บางคน
  • Chrome/Chromium: โดยทั่วไปทำงานได้อย่างถูกต้อง
  • Edge: โดยทั่วไปทำงานได้อย่างถูกต้อง

ความกังวลเรื่องความน่าเชื่อถือข้ามเบราว์เซอร์

ปัญหาความเข้ากันได้นี้ไม่ได้จำกัดอยู่แค่ Firefox เท่านั้น ผู้ใช้ Safari บางส่วนก็รายงานความล้มเหลวเช่นกัน แม้ว่าปัญหาดูเหมือนจะไม่สม่ำเสมอเท่าในเบราว์เซอร์ของ Apple ความท้าทายพื้นฐานอยู่ที่ว่าเบราว์เซอร์ต่างกันตีความข้อกำหนดคำขอ HTTP range อย่างไร และผู้ให้บริการโฮสติ้งแบบสแตติกจัดการกับคำขอเหล่านี้อย่างไร GitHub Pages แม้จะยอดเยี่ยมสำหรับเนื้อหาแบบสแตติกทั่วไป อาจไม่สามารถจัดการกับการรวมกันเฉพาะของคำขอ range และการบีบอัดที่ระบบไฟล์เสมือน HTTP ของ SQLite ต้องการได้อย่างเหมาะสม

แนวทางทางเลือกเริ่มปรากฏ

แม้จะมีความท้าทายด้านความเข้ากันได้ แนวคิดดั้งเดิมก็ได้สร้างแรงบันดาลใจให้เกิดทางเลือกที่น่าสนใจหลายอย่าง DuckDB WASM ได้รับความนิยมมากขึ้นในฐานะตัวแทนสมัยใหม่ที่ให้ฟังก์ชันการทำงานคล้ายกันด้วยการรองรับเบราว์เซอร์ที่อาจดีกว่า นักพัฒนารายหนึ่งแบ่งปันประสบการณ์การใช้ DuckDB WASM บน GitHub Pages เพื่อแสดงแนวโน้มทางธุรกิจ แม้ว่าพวกเขาจะระบุว่าเวลาโหลดครั้งแรกอยู่ที่ประมาณ 10 วินาทีสำหรับชุดข้อมูลขนาดใหญ่

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

เทคโนโลยีทางเลือก:

  • DuckDB WASM: ทางเลือกสมัยใหม่ที่มีการรองรับเบราว์เซอร์ที่ดีกว่า
  • Official SQLite WASM: ตอนนี้รวมการรองรับ WebAssembly แล้ว
  • absurd-sql: ใช้ IndexedDB เป็นแบ็กเอนด์สำหรับจัดเก็บข้อมูล
  • sqlite-wasm-http: การแจกจ่ายอย่างเป็นทางการของ SQLite ที่มีการรองรับ HTTP

ข้อจำกัดในทางปฏิบัติและวิธีแก้ปัญหา

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

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

อ้างอิง: Hosting SQLite databases on Github Pages