วิธีที่ 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 ไม่ได้ป้องกันไม่ให้เกิดความขัดแย้ง แต่ใช้วิธีแก้ไขความขัดแย้งเหล่านั้นด้วยการแปลงการแก้ไข เพื่อให้ทุกคนเห็นผลลัพธ์ที่ตรงกัน

ที่มา: https://dev.to/khushindpatel/how-does-google-docs-handle-two-people-editing-the-same-line-at-the-exact-same-time-38gi