Bagaimana Anda menangani banyak pengguna yang mengedit bagian data yang sama di webapp?

26

Ada proyek yang sedang saya kerjakan yang ingin menghasilkan aplikasi web yang akan mengelola daftar tugas antara banyak pengguna. Ini adalah daftar tugas utama yang item tugasnya didistribusikan oleh pengguna yang berwenang. Setiap pengguna memiliki akunnya sendiri untuk login dan melihat tugas yang ditugaskan; dimungkinkan bagi banyak pengguna untuk memiliki satu tugas yang sama.

Saya mencoba untuk tidak menyertakan detail proyek ini karena saya lebih bergulat dengan konsep keseluruhan tentang bagaimana menangani situasi berikut, tetapi jika itu membantu, saya menggunakan Java, EclipseLink, dan GWT dengan RequestFactory diimplementasikan. Basis datanya adalah PostgreSQL.

Jadi masalah konseptual yang saya coba rujuk adalah sebagai berikut:

  1. Jika satu tugas yang umum bagi banyak pengguna berubah dengan cara apa pun misalnya tugas selesai, dihapus, dll. Daftar tugas semua pengguna yang memiliki tugas ini akan diperbarui. Pola desain apa yang ada yang membantu dalam mengimplementasikan fungsi ini?

    • Beberapa pola yang saya lihat adalah Pengamat dan Mediator - adakah yang lain yang harus dipertimbangkan?
  2. Katakanlah ada dua pengguna yang mengubah tugas yang sama secara bersamaan.

    • Pertama, haruskah saya membiarkan situasi itu terjadi atau saya harus menguncinya sampai satu atau orang lain selesai membuat perubahan?

    • Kedua, jika saya tidak menguncinya, bagaimana saya mendamaikan perubahan yang harus diterima? Ini melibatkan situasi dalam 1 karena pengguna 1 dapat mengirimkan data dan sebelum pengguna 2 menerima data yang diperbarui, ia mungkin telah melanjutkan dan mengirimkan perubahannya.

Saya benar-benar mencari poin panduan, saran, atau tips yang dapat Anda berikan tentang cara menyinkronkan data antara beberapa contoh aplikasi web ini dengan benar. Saya akan sangat menghargainya!

Hulkmeister
sumber

Jawaban:

17

Saya pikir Whiteboard akan menjadi pola pilihan Anda untuk # 1, Anda harus memposting perubahan pada tugas (atau data bersama lainnya) di tempat umum, sehingga semua pihak yang tertarik dapat melihatnya dan DTRT.

Untuk # 2, Anda perlu melihat penguncian optimis . Pada dasarnya, Anda perlu mencatat waktu semua catatan Anda yang dapat diedit dengan waktu pembaruan terakhir. Ketika Anda mencoba untuk menyimpan catatan, pertama-tama Anda memverifikasi bahwa catatan dalam database memiliki stempel waktu terakhir yang sama dengan catatan Anda. Jika tidak, maka seseorang telah memperbarui catatan dan Anda sekarang harus mendapatkan catatan yang diperbarui dan memberi tahu pengguna bahwa mereka harus memasukkan perubahan lagi, atau Anda dapat mencoba menggabungkan perubahan pengguna ke dalam catatan yang diperbarui (yang biasanya ternyata menjadi sederhana atau tidak mungkin).

TMN
sumber
7

Saya datang dengan desain untuk aplikasi desktop (yang belum sepenuhnya diuji) dengan persyaratan serupa yang mungkin bisa membantu.

Solusi saya adalah menggunakan pola MVC (dengan Model tunggal tetapi beberapa Pengontrol dan Tampilan) di mana setiap Pengendali membuat perubahan pada Model menggunakan transaksi (menggunakan STM ) dan ketika transaksi dilakukan, Model menyiarkan pemberitahuan pembaruan ke View (s). ).

Setiap klien juga semua melacak apa pun yang diperbarui secara lokal, tetapi ketika pembaruan lokal itu selesai (yaitu dikirim untuk dilakukan) ia kembali menggunakan informasi Model yang mendasarinya.

Saya juga memiliki tumpukan undo dengan semua perubahan yang dilakukan pengguna sehingga hal-hal dapat dikembalikan.

Ini mungkin bukan model terbaik untuk aplikasi web karena Model harus menyiarkan perubahan pada Views, yang mungkin bukan yang termudah dengan klien web.

paul
sumber
4

untuk 1. Anda harus melihat apakah pola terbitkan / berlangganan lebih cocok.
untuk 2. itu tergantung pada situasi Anda:

  • seberapa sering situasi ini terjadi?
  • seberapa buruk situasi di mana salah satu pengguna Anda tidak dapat memperbarui tugas karena terkunci atau orang lain telah mengubahnya sementara itu?
    secara pribadi saya lebih suka pendekatan (digunakan misalnya dalam pivotaltracker ) di mana ada:
    • tidak ada kunci,
    • Anda melihat semua perubahan secara real-time, dan
    • UI mengundang untuk melakukan pembaruan kecil yang sering dan bukannya yang lebih besar pada banyak atribut.
    • Anda menyimpan riwayat semua perubahan yang telah dibuat. jika sejarah dapat dilihat oleh pengguna, akhirnya timbul konflik atau menimpa dapat diselesaikan dengan komentar, penjelasan atau pesan.
kr1
sumber
Pertanyaannya lebih bersifat akademis, jadi saya akan mengatakan sangat sering untuk melihat bagaimana hal itu ditangani dalam kasus terburuk. +1 untuk referensi pola.
hulkmeister
@ kr1 pivotaltracker tidak memiliki peringatan konflik dan tidak menggabungkan perubahan yang tidak bertentangan, sehingga tidak boleh digunakan sebagai contoh yang baik dari aplikasi multiuser pengeditan rekaman yang baik.
Eduardo
0

Rekomendasi saya adalah jangan pernah mengunci dan melaporkan konflik jika itu terjadi.

Silakan lihat:

https://github.com/spring-projects/spring-petclinic/issues/433

Anda dapat melihat video dan kode sampel.

Apakah itu memenuhi persyaratan Anda?

Eduardo
sumber