วิธีที่ Google Docs จัดการกับการแก้ไขพร้อมกัน
Google Docs อนุญาตให้คนจำนวนมากแก้ไขเอกสารหนึ่งฉบับได้ในเวลาเดียวกัน
จะเกิดอะไรขึ้นเมื่อคนสองคนแก้ไขบรรทัดเดียวกันเป๊ะในวินาทีเดียวกัน?
ระบบมาตรฐานทำงานโดยการอ่าน แก้ไข และบันทึกข้อมูล หากคนสองคนบันทึกพร้อมกัน คนที่สองจะเขียนทับคนแรก ทำให้คนแรกสูญเสียงานที่ทำไป
Google Docs หลีกเลี่ยงปัญหานี้โดยใช้ Operational Transformation (OT)
ระบบไม่ได้ส่งเอกสารทั้งฉบับทุกครั้งที่คุณพิมพ์ แต่จะส่งเพียงการดำเนินการ (operations) เล็กๆ เท่านั้น
ตัวอย่างเช่น:
- ผู้ใช้ A แทรกคำว่า "Beautiful" ที่ตำแหน่งที่ 6
- ผู้ใช้ B แทรกคำว่า "Amazing" ที่ตำแหน่งที่ 6
หากเซิร์ฟเวอร์นำการดำเนินการเหล่านี้ไปใช้โดยไม่มีการเปลี่ยนแปลง การแก้ไขอย่างหนึ่งจะหายไป
แต่แทนที่จะทำเช่นนั้น เซิร์ฟเวอร์จะทำการแปลง (transform) การดำเนินการเหล่านั้นแทน
เซิร์ฟเวอร์จะเห็นว่าผู้ใช้ A อัปเดตเอกสารก่อน ทำให้เอกสารยาวขึ้น เมื่อเซิร์ฟเวอร์ประมวลผลผู้ใช้ B จึงต้องเปลี่ยนตำแหน่งจาก 6 เป็น 16
ข้อความสุดท้ายจะกลายเป็น: Hello Beautiful Amazing World.
การแก้ไขทั้งสองส่วนยังคงอยู่
ระบบนี้อาศัยเสาหลักทางเทคนิคเหล่านี้:
- WebSockets สำหรับการเชื่อมต่อที่ต่อเนื่อง
- การติดตามเวอร์ชัน (Version tracking) เพื่อให้ทราบว่าการแก้ไขใดมาจากเวอร์ชันไหน
- สตรีมเหตุการณ์แบบเรียลไทม์ (Real-time event streams) เพื่อกระจายการเปลี่ยนแปลง
Google Docs ไม่ได้ทำการล็อกเอกสาร เพราะการล็อกจะทำให้คนอื่นๆ ไม่สามารถทำงานได้ในขณะที่มีคนหนึ่งกำลังพิมพ์อยู่
แต่จะใช้การรวมข้อมูลอย่างชาญฉลาด (intelligent merging) แทน
ระบบยังทำการแปลงตำแหน่งเคอร์เซอร์ของคุณด้วย หากมีคนเพิ่มข้อความข้างหน้าคุณ เคอร์เซอร์ของคุณจะเลื่อนไปข้างหน้าเพื่อไม่ให้คุณเสียตำแหน่งที่กำลังพิมพ์อยู่
ในขณะที่ Google Docs ใช้ OT แต่เครื่องมือใหม่ๆ หลายอย่าง เช่น Figma ใช้ Conflict-free Replicated Data Types (CRDT) ซึ่ง CRDT ช่วยให้ผู้ใช้สามารถรวมการเปลี่ยนแปลงได้โดยไม่ต้องมีเซิร์ฟเวอร์กลาง
หากคุณกำลังศึกษาเรื่องการออกแบบระบบ (system design) ให้จำประเด็นเหล่านี้ไว้:
- ใช้ WebSockets เพื่อความหน่วงต่ำ (low latency)
- ใช้ OT หรือ CRDT สำหรับการแก้ไขความขัดแย้ง (conflict resolution)
- ใช้หมายเลขเวอร์ชันเพื่อติดตามการเปลี่ยนแปลง
- ซิงค์เคอร์เซอร์เพื่อปรับปรุงประสบการณ์ผู้ใช้
Google Docs ไม่ได้ป้องกันไม่ให้เกิดความขัดแย้ง แต่ใช้วิธีแก้ไขความขัดแย้งเหล่านั้นด้วยการแปลงการแก้ไข เพื่อให้ทุกคนเห็นผลลัพธ์ที่ตรงกัน
