Jak radzisz sobie z wieloma użytkownikami edytującymi ten sam fragment danych w aplikacji internetowej?

26

Pracuję nad projektem, który ma na celu stworzenie aplikacji internetowej, która będzie zarządzać listą zadań między wieloma użytkownikami. Jest to główna lista zadań, której elementy zadania są dystrybuowane przez autoryzowanego użytkownika. Każdy użytkownik ma swoje własne konto do logowania i przeglądania przypisanych mu zadań; możliwe jest, że wielu użytkowników ma jedno wspólne zadanie.

Staram się pomijać szczegóły projektu, ponieważ bardziej zmagam się z ogólną koncepcją radzenia sobie z następującymi sytuacjami, ale jeśli to pomaga, używam Java, EclipseLink i GWT z zaimplementowanym RequestFactory. Baza danych to PostgreSQL.

Tak więc problemy koncepcyjne, które próbuję pogodzić, są następujące:

  1. Jeśli jedno zadanie wspólne dla wielu użytkowników zmieni się w jakikolwiek sposób, np. Zadanie ukończone, usunięte itp., Lista zadań wszystkich użytkowników, którzy mają to zadanie, zostanie zaktualizowana. Jakie wzorce projektowe pomagają w realizacji tej funkcji?

    • Niektóre wzorce, na które patrzyłem, to Obserwator i Pośrednik - czy są inne, które należy rozważyć?
  2. Powiedzmy, że dwóch użytkowników zmienia to samo zadanie w tym samym czasie.

    • Po pierwsze, czy powinienem dopuścić do zaistnienia takiej sytuacji, czy powinienem ją zablokować, dopóki jedna lub druga osoba nie dokona zmian?

    • Po drugie, jeśli nie zablokuję go, to jak pogodzić zmiany, których zmiany należy zaakceptować? Wiąże się to z sytuacją w 1, ponieważ użytkownik 1 może przesłać dane, a zanim użytkownik 2 otrzyma zaktualizowane dane, być może poszedł naprzód i przesłał zmiany.

Naprawdę szukam wskazówek, porad lub wskazówek dotyczących prawidłowej synchronizacji danych między wieloma instancjami tej aplikacji internetowej. Byłbym bardzo wdzięczny!

hulkmeister
źródło

Odpowiedzi:

17

Myślę, że tablica będzie twoim wyborem dla nr 1, powinieneś publikować zmiany w zadaniach (lub innych udostępnionych danych) we wspólnym miejscu, aby wszystkie zainteresowane strony mogły je zobaczyć i DTRT.

W przypadku nr 2 należy przyjrzeć się optymistycznemu blokowaniu . Zasadniczo musisz oznaczyć czasowo wszystkie swoje edytowalne rekordy ostatnim czasem aktualizacji. Podczas próby zapisania rekordu należy najpierw sprawdzić, czy rekord w bazie danych ma ten sam czas ostatniej aktualizacji, co rekord. Jeśli nie, oznacza to, że ktoś zaktualizował rekord, a teraz musisz albo pobrać zaktualizowany rekord i poinformować użytkownika, że ​​musi ponownie wprowadzić zmiany, lub możesz spróbować scalić zmiany użytkownika w zaktualizowanym rekordzie (co zwykle okazuje się być proste lub niemożliwe).

TMN
źródło
7

Wymyśliłem projekt aplikacji komputerowej (który jeszcze nie został w pełni przetestowany) z podobnymi wymaganiami, które mogą być pomocne.

Moje rozwiązanie polegało na zastosowaniu wzorca MVC (z jednym modelem, ale wieloma kontrolerami i widokami), w którym każdy kontroler wprowadzał zmiany w modelu za pomocą transakcji (przy użyciu STM ), a gdy transakcja została zatwierdzona, model nadał powiadomienie o aktualizacji do widoków ).

Każdy klient również śledził wszystko, co jest aktualizowane lokalnie, ale kiedy te aktualizacje lokalne zostały zakończone (tj. Wysłane w celu zatwierdzenia), powróciło do korzystania z informacji zawartych w modelu.

Miałem też stos cofania ze wszystkimi zmianami wprowadzonymi przez użytkowników, aby można było przywrócić rzeczy.

Może to nie być najlepszy model dla aplikacji internetowej, ponieważ Model musiał transmitować zmiany w widokach, co może nie być najłatwiejszym w / w klientem internetowym.

Paweł
źródło
4

dla 1. powinieneś zobaczyć, czy wzór publikowania / subskrybowania jest bardziej odpowiedni.
dla 2. zależy to od twojej sytuacji:

  • jak często będzie taka sytuacja?
  • jak zła jest sytuacja, w której jeden z Twoich użytkowników nie będzie mógł zaktualizować zadania, ponieważ jest ono zablokowane lub ktoś inny go zmienił w międzyczasie?
    osobiście wolę podejście (stosowane np. w pivotaltracker ), w którym są:
    • bez zamków,
    • widzisz wszystkie zmiany w czasie rzeczywistym, i
    • interfejs użytkownika zachęca do częstych drobnych aktualizacji zamiast większych na wiele atrybutów.
    • przechowujecie historię wszystkich dokonanych zmian. jeśli historia jest widoczna dla użytkowników, ewentualne konflikty lub nadpisania można rozwiązać za pomocą komentarzy, adnotacji lub wiadomości.
kr1
źródło
Pytanie jest bardziej akademickie, więc powiem bardzo często, aby przyjrzeć się temu, jak załatwiono sprawę w najgorszym przypadku. +1 dla odniesień do wzorca.
hulkmeister
@ kr1 pivotaltracker nie ma ostrzeżenia o konflikcie i nie scala sprzecznych zmian, więc nie należy go używać jako dobrego przykładu dobrej aplikacji do edycji rekordów dla wielu użytkowników.
Eduardo
0

Radzę, aby nigdy nie blokować i nie zgłaszać konfliktu, jeśli tak się stanie.

Proszę spojrzeć na:

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

Możesz zobaczyć film i przykładowy kod.

Czy to spełni twoje wymagania?

Eduardo
źródło