พื้นที่จัดเก็บ SQLite แบบหน่วงเวลาเป็นศูนย์ใน Durable Object ทุกตัว
(simonwillison.net)-
Zero-latency SQLite storage in every Durable Object
- Kenton Varda แนะนำแพลตฟอร์ม Durable Object เวอร์ชันถัดไปของ Cloudflare โดยแพลตฟอร์มนี้เพิ่งอัปเกรดจากที่เก็บคีย์/ค่าไปเป็นระบบเชิงสัมพันธ์เต็มรูปแบบบน SQLite
- สำหรับข้อมูลพื้นฐานที่เป็นประโยชน์เกี่ยวกับ Durable Objects เวอร์ชันแรก สามารถดู Cloudflare’s durable multiplayer moat ของ Paul Butler ได้ ซึ่งได้รับความนิยมในการสร้างแอปพลิเคชันทำงานร่วมกันแบบเรียลไทม์บนพื้นฐาน WebSocket
- Durable Objects แบบใหม่ที่ใช้ SQLite มีองค์ประกอบด้านการออกแบบระบบกระจายที่น่าสนใจ และเสนอแนวทางที่น่าดึงดูดในการออกแบบแอปพลิเคชันขนาดใหญ่
-
แนวคิดหลักของ Durable Objects
- Durable Object วางตรรกะของแอปพลิเคชันไว้บนโฮสต์กายภาพเดียวกันกับข้อมูล จึงให้ประสิทธิภาพการอ่านและเขียนที่รวดเร็วมาก
- อ็อบเจ็กต์หนึ่งตัวทำงานบนเธรดเดียวของเครื่องเดียว จึงมีข้อจำกัดด้าน throughput หากต้องรองรับทราฟฟิกมากขึ้นก็สร้างอ็อบเจ็กต์เพิ่ม เหมาะที่สุดเมื่อแต่ละหน่วยสถานะมีทราฟฟิกต่ำพอที่อ็อบเจ็กต์เดียวจะจัดการได้
-
ตัวอย่างระบบจองเที่ยวบิน
- เที่ยวบินแต่ละเที่ยวสามารถแมปไปยัง Durable Object เฉพาะที่มีฐานข้อมูล SQLite ของตัวเองได้ โดยแต่ละสายการบินจะมีฐานข้อมูลใหม่ถูกสร้างขึ้นหลายพันรายการต่อวัน
- แต่ละ DO มีชื่อเฉพาะ และเครือข่ายของ Cloudflare จะทำการ route คำขอไปยังอ็อบเจ็กต์นั้นไม่ว่าจะอยู่ที่ใดในโลก
-
รายละเอียดทางเทคนิค
- ได้แรงบันดาลใจจาก Litestream โดยแต่ละ DO จะสตรีมลำดับของรายการ WAL ไปยัง object storage อย่างต่อเนื่อง ซึ่งจะถูกรวมเป็นแบตช์ทุก ๆ 16MB หรือทุก ๆ 10 วินาที
- เพื่อรับประกันความทนทานของข้อมูลภายในช่วงเวลา 10 วินาที การเขียนจะถูกส่งไปยัง replica ห้าชุดในศูนย์ข้อมูลใกล้เคียงทันทีที่ commit และเมื่อมีการยืนยันครบสามชุดจึงจะถือว่าการเขียนสำเร็จ
-
การออกแบบ JavaScript API
- ออกแบบให้เป็นแบบ blocking แทนที่จะเป็น asynchronous เพื่อให้การทำงานด้าน persistence แบบ single-thread ที่รวดเร็ว
- มีตัวอย่างที่ตั้งใจแสดงรูปแบบคิวรี N+1 ซึ่ง SQLite สามารถจัดการได้ดี
-
Storage Relay Service
- เป็นระบบพื้นฐานของ Durable Objects และรองรับระบบ D1 SQLite เดิมของ Cloudflare มานานกว่าหนึ่งปีแล้ว
-
ตำแหน่งที่ Durable Objects ถูกสร้างขึ้น
- เมื่อ Durable Objects ถูกสร้างแล้วจะไม่ย้ายตำแหน่ง โดยค่าเริ่มต้นจะถูก instantiate ในศูนย์ข้อมูลที่รับคำขอ get() ครั้งแรก
- หากต้องการสร้าง Durable Objects ในตำแหน่งอื่นด้วยตนเอง สามารถระบุพารามิเตอร์
locationHintแบบไม่บังคับให้กับget()ได้
-
เว็บไซต์ where.durableobjects.live
- เป็นเว็บไซต์สำหรับติดตามว่ามีการสร้าง DO ที่ตำแหน่งใดในเครือข่าย Cloudflare
สรุปโดย GN⁺
- Durable Objects ของ Cloudflare ที่ใช้ SQLite เป็นฐาน เปิดความเป็นไปได้ใหม่ในการออกแบบแอปพลิเคชันขนาดใหญ่ โดยวางข้อมูลและตรรกะของแอปพลิเคชันไว้บนโฮสต์กายภาพเดียวกันเพื่อให้ได้ประสิทธิภาพที่รวดเร็ว
- ระบบนี้มีประโยชน์อย่างยิ่งกับแอปพลิเคชันทำงานร่วมกันแบบเรียลไทม์ และให้ความยืดหยุ่นในการจัดการหน่วยสถานะที่หลากหลาย
- Durable Objects สร้าง replica ในหลายศูนย์ข้อมูลเพื่อรับประกันความทนทานของข้อมูล ซึ่งช่วยเพิ่มเสถียรภาพและความน่าเชื่อถือ
- เทคโนโลยีนี้น่าสนใจสำหรับนักพัฒนาที่สนใจการออกแบบระบบกระจายขนาดใหญ่ โดยระบบที่มีความสามารถคล้ายกัน ได้แก่ Amazon’s DynamoDB และ Google’s Firestore
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
API สำหรับการเขียนเป็นแบบ synchronous แต่มีความสามารถรอแบบ asynchronous ที่ซ่อนอยู่ หากการเขียนล้มเหลว runtime จะเปลี่ยน response เป็น HTTP failure ทำให้สามารถ batch การเขียนได้โดยอัตโนมัติและสมมติว่าเขียนสำเร็จ
แต่ละ DO จะสตรีมลำดับของรายการ WAL ไปยัง object storage โดยจะ batch ทุก 16MB หรือทุก 10 วินาที
ชอบดีไซน์ของ Durable Object เข้าใจกลไกภายในได้ง่าย
เข้าใจได้ยากว่า Durable Objects อยู่ตำแหน่งทางกายภาพที่ไหน
เทคโนโลยีคลาวด์ใหม่ ๆ เข้าใจได้ยาก
สงสัยว่าจะจัดการ schema migration อย่างไร
ดีไซน์ของ DO น่าสนใจ แต่คิดว่าเหมาะแค่กับระบบโหลดสูงมากหรือโปรเจกต์ทดลอง
ประทับใจกับดีไซน์ของ DO คิดว่าวิธีจัดการงานซับซ้อนในสเกลเล็กคล้ายกับโครงสร้างของผลิตภัณฑ์จริง
สังเกตว่า CF สนับสนุนให้นักพัฒนาใช้ DO
สงสัยว่า DO ตรงกับ "model" ในสถาปัตยกรรม MVC หรือไม่