-
Movable tree CRDTs and Loro's implementation
-
ภูมิหลัง
- ในระบบกระจายศูนย์และซอฟต์แวร์ทำงานร่วมกัน การจัดการความสัมพันธ์แบบลำดับชั้นมีความซับซ้อน
- เมื่อจำลองการย้ายด้วยการรวมการลบและการแทรกในโครงสร้างข้อมูล การแก้ความขัดแย้งและการทำให้ตรงกับความคาดหวังของผู้ใช้ทำได้ยาก
- ตัวอย่างเช่น หากมีการย้ายโหนดเดียวกันไปยังพาเรนต์คนละตัวพร้อมกัน อาจเกิดโหนดซ้ำที่มีเนื้อหาเดียวกันได้
-
ความขัดแย้งของต้นไม้ที่ย้ายได้
- การทำงานหลักของต้นไม้ที่ย้ายได้: สร้าง, ลบ, ย้าย
- ความขัดแย้งที่อาจเกิดขึ้นเมื่อซิงก์การทำงานพร้อมกัน:
- โหนดเดียวกันถูกลบและถูกย้าย
- โหนดเดียวกันถูกย้ายไปอยู่ใต้โหนดพาเรนต์คนละตัว
- โหนดอื่นถูกย้ายจนเกิดวงจร
- โหนดลูกหลานถูกย้ายขณะที่โหนดบรรพบุรุษถูกลบ
-
การลบและการย้ายของโหนดเดียวกัน
- แก้ได้ค่อนข้างง่าย
- เลือกใช้การทำงานอย่างใดอย่างหนึ่งและละเลยอีกอย่างหนึ่งตามทाइम์สแตมป์ของระบบกระจายศูนย์หรือข้อกำหนดเฉพาะของแอปพลิเคชัน
-
ย้ายโหนดเดียวกันไปอยู่ใต้พาเรนต์คนละตัว
- การรวมการย้ายที่เกิดพร้อมกันมีความซับซ้อนมากกว่า
- สามารถใช้แนวทางได้หลากหลายตามลักษณะของแอปพลิเคชัน:
- ลบโหนดแล้วสร้างสำเนาไว้ใต้โหนดพาเรนต์อีกตัว
- อนุญาตให้โหนดเชื่อมกับพาเรนต์สองตัว (โดยทั่วไปไม่อนุญาต)
- จัดเรียงการทำงานทั้งหมดแล้วนำไปใช้ตามลำดับ
-
การเกิดวงจรจากการย้ายของโหนดอื่น
- การแก้ปัญหาวงจรที่เกิดจากการย้ายพร้อมกันมีความซับซ้อน
- มีหลายวิธี:
- แจ้งข้อผิดพลาด
- แสดงโหนดที่เป็นวงจรในพื้นที่ "timeout" พิเศษ
- ให้เซิร์ฟเวอร์จัดการการย้าย
- ใช้การจัดเรียงเชิงทอพอโลยี
- ซ่อน edge ที่ทำให้เกิดวงจร
-
การลบโหนดบรรพบุรุษและการย้ายโหนดลูกหลาน
- การย้ายโหนดลูกหลานขณะลบโหนดบรรพบุรุษเป็นกรณีที่มักถูกมองข้ามได้ง่าย
- หากลบโหนดลูกหลานทั้งหมดโดยตรง ผู้ใช้อาจเข้าใจว่าเป็นการสูญหายของข้อมูล
-
วิธีจัดการความขัดแย้งของแอปพลิเคชันยอดนิยม
- Dropbox: เคยจัดการการย้ายไฟล์เป็นการลบแล้วสร้างใหม่ แต่มีความเสี่ยงต่อการสูญหายของข้อมูล
- Figma: เซิร์ฟเวอร์กลางตรวจจับวงจรและปฏิเสธการทำงานเพื่อรักษาความสอดคล้อง
-
Movable tree CRDTs
- ใช้ CRDTs แทนโซลูชันแบบรวมศูนย์
- อัลกอริทึมยุคแรกที่อิง CRDT นั้นนำไปใช้งานได้ยากและมี overhead ด้านการจัดเก็บสูง
- จากการปรับปรุงอย่างต่อเนื่อง ทำให้อัลกอริทึมซิงก์ต้นไม้แบบ CRDT บางส่วนเหมาะกับการใช้งานจริงใน production
-
การย้ายที่มีความพร้อมใช้งานสูงสำหรับต้นไม้ที่ทำซ้ำ
- รวมการทำงานสามอย่างของต้นไม้ (สร้าง, ลบ, ย้าย) ให้เป็นการทำงานแบบย้าย
- การย้ายถูกนิยามเป็น
Move t p m c
- การลบโหนดจัดการโดยย้ายไปยังโหนด
TRASH
-
ทाइम์สแตมป์เชิงตรรกะที่จัดเรียงแบบสากล
- ใช้ Lamport timestamp เพื่อกำหนดลำดับเชิงเหตุและผลของเหตุการณ์ในระบบกระจายศูนย์
- ตัวเลขที่น้อยกว่าหมายถึงเหตุการณ์ที่เกิดก่อน
-
การใช้การทำงานจากระยะไกล
- ความปลอดภัยของการทำงานขึ้นอยู่กับสถานะของต้นไม้ในขณะนำไปใช้
- เมื่อจัดการอัปเดตจากระยะไกล จะย้อนการทำงานล่าสุด แทรกการทำงานใหม่ แล้วจึงนำการทำงานที่ย้อนกลับไปใช้ใหม่อีกครั้ง
-
CRDT: ลำดับชั้นต้นไม้แบบเปลี่ยนแปลงได้
- แต่ละโหนดติดตามโหนดพาเรนต์ทั้งหมดในประวัติและกำหนดตัวนับให้
- หากเกิดวงจรระหว่างการซิงก์ จะเชื่อมต่อกลับไปยังโหนดพาเรนต์ในประวัติที่ใกล้ที่สุด
-
การใช้งาน Movable tree CRDTs ใน Loro
- นำอัลกอริทึมของ Martin Kleppmann มาใช้เพื่อให้ได้ประสิทธิภาพสูง
- ผสานอัลกอริทึม
Fractional Index เพื่อจัดลำดับโหนดลูกได้
-
ความขัดแย้งที่อาจเกิดขึ้นในการจัดลำดับโหนดลูก
- เมื่อแทรกหลายโหนดในตำแหน่งเดียวกัน อาจได้รับ
Fractional Index เดียวกัน
- ใช้
PeerID เพื่อพิจารณาลำดับสัมพัทธ์ของรายการที่มี Fractional Index เดียวกัน
-
การใช้งานและขนาดการเข้ารหัส
Fractional Index ใช้กำหนดลำดับของโหนด
- ขนาดการเข้ารหัสอาจต้องใช้ไบต์เพิ่มเติมในกรณีเลวร้ายที่สุด แต่เกิดขึ้นไม่บ่อย
-
งานที่เกี่ยวข้อง
- นอกจาก
Fractional Index แล้ว ยังมี movable list CRDT ด้วย
Fractional Index นำไปใช้ได้ง่ายและมีประโยชน์เมื่อจำเป็นต้องใช้เพียงลำดับสัมพัทธ์
-
Benchmark
- มีการทดสอบ benchmark ประสิทธิภาพของการใช้งาน movable tree ของ Loro
- สามารถรองรับการทำงานร่วมกันแบบเรียลไทม์และการ checkout เวอร์ชันย้อนหลังได้อย่างราบรื่น
-
สรุป
- แนะนำความยากของการใช้งาน Movable tree CRDTs และอัลกอริทึมใหม่สองแบบ
- Loro ผสานอัลกอริทึมของ Martin Kleppmann กับ
Fractional Index เพื่อตอบโจทย์สถานการณ์การใช้งานของแอปพลิเคชันที่หลากหลาย
-
สรุปของ GN⁺
- Movable tree CRDTs มีบทบาทสำคัญในการจัดการโครงสร้างข้อมูลแบบลำดับชั้นในระบบกระจายศูนย์
- Loro มอบประสิทธิภาพสูงและการแก้ความขัดแย้งอย่างมีประสิทธิภาพ จึงเหมาะกับแอปพลิเคชันทำงานร่วมกันแบบเรียลไทม์
- ใช้
Fractional Index เพื่อแก้ปัญหาการจัดลำดับโหนดลูก
- โปรเจกต์อื่นที่มีความสามารถคล้ายกัน ได้แก่ Figma และ Dropbox
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
กำลังพัฒนาเอดิเตอร์แบบหลายผู้เล่นตัวใหม่
เปิดซอร์ส React Table Library
ขอคำแนะนำ
เมื่อต้องทำงานกับเนื้อหาข้อความที่มีการจัดรูปแบบ เช่น Google Docs/Zoho Writer จำเป็นต้องมีการจัดการต้นไม้
สงสัยว่ามี CRDT ที่ใช้งานได้จริงสำหรับแอปพลิเคชันที่ข้อมูลหนาแน่น เช่น รูปภาพ (พิกเซล) และโมเดล 3D หรือไม่
คิดว่าย่อหน้าแรกให้อารมณ์เหมือนเสียงของ ChatGPT