Masalah dan Senario yang Berkenaan
Reka bentuk editor kolaboratif masa nyata yang menyokong perenggan, tajuk, senarai, teks tebal, dan sauh komen (comment anchors). Sistem ini mempunyai 20 juta pengguna aktif harian dan mengekalkan 2 juta sambungan pada waktu puncak, dengan 200,000 pengguna aktif menaip. Seorang penyunting aktif menghasilkan purata dua kemas kini sesaat, dan satu dokumen hangat mungkin mempunyai 100 penyunting serentak. Kolaborator dalam talian sepatutnya melihat suntingan jarak jauh dalam tempoh 200 milisaat pada p95. Pengguna boleh menyunting di luar talian sehingga 24 jam dan menggabungkannya semula selepas menyambung semula. Suntingan yang diakui oleh pelayan tidak boleh hilang. Kursor, pilihan (selections), dan status dalam talian boleh hilang seketika.
Sistem ini juga menyokong kebenaran melihat (viewer), mengulas (commenter), dan menyunting (editor), perubahan kebenaran, sejarah versi, buat asal (undo) bagi setiap pengguna, dan akses pelbagai rantau. Temu duga ini tidak memerlukan pembuktian algoritma CRDT atau OT dari awal atau meniru seni bina peribadi mana-mana syarikat. Calon harus memilih model penyelesaian konflik, menghubungkannya dengan struktur data editor, pengangkutan, ketahanan data, dan sempadan kebenaran, serta menyatakan perkara yang tidak dapat dijamin oleh reka bentuk tersebut.
Bahan temu duga Bahasa Inggeris dan Bahasa Cina semasa dari tahun 2026 membentangkan penyuntingan kolaboratif sebagai masalah reka bentuk sistem yang merangkumi OT berbanding CRDT, sambungan WebSocket, bilik dokumen, kehadiran kursor, penyuntingan luar talian, kemas kini tahan lasak, dan pemulihan tangkapan kilat (snapshot). Dokumentasi Yjs menyediakan bukti utama untuk kemas kini komutatif, sekutu, dan idempoten, penyelarasan delta vektor keadaan, dan kesedaran (awareness) tidak berterusan. Gabungan ini menjadikan soalan ini representatif dan boleh disahkan secara teknikal.
Perkara yang Dinilai oleh Penemu Duga
Pertama, adakah calon menyelesaikan penumpuan serentak dan bukannya terhenti setakat “gunakan WebSocket”? WebSocket menyediakan saluran dwiarah. Ia tidak menentukan hasil apabila dua pengguna memasukkan teks pada kedudukan yang sama. Jawapan yang kukuh membandingkan model OT berpengantara pelayan dengan model CRDT dan memilih satu untuk kekangan yang dinyatakan.
Kedua, adakah jawapan memisahkan pengalaman tempatan daripada janji ketahanan pelayan? Menaip mesti diguna pakai secara tempatan sebelum pusingan pergi balik rangkaian. “Diakui bermakna tidak hilang” memerlukan pelayan mereplikasi kemas kini secara tahan lasak merentasi zon ketersediaan sebelum mengembalikan pengakuan (ack). Sehingga itu, klien menyimpan kemas kini dalam barisan menunggu (pending queue) dan mencuba semula dengan identiti operasi yang sama.
Ketiga, adakah reka bentuk memisahkan kandungan tahan lasak daripada kehadiran fana? Kandungan dokumen, sauh komen, dan sejarah versi mesti dipulihkan. Pergerakan kursor mempunyai churn yang tinggi dan tamat tempoh selepas terputus sambungan. Mengekalkan setiap pergerakan kursor dalam log dokumen meningkatkan kos dan mencemarkan pemulihan dengan keadaan basi.
Keempat, bolehkah calon menaakul tentang semantik teks kaya? Urutan aksara yang menumpu tidak secara automatik menjadikan pepohon dokumen sah. Senarai, jadual, sauh komen, peningkatan skema, dan skop buat asal memerlukan model, versi, dan invarian yang eksplisit. Ofset integer biasa juga beralih sebaik sahaja pengguna jarak jauh memasukkan teks sebelum kedudukan tersebut.
Akhir sekali, adakah kapasiti, kawasan panas (hotspots), pemilikan pelbagai rantau, kebenaran, dan pengesahan membentuk gelung tertutup? Jawapan yang kukuh mengira beban tulis dan sebaran keluar (fan-out) bagi setiap bilik, mengehadkan klien yang perlahan, menjelaskan sebab suntingan luar talian yang kebenarannya telah dibatalkan tidak boleh digabungkan begitu sahaja, dan menggunakan kemas kini yang disusun semula, pendua, sekatan rangkaian (partitions), dan failover untuk membuktikan penumpuan dan ketahanan.
Soalan Penjelasan Sebelum Menjawab
- Apakah yang sedang disunting? Reka bentuk utama menggunakan pepohon teks kaya berstruktur. Bait imej disimpan dalam storan objek; dokumen mengandungi rujukan dan atribut.
- Apakah maksud konflik dari sudut produk? Kemas kini serentak menumpu secara deterministik tanpa menulis ganti antara satu sama lain. Sistem tidak menyimpulkan niat perniagaan daripada dua ayat yang bercanggah.
- Apakah maksud diakui (acknowledged)? Pelayan mengembalikan ack hanya selepas kemas kini memasuki log tahan lasak yang direplikasi merentasi tiga zon ketersediaan di rantau asal (home region).
- Adakah susunan linear sejagat diperlukan? Tidak. Kandungan menumpu melalui CRDT. Ofset log wujud untuk audit, pemulihan, dan tanda aras (watermarks) pengakuan, bukan untuk ketepatan penggabungan.
- Berapa lamakah klien boleh kekal di luar talian? Sehingga 24 jam. Ia mengekalkan keadaan CRDT tempatan dan kemas kini yang belum diakui, kemudian membuat pengesahan semula sebelum bertukar delta.
- Apakah tahap kebenarannya?
viewermembaca,commenterhanya menukar domain komen, daneditormenukar kandungan. Penyertaan, penyambungan semula, dan setiap operasi tulis disahkan kebenarannya. - Adakah keadaan kursor tahan lasak? Tidak. Kehadiran menggunakan denyutan jantung (heartbeats) dan TTL. Kemas kini kursor yang hilang digantikan oleh kemas kini keadaan seterusnya.
- Bolehkah beberapa rantau menerima operasi tulis untuk dokumen yang sama? Reka bentuk utama menetapkan rantau asal bagi setiap dokumen dan memajukan operasi tulis ke sana, memudahkan pengesahan kebenaran, audit, dan failover.
- Berapa lamakah sejarah versi dikekalkan? Andaikan versi yang boleh dilihat oleh pengguna dikekalkan selama 30 hari. Ia berbeza daripada tangkapan kilat yang dipadatkan yang digunakan untuk penyelarasan dalam talian.
- Adakah penyulitan hujung-ke-hujung (end-to-end encryption) dalam skop? Reka bentuk utama membenarkan pelayan mengesahkan kebenaran dan skema kandungan. Penyulitan hujung-ke-hujung ialah pertukaran pertimbangan (trade-off) susulan.
Kerangka Jawapan 30 Saat
“Saya akan menggunakan CRDT berganti-ganti pelayan (server-relayed CRDT): laksanakan suntingan secara tempatan, sahkan semula kebenaran setiap kemas kini WebSocket, hantar ack hanya selepas ketahanan merentasi zon berjaya, kemudian siarkan mengikut bilik dokumen. Penyambungan semula menggunakan vektor keadaan untuk perbezaan yang hilang atau memuatkan tangkapan kilat; kandungan tahan lasak dan kehadiran berasaskan TTL kekal berasingan. Beban puncak ialah 400,000 kemas kini atau kira-kira 120 MB/s. Bilik hangat dengan 100 penyunting mencipta kira-kira 19,800 penghantaran jarak jauh sesaat, jadi get laluan (gateways) mengumpulkan kemas kini secara kelompok dan mengehadkan penimbal klien yang perlahan. Saya akan menguji kemas kini yang disusun semula dan berulang, penyambungan semula luar talian 24 jam, pembatalan kebenaran, dan failover rantau asal untuk memastikan penumpuan dan ketahanan.”
Perbincangan Terperinci Langkah Demi Langkah
Mulakan dengan tujuh invarian:
- Input tempatan tidak pernah menunggu rangkaian, dan replika yang menerima semua kemas kini menumpu kepada dokumen sah yang sama.
- Pelayan mengakui kemas kini kandungan hanya selepas ketahanan merentasi zon berjaya.
- Percubaan semula, siaran pendua, dan penghantaran yang disusun semula tidak boleh menggunakan suntingan dua kali atau mengubah hasil akhir.
- Identiti dan kebenaran semasa datang daripada sesi pelayan, tidak sekali-kali daripada peranan di dalam muatan (payload) kemas kini.
- Kandungan, komen, dan sejarah versi dipulihkan; kursor dan status dalam talian boleh tamat tempoh.
- Klien yang tidak serasi dengan skema tidak boleh terus menulis struktur yang tidak diketahui.
- Setiap pengguguran (drop), penolakan, penurunan taraf perkhidmatan, dan hasil pemulihan boleh diperhatikan (observable).
Langkah satu: pilih antara OT dan CRDT.
OT biasanya menggunakan versi pelayan yang tersusun sebagai konteks dan mengubah setiap operasi yang masuk terhadap operasi serentak. Ia sesuai dengan sistem yang berautoriti pelayan dengan enjin transformasi yang mantap, tetapi fungsi transformasi, sejarah yang dikekalkan, dan pengasasan semula (rebasing) luar talian semuanya mesti betul. CRDT mengekodkan keserentakan dalam struktur data. Kemas kini mungkin tiba dalam susunan yang berbeza dan lebih daripada sekali, dan replika menumpu selepas menerima kesemuanya. Kosnya ialah metadata sebab-akibat (causal metadata), penanda pemadaman (deletion markers), pengikatan teks kaya yang kompleks, dan pengendalian berasingan untuk kebenaran dan konflik semantik.
Oleh kerana gesaan ini memerlukan penyuntingan luar talian 24 jam dan akses pelbagai rantau, reka bentuk utama memilih jujukan/pepohon CRDT yang matang dengan geganti pelayan dan penyimpanan tahan lasak. CRDT tidak memerlukan pelaksanaan yang teragih (decentralized) dan tidak menghapuskan keperluan pelayan. Pelayan masih memiliki identiti, pengesahan skema, had saiz, pengakuan tahan lasak, sejarah, pematuhan, dan sebaran keluar bilik.
Langkah dua: tentukan dokumen berstruktur dan kontrak mesej.
Punca dokumen mengandungi blok dengan ID yang stabil. Perenggan, tajuk, dan item senarai memiliki teks CRDT dan atribut pemformatan. Jalur komen wujud dalam domain berasingan dan berlabuh pada julat dengan kedudukan relatif. Versi skema mentakrifkan nod, atribut, dan peraturan migrasi yang dibenarkan. Ofset integer adalah tidak stabil: sisipan sebelum ofset tersebut mengubah perkara yang ditunjuknya. Kedudukan relatif dilampirkan pada elemen CRDT dan diselesaikan secara konsisten selepas replika menumpu.
Subprotokol WebSocket boleh menggunakan mesej aplikasi ini:
join {
documentId, sessionId, schemaVersion, stateVector
}
update {
documentId, clientId, clientSeq, schemaVersion, payload
}
ack {
clientId, clientSeq, durableOffset
}
sync {
payload, durableOffset, schemaVersion
}
presence {
sessionId, relativeCursor, relativeSelection, statusSeq
}(documentId, clientId, clientSeq) ialah kunci keidempotenan percubaan semula. durableOffset menyokong pengakuan dan pengauditan tetapi tidak terlibat dalam ketepatan penggabungan CRDT. Mesej mempunyai had saiz mampat dan tidak mampat serta senarai izin skema. Nod yang tidak diketahui atau perubahan domain yang tidak dibenarkan ditolak secara eksplisit dan bukannya disiarkan.
Langkah tiga: asingkan laluan pemuatan, bilik langsung, dan storan.
Client
-> HTTPS snapshot service -> metadata + snapshot store
-> WebSocket gateway -> document room router -> collaboration service
-> durable update log
-> room pub/sub -> gateways
Client
-> presence channel -> regional ephemeral store -> room fan-outKlien terlebih dahulu memuatkan metadata dokumen, skema semasa, dan tangkapan kilat padat terkini melalui HTTPS, kemudian membuka WebSocket. Get laluan memiliki sambungan dan langganan bilik tetapi tidak mencipta peraturan penggabungan. Perkhidmatan kolaborasi menghalakan mengikut dokumen ke rantau asalnya, memberi kebenaran dan mengesahkan setiap kemas kini, mengekalkannya secara tahan lasak, mengakuinya (ack), dan menerbitkannya. Bas bilik menerbitkan sekali kepada setiap get laluan yang mempunyai pelanggan (subscribers), dan setiap get laluan menyebarkan secara tempatan dan bukannya menghantar satu mesej merentasi nod bagi setiap penerima.
Langkah empat: jadikan penyuntingan tempatan, pengakuan, dan percubaan semula sebagai mesin keadaan yang eksplisit.
Suntingan tempatan mengemas kini paparan dengan serta-merta dan memasuki barisan menunggu yang disimpan secara tempatan. Semasa dalam talian, klien boleh mengumpulkan ketukan kekunci bersebelahan secara kelompok dalam tetingkap 20 hingga 50 milisaat untuk mengurangkan bilangan mesej. Masa tersebut ialah andaian input dan mesti ditala dengan ujian interaksi. Bagi setiap kemas kini, pelayan mengesahkan ketulenan sesi, membaca kebenaran semasa, mengesahkan skema dan had sumber, menambah pada log yang direplikasi, mengembalikan ack, dan menyiarkannya. Hanya ack yang akan mengalih keluar kemas kini daripada barisan menunggu.
Jika sambungan gagal selepas komit tetapi sebelum ack, klien mencuba semula clientSeq yang sama. Kekangan keunikan pelayan boleh mengembalikan pengakuan asal. Keidempotenan CRDT juga menjadikan pelaksanaan berulang selamat, tetapi rekod audit dan pengebilan masih memerlukan penyahduplikasian. Klien yang perlahan menerima penimbal penghantaran yang terhad. Selepas melepasi tanda aras tinggi (high-water mark), get laluan menggugurkan kehadiran terlebih dahulu dan kemudian meminta klien menyelaraskan semula daripada vektor keadaan daripada membiarkan satu sambungan menggunakan memori bilik tanpa had.
Langkah lima: gunakan vektor keadaan untuk penyelarasan dalam talian, luar talian, dan penyambungan semula.
Kemas kini CRDT yang komutatif, sekutu, dan idempoten membolehkan replika menerima kemas kini dalam susunan yang berbeza dan mencuba semula dengan selamat. Semasa menyambung semula, klien menghantar vektor keadaan yang menerangkan keadaan sebab-akibat yang telah dimilikinya, dan pelayan mengira perbezaan yang hilang. Jika delta terlalu besar, skema telah berubah, atau tetingkap sejarah dalam talian telah tamat tempoh, pelayan menghantar tangkapan kilat CRDT penuh semasa dan kemudian menggunakan kemas kini tempatan yang masih dibenarkan.
Susunannya ialah sahkan ketulenan, sahkan kebenaran, rundingkan skema, kemudian bertukar kandungan. Jika kebenaran menyunting telah dibatalkan semasa pengguna berada di luar talian, penumpuan bukanlah kebenaran untuk menerima perubahan. Pelayan mengembalikan ralat permission_revoked yang stabil dan mengekalkan laluan pemulihan tempatan untuk eksport atau salinan, tetapi ia tidak menulis draf tersebut ke dokumen yang dikongsi. Produk mengorbankan “setiap suntingan luar talian digabungkan” demi mengekalkan kawalan akses semasa.
Langkah enam: reka bentuk tangkapan kilat, sejarah versi, dan pemadatan.
Log tahan lasak dibahagikan mengikut documentId dan merekodkan ID kemas kini, pengarang, skema, muatan, masa penerimaan, dan ofset tahan lasak. Pemadat (compactor) latar belakang memuatkan keadaan CRDT, menggabungkan kenaikan menjadi tangkapan kilat yang boleh dimuatkan terus, dan merekodkan ofset yang diliputi. Ia membuang kenaikan lama hanya selepas tangkapan kilat baharu lulus pengesahan, disimpan secara tahan lasak dalam storan objek, dan mengekalkan titik undur (rollback point) untuk tetingkap pemulihan dan audit.
Menggabungkan kemas kini binari membuang maklumat pendua tetapi tidak mengutip sampah kandungan yang dipadam dengan sendirinya. Penanda pemadaman, penyelarasan luar talian, sauh komen, buat asal bagi setiap pengguna, dan versi sejarah saling berinteraksi. Oleh itu, pemadatan memerlukan ujian dokumen sebenar. Sejarah yang boleh dilihat oleh pengguna menyimpan tangkapan kilat bernama yang bebas atau indeks perubahan; pemadatan penyelarasan dalam talian bukanlah pengganti untuk sejarah versi produk.
Langkah tujuh: asingkan kehadiran dan kawal sebaran keluar kawasan panas.
Kehadiran mengandungi sesi, nama paparan, warna, kursor relatif, pilihan, dan statusSeq monotonik, yang disegarkan melalui denyutan jantung dan TTL. Ia tidak sekali-kali memasuki CRDT dokumen atau log tahan lasak. Penerima membuang nombor jujukan yang lebih lama, dan keadaan terputus sambungan akan tamat tempoh. Kehilangan satu kemas kini kursor hanya mempunyai kesan sementara kerana kemas kini seterusnya akan menggantikannya.
Bilik dengan 100 penyunting pada kadar dua kemas kini sesaat menghasilkan 200 kemas kini kandungan sesaat. Menghantar setiap kemas kini kepada 99 pengguna lain bermakna kira-kira 19,800 penghantaran jarak jauh sesaat sebelum kehadiran. Get laluan mengumpulkan kemas kini daripada hirisan masa yang singkat secara kelompok, menerbitkan mengikut bilik dokumen, mengehadkan kekerapan kehadiran, dan menguatkuasakan tanda aras bait dan mesej bagi setiap sambungan. Dokumen yang sangat hangat mungkin menerima aktor bilik dan sekatan pub/sub khusus, tetapi sistem tidak sekali-kali menyampel suntingan kandungan tahan lasak untuk mengurangkan beban.
Langkah lapan: kira semula kapasiti sejagat dan sumber sambungan.
Dua ratus ribu penyunting pada kadar dua kemas kini sesaat menghasilkan 400,000 kemas kini sesaat. Pada purata muatan binari 300 bait, operasi tulis mentah adalah kira-kira 120 MB/s atau 10.37 TB/hari. Replikasi, indeks, pengepala, tangkapan kilat, dan sejarah versi adalah tambahan. Jika sambungan get laluan menduduki 50 KiB, 2 juta sambungan memerlukan kira-kira 100 GiB keadaan get laluan. Pada 20,000 sambungan bagi setiap get laluan, asasnya ialah 100 get laluan sebelum mengambil kira ruang legar kegagalan dan penggunaan (deployment headroom).
Anggaran ini adalah titik permulaan. Egress bilik hangat, CPU TLS dan pengekodan, penimbal klien yang perlahan, dan sekatan log tahan lasak mungkin menjadi kesesakan sebelum storan kandungan mentah. Pantau kadar kemas kini dan sebaran keluar mengikut dokumen dan penyewa, kependaman ack, saiz delta vektor keadaan, penyambungan semula, tanda aras penimbal, usia tangkapan kilat, dan kegagalan pemeriksaan penumpuan.
Langkah sembilan: kekangkan tingkah laku pelbagai rantau, failover, dan keselamatan.
Metadata dokumen merekodkan rantau asal dan epok yang meningkat. Klien masuk melalui get laluan berdekatan, manakala operasi tulis kandungan dihalakan ke rantau asal. Penggunaan tempatan serta-merta menyembunyikan RTT rentas rantau daripada aktiviti menaip. Jika rantau asal gagal, satah kawalan (control plane) terlebih dahulu memajukan epok, kemudian rantau baharu memulihkan keadaan daripada log yang direplikasi dan tangkapan kilat terkini. Lapisan ketahanan menolak epok aktor lama supaya dua pemilik bilik tidak boleh sama-sama mengeluarkan pengakuan tahan lasak.
Penumpuan CRDT tidak menggantikan keputusan pengesahan kebenaran, pengakuan tahan lasak, atau pemagaran (fencing) failover. Keselamatan juga memerlukan had dokumen, kemas kini, kadar, dan nisbah penyahmampatan; semakan pengesahan kebenaran Asal (Origin), sesi, dan dokumen; penyulitan semasa transit dan semasa rehat; pengauditan untuk perkongsian, perubahan kebenaran, dan eksport; serta log yang tidak memasukkan token akses, badan dokumen, dan butiran kursor yang tepat.
Langkah sepuluh: buktikan reka bentuk dengan ujian sifat (property tests) dan suntikan kerosakan (fault injection).
Hasilkan kemas kini daripada beberapa klien pada dokumen awal yang sama. Gunakannya dalam susunan rawak, dengan pendua, kelewatan, dan kelompok. Setiap replika mesti berakhir dengan hasil bersiri yang sama dan skema yang sah. Tambahkan sisipan pada kedudukan yang sama, pemadaman yang bertindih, memadam induk semasa menyunting anaknya, pemformatan dan teks serentak, sauh komen, buat asal bagi setiap pengguna, dan peningkatan skema.
Matikan perkhidmatan kolaborasi selepas penambahan tahan lasak tetapi sebelum ack; percubaan semula mesti menghasilkan satu kemas kini yang diaudit. Matikannya selepas ack tetapi sebelum siaran; pemulihan mesti menghantar kemas kini tersebut. Sambung semula selepas 24 jam di luar talian dan uji kedua-dua laluan delta vektor keadaan dan tangkapan kilat. Batalkan kebenaran sebelum menyerahkan kemas kini luar talian; storan tahan lasak yang dikongsi mesti menolaknya sambil mengekalkan pemulihan tempatan. Akhir sekali, lakukan ujian beban pada bilik hangat dengan 100 penyunting yang mengandungi kandungan dan kehadiran, mengesahkan kependaman p95, tanda aras memori, dan susunan penurunan taraf perkhidmatan yang dimaksudkan.
Contoh Jawapan Berkualiti Tinggi
“Saya akan mulakan dengan tiga kontrak: input tempatan diguna pakai serta-merta; replika yang menerima semua kemas kini menumpu; dan hanya kemas kini yang dilog secara tahan lasak merentasi tiga zon ketersediaan akan diakui. Keperluan luar talian 24 jam menyokong penggunaan CRDT berstruktur yang matang, manakala pelayan kekal berautoriti untuk pengesahan ketulenan, skema, ketahanan, dan sebaran keluar.
Selepas memuatkan tangkapan kilat CRDT, klien menyertai bilik dokumen. Suntingan tempatan diguna pakai terlebih dahulu dan memasuki barisan menunggu di bawah clientId + clientSeq, kemudian dihantar melalui WebSocket sebagai kemas kini binari. Perkhidmatan kolaborasi menyemak semula kebenaran semasa, skema, dan had sumber, menambah kemas kini secara tahan lasak, mengakuinya (ack), dan menerbitkannya ke bilik. Percubaan semula mengekalkan jujukan yang sama. Kemas kini bertoleransi terhadap penyusunan semula dan pertindihan. Semasa menyambung semula, klien menghantar vektor keadaan dan menerima perubahan yang hilang atau tangkapan kilat penuh. Jika kebenaran telah dibatalkan di luar talian, operasi tulis yang dikongsi ditolak dan hanya eksport tempatan kekal tersedia.
Kandungan dan kehadiran menggunakan laluan yang berasingan. Kursor menggunakan kedudukan relatif, manakala kehadiran berasaskan TTL tidak dilog secara tahan lasak. Setiap dokumen mempunyai rantau asal dan epok. Failover memajukan epok sebelum memulihkan daripada log yang direplikasi dan tangkapan kilat, jadi pemilik bilik lama tidak boleh terus mengakui kemas kini.
Pada waktu puncak, 200,000 penyunting didarab dua kemas kini sesaat bersamaan 400,000 kemas kini sesaat. Pada saiz 300 bait, itu bersamaan 120 MB/s dan 10.37 TB/hari kemas kini mentah. Dokumen hangat dengan 100 penyunting menghasilkan kira-kira 200 kemas kini dan 19,800 penghantaran jarak jauh sesaat, jadi bas bilik menerbitkan sekali, get laluan mengelompokkan dan menyebarkan secara tempatan, dan penimbal klien yang perlahan dihadkan. Saya akan membuktikan sistem ini dengan mengubah susunan dan menduplikasi kemas kini sehingga setiap replika menumpu, kemudian menyuntik kerosakan di sekitar sempadan ack, penyambungan semula luar talian 24 jam, pembatalan kebenaran, peningkatan skema, dan kegagalan rantau asal.”
Kesilapan Biasa
- Hanya menyatakan “gunakan WebSocket” → Pengangkutan tidak menyelesaikan suntingan serentak → Pilih OT atau CRDT dan jelaskan penumpuan serta kosnya.
- Menyimpan keseluruhan dokumen bagi setiap suntingan → Pengguna serentak menulis ganti antara satu sama lain dan lebar jalur meningkat mengikut saiz dokumen → Hantar kemas kini tokokan yang boleh digabungkan.
- Menghantar ack selepas penerimaan dalam memori → Kerosakan proses menyebabkan kehilangan kerja yang diakui → Hantar ack selepas penambahan tahan lasak merentasi zon.
- Menganggap CRDT sebagai pengesahan kebenaran → Penumpuan matematik tidak menghalang pengguna yang kebenarannya telah dibatalkan → Sahkan kebenaran semasa menyertai, menyambung semula, dan pada setiap operasi tulis.
- Menyimpan kursor sebagai ofset integer → Sisipan serentak mengalihkan kedudukan yang dimaksudkan → Gunakan kedudukan relatif kepada elemen CRDT.
- Mengekalkan pergerakan kursor dalam log kandungan → Keadaan fana dengan churn yang tinggi meningkatkan storan dan membebankan pemulihan → Gunakan saluran kehadiran berasaskan TTL.
- Mendakwa penghantaran tepat-sekali (exactly-once) → Penyambungan semula dan siaran boleh menduplikasi mesej → Gunakan kemas kini idempoten, identiti unik, dan keadaan yang boleh dimainkan semula.
- Memadam semua sejarah serta-merta selepas tangkapan kilat → Penyelarasan luar talian, pengunduran, buat asal, atau migrasi skema mungkin kehilangan konteks yang diperlukan → Kumpulkan sampah hanya di luar tanda aras pemulihan yang disahkan.
- Hanya mengira kemasukan (ingress) kandungan → Sebaran keluar bilik hangat dan klien yang perlahan sering menghabiskan sumber terlebih dahulu → Kira juga penghantaran, egress, dan penimbal.
- Menerima operasi tulis aktif di mana-mana sahaja tanpa satah kawalan → Pemilikan pengesahan kebenaran, ack, dan failover menjadi kabur → Gunakan rantau asal dan epok.
Soalan Susulan dan Jawapan
Soalan susulan satu: Mengapa memilih CRDT dan bukannya OT?
Keperluan luar talian 24 jam serta pengangkutan pelbagai rantau yang membenarkan susunan rawak dan pendua sejajar dengan model kemas kini CRDT, dan pelaksanaan yang matang boleh bertukar perbezaan menggunakan vektor keadaan. OT masih sah. Dengan enjin transformasi pelayan yang terbukti, satu perkhidmatan suntingan yang tersusun, dan tingkah laku luar talian yang terhad, ia mungkin menyediakan metadata dan semantik pelayan yang lebih terkawal. Keputusan ini datang daripada kekangan produk dan keupayaan pasukan, bukan daripada anggapan bahawa satu akronim secara amnya lebih baharu.
Soalan susulan dua: Adakah CRDT menghapuskan keperluan log kemas kini tahan lasak?
Tidak. CRDT menyelesaikan penggabungan dan penumpuan. Ketahanan yang diakui, audit, sejarah, pemulihan, dan pemuatan peranti baharu masih memerlukan keadaan tahan lasak. Sistem boleh memadatkan tokokan menjadi tangkapan kilat dan mengutip entri log lama selepas tetingkap pemulihan, tetapi ia mesti mengekalkan sempadan ketahanan dan titik undur yang boleh disahkan.
Soalan susulan tiga: Bagaimana jika kebenaran pengguna luar talian telah dibatalkan?
Sahkan ketulenan dan sahkan kebenaran semula sebelum bertukar kandungan. Tolak operasi tulis yang dikongsi dengan ralat yang stabil dan simpan salinan tempatan untuk eksport atau salinan; jangan buangnya secara senyap. Pihak perniagaan mungkin membenarkan pentadbir menyemak draf di kawasan kelulusan yang terasing, tetapi laluan itu tidak boleh memintas ACL dokumen semasa.
Soalan susulan empat: Bagaimanakah fungsi buat asal (undo) berfungsi dengan beberapa pengguna?
Secara lalai, batalkan operasi tempatan terkini pengguna semasa dan gabungkan operasi songsang melalui CRDT. Memulihkan keseluruhan tangkapan kilat lama akan memadamkan kerja kemudian pengguna lain. Rekod pengguna dan sempadan transaksi bagi setiap operasi, kekalkan kandungan yang dipadam untuk tetingkap buat asal sasaran, dan tentukan semantik boleh balik dalam pengikatan editor untuk perubahan struktur.
Soalan susulan lima: Bagaimanakah kursor mengelak daripada melompat selepas suntingan serentak?
Simpan kursor dan sauh komen secara relatif kepada elemen CRDT dan bukannya ofset aksara mutlak. Selesaikan kedudukan relatif kepada indeks semasa selepas menggunakan kemas kini jarak jauh. Jika kedua-dua sauh dan struktur induk telah dipadamkan, sembunyikan kursor, tandakan komen sebagai terpisah (detached), atau berundur ke blok sah terdekat mengikut peraturan produk yang eksplisit.
Soalan susulan enam: Bagaimana jika sepuluh ribu orang membuka satu dokumen?
Asingkan penyunting daripada pelihat baca sahaja (read-only viewers). Terbitkan setiap kemas kini kandungan sekali pada bas bilik dan sebarkan dari get laluan. Klien baca sahaja boleh menerima kemas kini yang digabungkan pada kekerapan yang lebih rendah atau meninjau (poll) tangkapan kilat jangka pendek tanpa menjejaskan ketepatan penyunting. Kehadiran hanya menunjukkan peserta yang kelihatan atau disampel, dan setiap sambungan mempunyai penimbal penghantaran yang terhad. Menunjukkan kesemua sepuluh ribu kursor memerlukan belanjawan lebar jalur dan UI tersendiri.
Soalan susulan tujuh: Bolehkah editor menyokong penyulitan hujung-ke-hujung?
Klien boleh menyulitkan kemas kini CRDT manakala pelayan menyampaikan dan menyimpan teks sifer (ciphertext). Pertukaran pertimbangannya ialah pelayan tidak lagi boleh mengesahkan skema teks kaya, mencari kandungan, menyederhanakan kandungan, melakukan eksport terperinci, atau memulihkan data yang hilang dengan mudah. Putaran kunci, penyingkiran ahli, dan kemas kini luar talian ahli lama juga menjadi lebih sukar. Tentukan model ancaman serta protokol kunci dokumen, peranti, dan keahlian terlebih dahulu; TLS di sekitar WebSocket semata-mata hanyalah penyulitan pengangkutan, bukan penyulitan hujung-ke-hujung.
Soalan susulan lapan: Bagaimanakah anda mengesan perpecahan replika secara senyap (silent replica fork)?
Selepas tempoh sunyi atau penyambungan semula, klien melaporkan vektor keadaannya dan ringkasan keadaan (state digest) yang tidak sensitif. Bandingkan hanya replika pada tanda aras tahan lasak yang sama; ketidakpadanan mencetuskan penyelarasan semula penuh dan mengekalkan sampel diagnostik. Dokumen kenari (canary documents) berterusan mengeluarkan kemas kini serentak yang diketahui dari beberapa rantau dan mengesahkan ringkasan akhir, skema, kiraan ack, dan tanda aras log. Membandingkan ringkasan pada tanda aras dalam penerbangan yang berbeza akan mewujudkan penggera palsu.