איך Google Docs מטפל בעריכות בו-זמניות

Google Docs מאפשר לאנשים רבים לערוך מסמך אחד בו-זמנית.

מה קורה כששני אנשים עורכים בדיוק את אותה שורה באותה שנייה?

מערכת סטנדרטית פועלת על ידי קריאה, שינוי ושמירה של נתונים. אם שני אנשים שומרים בו-זמנית, האדם השני דורס את הראשון. האדם הראשון מאבד את עבודתו.

Google Docs נמנע מכך באמצעות Operational Transformation (OT).

הוא לא שולח את המסמך כולו בכל פעם שאתה מקליד. הוא שולח פעולות (operations) קטנות.

לדוגמה:

  • משתמש A מכניס את "Beautiful" במיקום 6.
  • משתמש B מכניס את "Amazing" במיקום 6.

אם השרת היה מחיל אותן ללא שינויים, עריכה אחת הייתה נעלמת.

במקום זאת, השרת מבצע טרנספורמציה (transformation) לפעולות.

השרת מזהה שמשתמש A עדכן את המסמך ראשון. המסמך גדל. כשהשרת מעבד את משתמש B, הוא משנה את המיקום מ-6 ל-16.

הטקסט הסופי הופך ל: Hello Beautiful Amazing World.

שתי העריכות נשמרות.

המערכת מסתמכת על עמודי התווך הטכניים הבאים:

  • WebSockets עבור חיבור קבוע.
  • מעקב גרסאות כדי לדעת איזו עריכה הגיעה מאיזו גרסה.
  • זרמי אירועים (event streams) בזמן אמת כדי לשדר שינויים.

Google Docs לא נועל את המסמך. נעילה הייתה מונעת מכל שאר האנשים לעבוד בזמן שאדם אחד מקליד.

במקום זאת, הוא משתמש במיזוג (merging) חכם.

המערכת גם מבצעת טרנספורמציה למיקום הסמן (cursor) שלך. אם מישהו מוסיף טקסט לפניך, הסמן שלך זז קדימה כדי שלא תאבד את המקום שבו היית.

בעוד ש-Google Docs משתמש ב-OT, כלים חדשים רבים כמו Figma משתמשים ב-Conflict-free Replicated Data Types (CRDT). CRDTs מאפשרים למשתמשים למזג שינויים ללא שרת מרכזי.

אם אתם לומדים עיצוב מערכות (system design), זכרו את הנקודות הבאות:

  • השתמשו ב-WebSockets עבור שיהוי (latency) נמוך.
  • השתמשו ב-OT או CRDT לפתרון קונפליקטים.
  • השתמשו במספרי גרסאות כדי לעקוב אחר שינויים.
  • סנכרנו סמנים (cursors) כדי לשפר את חווית המשתמש.

Google Docs לא מונע קונפליקטים. הוא פותר אותם על ידי טרנספורמציה של עריכות כך שכולם רואים את אותה תוצאה.

מקור: https://dev.to/khushindpatel/how-does-google-docs-handle-two-people-editing-the-same-line-at-the-exact-same-time-38gi