Frage

Ich bin die Implementierung einer document server.Derzeit, wenn zwei Benutzer das gleiche Dokument öffnen, dann ändern Sie es und speichern Sie die änderungen, die Dokument-Zustand nicht definiert wird (entweder der erste Benutzer die änderungen werden dauerhaft gespeichert, oder die zweite).Das ist völlig unbefriedigend.Als ich zwei Möglichkeiten, dieses problem zu lösen:

Die erste ist, um das Dokument sperren, wenn es geöffnet ist, von jemandem das erste mal, und entsperren Sie es, wenn es geschlossen ist.Aber wenn die Netzwerk-Verbindung zum server plötzlich unterbrochen wird, wird das Dokument bleiben würde, in ewig-locked state.Die offensichtliche Lösung ist das senden von regelmäßigen pings an den server.Wenn der server nicht empfangen K pings in Folge (K > 1) von einem bestimmten client, Dokumente gesperrt von diesem client werden freigeschaltet.Wenn der client erneut angezeigt wird, Dokumente werden wieder gesperrt, wenn jemand hatte nicht bereits gesperrt wurden.Dies könnte auch helfen, wenn der client-Anwendung (läuft im web-browser) wurde unerwartet beendet, so dass es unmöglich senden "beenden, entsperren Sie meine Dokumente" - signal an den server.

Die zweite ist, speichern von mehreren Versionen eines Dokuments gespeichert, die von verschiedenen Benutzern.Wenn änderungen am Dokument vorgenommen werden, in rascher Folge, die system würde entweder zum Zusammenführen von Versionen oder wählen Sie eine bevorzugte version.Optimieren Lagerung Raum, nur Dokument diffs gehalten werden sollte (genauso wie die source-control-software).

Welche Methode sollte ich wählen, unter Berücksichtigung, dass die Verbindung zum server kann manchmal langsam und reagiert nicht mehr?Wie sollten sich die Parameter (ping-Intervall, schnelle Abfolge Intervall) bestimmt werden?

P. S.Leider, ich kann nicht speichern der Dokumente in einer Datenbank.

War es hilfreich?

Lösung

Mein Vorschlag wäre so etwas wie Ihre erste.Wenn der erste Benutzer (Bob), der das Dokument öffnet, er erwirbt die Sperre, so dass andere Benutzer können nur Lesen das aktuelle Dokument.Wenn der Anwender das Dokument speichert, während er es benutzt, er hält die Sperre.Nur wenn er beendet das Dokument, es ist entsperrt und anderen Menschen, die es Bearbeiten können.

Wenn der zweite Benutzer (Kate) öffnet das Dokument, während Bob hat die Sperre auf Sie, Kate, erhalten eine Meldung, dass das Dokument nicht bearbeitet werden, aber Sie können es Lesen, bis Sie die Sperre freigegeben wurde.

Was passiert also, wenn Bob erwirbt die Sperre, vielleicht speichert das Dokument einmal oder zweimal, aber dann beendet die Anwendung, verlassen Sie die Sperre hängen?

Wie Sie selbst sagten, dass sich der client mit dem Schloss zum senden von pings an eine bestimmte Frequenz ist wahrscheinlich die beste option.Wenn Sie nicht bekommen, ein ping vom client für eine bestimmte Zeit, dies bedeutet effektiv sein-client reagiert nicht mehr.Wenn dies ist eine web-Anwendung können Sie javascript verwenden, für die pings.Das Dokument zuletzt gespeichert wurde releases, seine Sperre und Kate kann nun erwerben.

Ein ping kann den Namen des Dokuments, das der client hat eine Sperre auf, und die server können berechnen, Wann die Letzte ping-für das Dokument empfangen wurde.

Andere Tipps

Die erste option, die Sie beschreiben, ist im wesentlichen eine pessimistische sperren-Modell, während die zweite ist eine optimistische Modell.Welches man wählen, kommt wirklich auf eine Reihe von Faktoren aber im wesentlichen darauf an, wie das Unternehmen arbeiten will.Zum Beispiel würde es übermäßig belastet den Benutzer, wenn ein Dokument Sie benötigt, um zu Bearbeiten, wurde von einem anderen Benutzer gesperrt?Was passiert, wenn ein Dokument gesperrt ist und jemand geht in den Urlaub mit Ihrem client verbunden?Was ist die Wahrscheinlichkeit von Konflikten für jedes Dokument, d.h.wie wahrscheinlich ist es, dass das gleiche Dokument ändern, indem Sie zwei Benutzer an der gleichen Zeit?, wie lokalisiert sind die änderungen wahrscheinlich in einem einzelnen Dokument?(Wenn Sie den gleichen Abschnitt geändert wird regelmäßig dann ein merge kann länger dauern, als einfach nur zu machen die änderungen wieder).

Angenommen, die Behauptung ist relativ niedrig und/oder die Größe jedes ändern ist ziemlich klein, dann würde ich wahrscheinlich entscheiden Sie sich für eine optimistische Modell, das löst Konflikte mithilfe einer automatischen oder manuellen Zusammenführen.Eine Versionsnummer oder eine Prüfsumme über den Inhalt des Dokuments kann verwendet werden, um festzustellen, ob eine Zusammenführung erforderlich ist.

Derzeit werden Dokumente veröffentlicht, die von einer begrenzten Gruppe von Menschen, jeder von Ihnen arbeitet auf einem separaten Thema.So, die Unannehmlichkeiten eingeführt durch sperren minimiert wird.Leute, die hauptsächlich die Erweiterung der vorhandenen Dokumente und korrigieren von Fehlern in Ihnen.

Das sprechen über die pessimistischen Modell, die " Links-client verbunden für N Tage Szenario kann vermieden werden, indem Sie lock-gültig bis zu, sagen wir, ein Tag vor der Schloss-Starttermin.Da Dokumente bearbeitet werden keineswegs geschäftskritischer und werden modifiziert von mehreren Benutzern sehr selten, das könnte genug sein.

Betrachten wir nun die optimistischen Modell.Wie sollten die Unterschiede erkannt werden, wenn die Dokumente haben einige regelmäßige (z.B. hierarchische) Struktur?Wenn nicht?Was sind die Chancen auf eine erfolgreiche automatische merge-in diesen Fällen?

Die situation wird komplizierter, weil einige der Dokumente, herausgegeben von den "admins" Benutzer-Gruppe) enthalten wichtige Konfigurationsinformationen (document globalen index, Benutzer, Rollen, etc.).Meiner Meinung nach, die Schleusen sind mehr vorteilhaft für genau diese Art von Informationen, weil es nicht geändert, die auf täglichen basis.So einige hybrid-Lösung könnte akzeptabel sein.

Was denkst du?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top