Wie gehen Sie mit mehreren Benutzern um, die dasselbe Datenelement in einer Webapp bearbeiten?

26

In einem Projekt, an dem ich arbeite, soll eine Webanwendung erstellt werden, mit der eine Aufgabenliste zwischen mehreren Benutzern verwaltet werden kann. Dies ist eine Master-Aufgabenliste, deren Aufgabenelemente von einem autorisierten Benutzer verteilt werden. Jeder Benutzer hat sein eigenes Konto, um sich anzumelden und die ihm zugewiesenen Aufgaben anzuzeigen. Es ist möglich, dass mehrere Benutzer eine einzelne Aufgabe gemeinsam haben.

Ich versuche, Details des Projekts aus dieser Analyse herauszulassen, da ich mich eingehender mit dem Gesamtkonzept befasse, wie mit den folgenden Situationen umzugehen ist. Wenn dies jedoch hilft, verwende ich Java, EclipseLink und GWT mit implementierter RequestFactory. Die Datenbank ist PostgreSQL.

Die konzeptionellen Probleme, die ich zu vereinbaren versuche, sind die folgenden:

  1. Wenn sich eine einzelne Aufgabe, die mehreren Benutzern gemeinsam ist, in irgendeiner Weise ändert, z. B. Aufgabe erledigt, gelöscht usw., wird die Aufgabenliste aller Benutzer, die diese Aufgabe haben, aktualisiert. Welche Entwurfsmuster helfen bei der Implementierung dieser Funktion?

    • Einige Muster, die ich mir angesehen habe, sind Observer und Mediator - gibt es andere, die darüber nachgedacht werden sollten?
  2. Angenommen, zwei Benutzer ändern gleichzeitig dieselbe Aufgabe.

    • Erstens, sollte ich zulassen, dass diese Situation eintritt, oder sollte ich sie sperren, bis die eine oder andere Person Änderungen vorgenommen hat?

    • Zweitens: Wie kann ich abgleichen, wessen Änderungen akzeptiert werden sollen, wenn ich sie nicht sperre? Dies betrifft die Situation in 1, da Benutzer 1 die Daten übermitteln kann und bevor Benutzer 2 die aktualisierten Daten erhält, er / sie möglicherweise seine / ihre Änderungen übermittelt hat.

Ich bin wirklich auf der Suche nach Leitfäden, Ratschlägen oder Tipps, die Sie zum richtigen Synchronisieren von Daten zwischen mehreren Instanzen dieser Web-App geben können. Ich würde es sehr schätzen!

Hulkmeister
quelle

Antworten:

17

Ich denke, Whiteboard wird das Muster Ihrer Wahl für Nummer 1 sein. Sie sollten Änderungen an Aufgaben (oder anderen freigegebenen Daten) an einer gemeinsamen Stelle veröffentlichen, damit alle Interessenten sie und DTRT sehen können.

Für # 2 müssen Sie sich das optimistische Sperren ansehen . Grundsätzlich müssen Sie alle bearbeitbaren Datensätze mit dem Zeitstempel der letzten Aktualisierung versehen. Wenn Sie versuchen, den Datensatz zu speichern, stellen Sie zunächst sicher, dass der Datensatz in der Datenbank denselben zuletzt aktualisierten Zeitstempel aufweist wie Ihr Datensatz. Wenn nicht, hat jemand den Datensatz aktualisiert, und Sie müssen entweder den aktualisierten Datensatz abrufen und den Benutzer darüber informieren, dass er die Änderungen erneut eingeben muss, oder Sie können versuchen, die Änderungen des Benutzers in den aktualisierten Datensatz einzufügen (was normalerweise der Fall ist) entweder einfach oder unmöglich sein).

TMN
quelle
7

Ich habe ein Design für eine Desktop-Anwendung (die noch nicht vollständig getestet wurde) mit ähnlichen Anforderungen entwickelt, die möglicherweise hilfreich sind.

Meine Lösung bestand darin, das MVC- Muster (mit einem einzelnen Modell, aber mehreren Controllern und Ansichten) zu verwenden, bei dem jeder Controller mithilfe von Transaktionen (unter Verwendung von STM ) Änderungen am Modell vornahm. Wenn eine Transaktion festgeschrieben wurde, sendete das Modell eine Aktualisierungsbenachrichtigung an die Ansichten ).

Jeder Client verfolgte auch alle lokalen Aktualisierungen, aber als diese lokalen Aktualisierungen abgeschlossen waren (dh gesendet wurden, um festgeschrieben zu werden), verwendete er wieder die zugrunde liegenden Modellinformationen.

Ich hatte auch einen Rückgängig-Stapel mit allen Änderungen, die die Benutzer vorgenommen hatten, damit die Dinge zurückgesetzt werden konnten.

Dies ist möglicherweise nicht das beste Modell für eine Webanwendung, da das Modell Änderungen an den Ansichten übertragen musste, was möglicherweise nicht das einfachste mit einem Webclient ist.

paul
quelle
4

Zu 1. sollten Sie sehen, ob das Publish / Subscribe- Muster besser geeignet ist.
zu 2. es kommt auf deine situation an:

  • Wie häufig wird diese Situation sein?
  • Wie schlimm ist eine Situation, in der einer Ihrer Benutzer eine Aufgabe nicht aktualisieren kann, weil sie gesperrt ist oder sie zwischenzeitlich von einem anderen Benutzer geändert wurde?
    persönlich bevorzuge ich einen ansatz (verwendet zB im pivotaltracker ) bei dem es gibt:
    • keine schlösser,
    • Sie sehen alle Änderungen in Echtzeit und
    • Die Benutzeroberfläche fordert dazu auf, häufige kleinere Aktualisierungen anstelle größerer Aktualisierungen für mehrere Attribute durchzuführen.
    • Sie führen einen Verlauf aller vorgenommenen Änderungen. Wenn der Verlauf für die Benutzer sichtbar ist, können eventuell auftretende Konflikte oder Überschreibungen mit Kommentaren, Anmerkungen oder Nachrichten behoben werden.
kr1
quelle
Die Frage ist akademischer, daher werde ich sehr häufig darauf eingehen, wie es im schlimmsten Fall behandelt wird. +1 für die Musterreferenzen.
Hulkmeister
@ kr1 pivotaltracker weist keine Konfliktwarnung auf und führt nicht in Konflikt stehende Änderungen nicht zusammen. Daher sollte es nicht als gutes Beispiel für eine gute Mehrbenutzeranwendung zur Datensatzbearbeitung verwendet werden.
Eduardo
0

Ich empfehle, einen Konflikt niemals zu sperren und zu melden, wenn er auftritt.

Bitte werfen Sie einen Blick auf:

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

Sie können ein Video und einen Beispielcode sehen.

Wird das Ihren Anforderungen entsprechen?

Eduardo
quelle