Saya ingin banyak pengguna mengedit dokumen yang sama. Masalah yang saya hadapi adalah ketika pengguna baru bergabung, ia mungkin melihat dokumen yang sudah usang. Bagaimana cara memastikan bahwa pengguna baru mendapatkan perubahan terbaru?
Beberapa solusi yang saya pikirkan:
Simpan di setiap perubahan. Saya tidak suka solusi ini karena ini akan memperlambat segalanya pada UI dan memuat db.
Ketika pengguna baru bergabung, memicu save pada semua klien lain. Setelah klien lain disimpan, muat dokumen. Dengan ini masih ada ketidakkonsistenan.
Saran lain akan sangat membantu.
UPDATE: Setelah melihat ke solusi yang disarankan, Google Realtime API, saya menemukan bahwa:
Pengguna aplikasi Anda harus memiliki Google Drive dan memberi Anda akses ke drive mereka . Paling-paling ini bisa menghadirkan aliran UI yang canggung atau mencegah pengguna yang tidak memiliki Google Drive menggunakan fitur waktu nyata.
Semua pengaturan berbagi yang dilakukan di pihak Anda, harus direplikasi untuk dokumen Google.
PEMBARUAN 2: Untuk mencapai tujuan, saya menggunakan Firebase Google
sumber
Jawaban:
google Drive
Jika Anda mencoba membuat versi google docs Anda sendiri, saya sarankan Anda melihat Google Realtime API . Google baru-baru ini merilis ini dengan maksud memungkinkan pengembang lain untuk menggunakan alat yang sama yang mereka lakukan untuk memungkinkan kolaborasi waktu nyata. Ini akan memungkinkan Anda untuk menghemat waktu pada pengembangan Anda dan mendapatkan produk yang bekerja lebih cepat.
Anda dapat dengan mudah mengambil data yang ada di dokumen dan mendorongnya ke dalam basis data Anda secara berkala, atau menjadikan basis data itu sendiri menjadi 'peserta' dari pertukaran tersebut, cukup mendengarkan dan mencatat semua perubahan. Hal ini juga memungkinkan bagi pengguna untuk menentukan struktur data mereka sendiri yang kemudian dapat digunakan dalam API waktu nyata, sehingga Anda bebas untuk memperpanjangnya sesuai keinginan Anda.
Non-Google Drive
Jadi menurut penelitian Anda, Google Drive bukan pilihan. Tidak apa-apa, tapi itu akan lebih sulit dan mungkin tidak bekerja juga, tergantung pada seberapa banyak Anda memasukkannya ke dalamnya.
Inilah strategi umum yang akan saya gunakan untuk menyelesaikan masalah ini:
Biarkan server menjadi multiplexer komunikasi. Setiap orang berbicara ke server, dan server mengirimkan informasi itu kepada orang lain. Dengan cara ini server selalu memiliki tampilan dokumen yang paling mutakhir.
Temukan algoritma / modul pihak ketiga untuk resolusi konflik. Resolusi konflik itu sulit, dan merupakan sesuatu yang masih belum sempurna. Melakukan ini sendiri dapat dengan mudah meningkatkan ruang lingkup proyek menjadi terlalu besar. Jika Anda tidak dapat menggunakan algoritme pihak ketiga, saya menyarankan agar Anda hanya mengizinkan satu pengguna untuk mengedit area waktu, sehingga pengguna harus mendapatkan kunci sebelum mengedit area, atau Anda berisiko menghancurkan pekerjaan pengguna lain, yang akan menjadi sangat tua, sangat cepat.
Ketika pengguna baru bergabung, berikan mereka dokumen terbaru dan secara otomatis mulai streaming perintah kepada mereka. Server memiliki tampilan terbaru dan dengan demikian dapat menyajikannya secara otomatis.
Cadangkan ke database pada interval tertentu. Putuskan seberapa sering Anda ingin mencadangkan (setiap 5 menit atau mungkin setiap 50 perubahan.) Ini memungkinkan Anda untuk mempertahankan cadangan yang Anda inginkan.
Masalah: Ini bukan solusi yang sempurna, jadi inilah beberapa masalah yang mungkin Anda hadapi.
Throughput server dapat menghambat kinerja
Terlalu banyak orang membaca / menulis dapat membebani server
Orang-orang mungkin menjadi tidak sinkron jika ada pesan yang hilang, jadi Anda mungkin ingin memastikan Anda melakukan sinkronisasi pada titik-titik reguler. Ini berarti mengirimkan seluruh pesan lagi, yang bisa mahal, tetapi kalau tidak orang mungkin tidak memiliki dokumen yang sama dan tidak mengetahuinya.
sumber
Saya akan merekomendasikan 1 salinan dokumen yang persisten di server. Ketika klien terhubung ke server Anda mengeluarkan
UPDATE
perintah ke klien dengan semua perubahan.Perbarui WorkFlow
Pengguna menyebabkan pemicu perubahan -> Klien mengirim
UPDATE
ke Server -> Server mengirimUPDATE
ke KlienPemicu yang layak
Perbarui Implementasi
Saya menyarankan untuk dapat membuat kembali dokumen dengan serangkaian
UPDATE
perintah sehingga server menyimpan setiap UPDATE dan ketika klien baru menghubungkan klien dapat dikirim serangkaian pembaruan dan itu sendiri dapat membuat kembali dokumen untuk ditampilkan ke pengguna. Selain itu, Anda juga dapat memilikiSAVE
perintah yang terpisah dan memiliki UPDATE sebagai perubahan sementara yang dapat digunakan untukUNDO
permintaan dan memiliki SIMPAN sebenarnya menyimpannya untuk dibuka kembali jika server ditutup atau semua klien memutuskan sambungan.sumber
1) Lihatlah Knockout.js
Ini mengikuti pola MVVM dan secara otomatis akan mendorong pemberitahuan ke Tampilan berdasarkan perubahan pada Model. Sebagai contoh, lihatlah array mereka yang dapat diamati untuk memberikan sedikit informasi lebih banyak tentang bagaimana mereka melakukan itu.
2) Campurkan dengan SignalR dan Anda sekarang harus memiliki kemampuan untuk mengirimkan pemberitahuan kepada pengguna lain yang mengerjakan dokumen. Dari situs mereka:
Jadi, Anda harus memiliki beberapa kait di tingkat model Anda di dalam Knockout.js untuk melakukan beberapa panggilan SignalR setiap kali terjadi perubahan. Klien lain akan menerima pemberitahuan dari SignalR dan kemudian memicu perubahan yang sesuai dalam mereka salinan Model, yang akan mendorong kembali ke View mereka.
Ini kombinasi yang menarik dari dua kerangka kerja, dan Anda harus dapat mencari dan mengumpulkan lebih banyak informasi untuk menangani rincian.
Sebagai contoh, contoh proyek ini secara khusus membahas alamat
Co Working UIs and Continuous Clients
yang tampaknya persis seperti apa yang Anda coba lakukan.Posting blog ini tampaknya menjadi titik masuk ke dalam serangkaian posting blog yang membahas penggunaan dua paket dan kontras dengan pendekatan ASP.NET tradisional. Dapat memberikan beberapa poin untuk dipertimbangkan saat Anda merancang situs Anda.
Posting blog ini tampaknya sedikit lebih mendasar dan memberikan dasar untuk menggabungkan dua paket.
Pengungkapan: Saya tidak berafiliasi dengan salah satu tautan di atas, saya juga belum benar-benar menggali konten mereka untuk melihat seberapa suaranya atau memperbaikinya.
sumber
Solusinya adalah Operational Transformation (OT). Jika Anda belum pernah mendengarnya, OT adalah kelas algoritme yang melakukan konkurensi waktu-nyata multi-situs. OT seperti git realtime. Ini berfungsi dengan jumlah lag apa pun (dari nol hingga liburan panjang). Ini memungkinkan pengguna melakukan pengeditan langsung dan berbarengan dengan bandwidth rendah. OT akhirnya memberi Anda konsistensi antara beberapa pengguna tanpa coba lagi, tanpa kesalahan dan tanpa ada data yang ditimpa.
Tetapi menerapkan PL adalah tugas yang sulit dan memakan waktu. Jadi, Anda mungkin ingin menggunakan perpustakaan eksternal seperti http://sharejs.org/ .
sumber
Ini terutama tergantung pada jenis dokumen Anda dan bagaimana pengguna Anda berkolaborasi.
Namun, saya akan:
Keuntungan:
Kekurangan:
sumber
Pada dasarnya, yang Anda tanyakan adalah bagaimana menghadapi keadaan yang bisa berubah yang dibagikan bersama. Menabung adalah bagian yang mudah; tetapi bagaimana Anda berurusan dengan banyak orang yang mengedit hal yang sama pada saat yang sama? Anda ingin semua pengguna melihat dokumen yang sama saat menyinkronkan pengeditan simultan, semuanya dalam waktu nyata.
Seperti yang mungkin sudah Anda kumpulkan, ini masalah yang sulit! Ada beberapa solusi pragmatis:
sumber