Jak Google Docs radzi sobie z jednoczesną edycją

Google Docs umożliwia wielu osobom jednoczesną edycję jednego dokumentu.

Co się dzieje, gdy dwie osoby edytują dokładnie tę samą linię w tej samej sekundzie?

Standardowy system działa poprzez odczytywanie, modyfikowanie i zapisywanie danych. Jeśli dwie osoby zapiszą zmiany jednocześnie, druga osoba nadpisze pierwszą. Pierwsza osoba traci swoją pracę.

Google Docs unika tego, stosując Operational Transformation (OT).

Nie wysyła całego dokumentu za każdym razem, gdy coś wpiszesz. Wysyła małe operacje.

Na przykład:

  • Użytkownik A wstawia „Beautiful” na pozycji 6.
  • Użytkownik B wstawia „Amazing” na pozycji 6.

Gdyby serwer zastosował je bez zmian, jedna edycja by zniknęła.

Zamiast tego serwer przekształca operacje.

Serwer widzi, że użytkownik A zaktualizował dokument jako pierwszy. Dokument rośnie. Gdy serwer przetwarza dane użytkownika B, zmienia pozycję z 6 na 16.

Końcowy tekst brzmi: Hello Beautiful Amazing World.

Obie edycje zostają zachowane.

System opiera się na tych filarach technicznych:

  • WebSockets dla stałego połączenia.
  • Śledzenie wersji, aby wiedzieć, która edycja pochodzi z której wersji.
  • Strumienie zdarzeń w czasie rzeczywistym do rozgłaszania zmian.

Google Docs nie blokuje dokumentu. Blokowanie uniemożliwiłoby pracę innym osobom, podczas gdy jedna z nich pisze.

Zamiast tego stosuje inteligentne scalanie.

System przekształca również pozycję kursora. Jeśli ktoś doda tekst przed Tobą, Twój kursor przesunie się do przodu, abyś nie stracił miejsca, w którym piszesz.

Podczas gdy Google Docs używa OT, wiele nowych narzędzi, takich jak Figma, korzysta z Conflict-free Replicated Data Types (CRDT). CRDT umożliwiają użytkownikom scalanie zmian bez centralnego serwera.

Jeśli studiujesz projektowanie systemów, pamiętaj o tych punktach:

  • Używaj WebSockets dla niskich opóźnień.
  • Używaj OT lub CRDT do rozwiązywania konfliktów.
  • Używaj numerów wersji do śledzenia zmian.
  • Synchronizuj kursory, aby poprawić doświadczenie użytkownika.

Google Docs nie zapobiega konfliktom. Rozwiązuje je poprzez przekształcanie edycji, tak aby każdy widział ten sam wynik.

Źródło: https://dev.to/khushindpatel/how-does-google-docs-handle-two-people-editing-the-same-line-at-the-exact-same-time-38gi