Bagaimana Google Docs Menangani Pengeditan Secara Bersamaan
Google Docs memungkinkan banyak orang untuk mengedit satu dokumen pada saat yang sama.
Apa yang terjadi ketika dua orang mengedit baris yang sama persis pada detik yang sama?
Sistem standar bekerja dengan membaca, memodifikasi, dan menyimpan data. Jika dua orang menyimpan secara bersamaan, orang kedua akan menimpa orang pertama. Orang pertama akan kehilangan hasil kerjanya.
Google Docs menghindari hal ini menggunakan Operational Transformation (OT).
Ia tidak mengirimkan seluruh dokumen setiap kali Anda mengetik. Ia hanya mengirimkan operasi-operasi kecil.
Contohnya:
- Pengguna A menyisipkan "Beautiful" pada posisi 6.
- Pengguna B menyisipkan "Amazing" pada posisi 6.
Jika server menerapkan hal ini tanpa perubahan, salah satu pengeditan akan hilang.
Sebaliknya, server mentransformasi operasi-operasi tersebut.
Server melihat Pengguna A memperbarui dokumen terlebih dahulu. Dokumen tersebut bertambah panjang. Saat server memproses Pengguna B, ia mengubah posisinya dari 6 menjadi 16.
Teks akhirnya menjadi: Hello Beautiful Amazing World.
Kedua pengeditan tetap ada.
Sistem ini mengandalkan pilar-pilar teknis berikut:
- WebSockets untuk koneksi yang konstan.
- Pelacakan versi untuk mengetahui pengeditan mana yang berasal dari versi mana.
- Aliran peristiwa waktu nyata untuk menyiarkan perubahan.
Google Docs tidak mengunci dokumen. Penguncian akan menghentikan orang lain untuk bekerja saat satu orang sedang mengetik.
Sebaliknya, ia menggunakan penggabungan yang cerdas.
Sistem ini juga mentransformasi posisi kursor Anda. Jika seseorang menambahkan teks di depan Anda, kursor Anda akan bergerak maju sehingga Anda tidak kehilangan posisi Anda.
Meskipun Google Docs menggunakan OT, banyak alat baru seperti Figma menggunakan Conflict-free Replicated Data Types (CRDT). CRDT memungkinkan pengguna untuk menggabungkan perubahan tanpa server pusat.
Jika Anda sedang mempelajari desain sistem, ingatlah poin-poin ini:
- Gunakan WebSockets untuk latensi rendah.
- Gunakan OT atau CRDT untuk resolusi konflik.
- Gunakan nomor versi untuk melacak perubahan.
- Sinkronkan kursor untuk meningkatkan pengalaman pengguna.
Google Docs tidak mencegah konflik. Ia menyelesaikannya dengan mentransformasi pengeditan sehingga semua orang melihat hasil yang sama.
