Bir webapp'ta aynı veri parçasını düzenleyen birden fazla kullanıcıyı nasıl yönetirsiniz?


26

Üzerinde çalıştığım bir proje var ve birden fazla kullanıcı arasında görev listesini yönetecek bir web uygulaması üretmek istiyor. Bu, görev öğeleri yetkili bir kullanıcı tarafından dağıtılan bir ana görev listesidir. Her kullanıcı, kendilerine atanan görevleri giriş yapmak ve görüntülemek için kendi hesabına sahiptir; Birden fazla kullanıcının ortak tek bir görevi olması mümkündür.

Aşağıdaki durumlarla nasıl başa çıkılacağı konusunda genel bir fikir edinmekle uğraştığım için projenin ayrıntılarını bunun dışında bırakmaya çalışıyorum, ancak eğer yardımcı olursa, Java, EclipseLink ve RequestFactory ile birlikte GWT kullanıyorum. Veritabanı PostgreSQL'dir.

Dolayısıyla uzlaştırmaya çalıştığım kavramsal problemler şunlardır:

  1. Birden fazla kullanıcı için ortak olan tek bir görev herhangi bir şekilde değişiyorsa, örneğin görev tamamlandı, silindi, vb., Bu görevi alan tüm kullanıcıların görev listesi güncellenir. Bu işlevin uygulanmasına yardımcı olan tasarım desenleri nelerdir?

    • Baktığım bazı desenler Gözlemci ve Arabulucudur - bunlar üzerinde düşünülmesi gereken başka şeyler var mı?
  2. Diyelim ki aynı görevi aynı anda değiştiren iki kullanıcı var.

    • Öncelikle, bu durumun gerçekleşmesine izin vermeli miyim, yoksa biri veya diğeri değişiklik yapmaktan önce kilitlenmeli miyim?

    • İkincisi, bir kilitleme yapmazsam, değişiklikleri kabul etmek için nasıl uzlaştırırım? Bu, 1'deki durumu içerir, çünkü kullanıcı 1 verileri gönderebilir ve kullanıcı 2 güncellenen verileri almadan önce, devam etmiş ve değişikliklerini göndermiş olabilir.

Verileri bu web uygulamasının birden fazla örneği arasında nasıl düzgün bir şekilde senkronize edebileceğinize dair rehberlik noktaları, tavsiyeler veya ipuçlarını gerçekten arıyorum. Çok takdir ediyorum!

Yanıtlar:


17

Bence Beyaz Tahta # 1 için tercih ettiğiniz bir kalıp olacaktır, görevlerde (veya paylaşılan diğer verilerdeki) ortak bir yerde değişiklikler yapmalısınız, böylece tüm ilgili taraflar onları ve DTRT'yi görebilir.

# 2 için, iyimser kilitlemeye bakmak gerekir . Temel olarak, düzenlenebilir tüm kayıtlarınızı en son güncelleme zamanı ile zaman damgalamanız gerekir. Kaydı kaydetmeye çalıştığınızda, önce veritabanındaki kaydın, kaydınızla aynı son güncellenen zaman damgasına sahip olduğunu doğrularsınız. Eğer değilse, o zaman birileri kaydı güncelledi ve şimdi güncellenmiş kaydı almanız ve kullanıcıya değişiklikleri tekrar girmesi gerektiğini bildirmesi gerekiyor, ya da kullanıcının değişikliklerini güncellenmiş kayda birleştirmeyi deneyebilirsiniz (bu genellikle sonuçlanan) ya basit ya da imkansız olmak.


7

Yardımcı olabilecek benzer gereksinimlere sahip bir masaüstü uygulaması (henüz tam olarak test edilmemiş) için bir tasarım yaptım.

Benim çözümüm, her bir Kontrolörün ( STM kullanarak) işlemlerini kullanarak Modelde değişiklik yaptığı ve bir işlem yapıldığında, Model Görünümlere bir güncelleme bildirimi yayınladığı MVC modelini (tek bir Model ile ancak birden fazla Kontrolör ve Görünümle) kullanmaktı. ).

Her müşteri aynı zamanda yerel olarak güncellenen herhangi bir şeyi takip etti, ancak bu yerel güncellemeler tamamlandığında (yani taahhüt edilmek üzere gönderildi), temel Model'in bilgisini kullanmaya geri döndü.

Ayrıca, kullanıcıların yaptıkları değişiklikleri geri alabilmeleri için kullanıcıların yaptığı tüm değişiklikleri geri aldım.

Bu, bir web uygulaması için en iyi model olmayabilir, çünkü Model, görünümlerde değişiklikler yayınlamak zorunda kalmıştır;


4

1. için yayınlama / abone olma düzeninin daha uygun olup olmadığını görmelisiniz .
için 2. durumunuza bağlıdır:

  • bu durum ne sıklıkta olacak?
  • Kullanıcılarınızdan birinin bir görevi kilitleyebileceği veya bu sırada başka birisinin değiştirdiği için bir görevi güncelleyemediği bir durum ne kadar kötü?
    şahsen ben içinde olduğu bir yaklaşımı tercih ediyorum (örneğin pivotaltracker'da kullanılıyor ):
    • kilit yok
    • tüm değişiklikleri gerçek zamanlı olarak görüyorsunuz ve
    • UI, birden çok özellik üzerinde daha büyük olanlar yerine sık sık küçük güncellemeler yapmaya davet eder.
    • Yapılan tüm değişikliklerin geçmişini tutuyorsunuz. Geçmiş kullanıcılar tarafından görülebiliyorsa, sonuçta ortaya çıkan çatışmalar veya üzerine yazma yorumlar, açıklamalar veya mesajlarla çözülebilir.

Soru daha akademik, bu yüzden en kötü durumda nasıl halledildiğine bakmak için çok sık söyleyeceğim. Desen referansları için +1.
Hulmeister

@ kr1 pivotaltracker çakışma uyarısından yoksun ve çakışmaya neden olmayan değişiklikleri birleştirmiyor, bu nedenle iyi bir kayıt düzenleme çok kullanıcılı uygulama için iyi bir örnek kullanılmamalıdır.
Eduardo

0

Tavsiyem, meydana gelirse bir anlaşmazlığı asla kilitlememek ve bildirmemek.

Lütfen şuna bir bakın:

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

Bir video ve örnek kod görebilirsiniz.

Bu ihtiyaçlarınızı karşılayacak mı?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.