In meiner Projektmanagement-App möchte ich das Problem lösen, dass mehrere Benutzer denselben Task-Datensatz anzeigen und mindestens einer von ihnen einige der Aufgaben-Daten aktualisiert, während die anderen sie anzeigen.
Hier ist ein Szenario ...
Benutzer 1 sieht Aufgabe # 1 und Benutzer # 2 Ansichten Aufgabe # 1
Jetzt Benutzer # 2 aktualisiert die Aufgabe # 1 Beschreibung
Benutzer # 1 zeigt jetzt den Aufgabeneintrag an, aber seine Ansicht zeigt eine andere veraltete Beschreibung , da Benutzer # 2 gerade aktualisiert wurde es! Schlimmer noch, er könnte die Beschreibung selbst bearbeiten wollen, die Benutzer # 2 Beschreibung update vollständig überschreiben würde.
Das ist ein Beispiel für das Problem. Fügen Sie einfach weitere Benutzer hinzu und das Problem wird multipliziert!
Idealerweise würde ich so etwas wie Sockets oder einen Dienst wie Pusher.com verwenden, um die Daten für alle Benutzer zu aktualisieren, sobald ein Update von einem Benutzer vorgenommen wurde. Allerdings wird dieses Projekt auf Hunderten von Servern laufen und hat begrenzte Fähigkeiten, was Serveranforderungen angeht, so dass Sockets und sogar ein Dienst wie Pusher nicht in Frage kommen!
Eine andere Idee für eine Lösung basiert auf dem, was Twitter tut. Wenn Sie eine Personen-Twitter-Seite anzeigen und sie einen neuen Beitrag erstellen, während Sie Ihre Seite geladen haben. Es wird eine Benachrichtigungsnachricht DIV angezeigt, um Ihnen mitzuteilen, dass X neue Posts vorhanden sind, und Ihnen einen Link zum Klicken zu geben, um den Post-Stream mit den neuesten Posts neu zu laden.
Ich glaube, dass ein ähnlicher Ansatz für mein Projekt funktionieren könnte. Wenn ein Benutzer eine Aktualisierung auf Task-Daten vornimmt, während andere Benutzer diesen Task-Datensatz anzeigen. Es würde eine Benachrichtigungsmeldung im modalen Fenster "Task" angezeigt, die dem Benutzer mitteilt, dass die Task-Daten aktualisiert wurden und dass sie die Task neu laden sollten.
Damit dies funktioniert, weiß ich, dass in bestimmten Abständen eine AJAX-Anfrage gestellt werden muss.
Diese AJAX-Anforderung müsste dann den Zeitstempel der letzten Aktualisierung des Task-Datensatzes vergleichen und sie mit der Zeit vergleichen, zu der der Benutzer den Task-Datensatz aufgerufen hat oder seit er die Aufgabe zuletzt geladen hat.
Ich habe das Gefühl, dass meine Logik ein Teil des Puzzles fehlt? Ist das alles richtig oder fehlt mir etwas?
Kann jemand erklären, wie ich das tun kann oder mir sagen kann, ob das, was ich vorhabe, richtig ist?
Ich weiß, dass ich in Kürze feststellen muss, ob der Timestamp der Task zuletzt geändert wurde, nachdem der andere Benutzer mit der Anzeige der Task begonnen hat. An einem gewissen Punkt, obwohl ich denke, dass die Benutzerzeit auch aktualisiert werden sollte?
AKTUALISIEREN
Ich habe komplett vergessen, dass Stack Overflow genau diese Aufgabe bei Fragen und Antworten erledigt! Wenn Sie eine Seite auf SO anzeigen und eine Antwort aktualisiert wird, wird eine Benachrichtigung angezeigt, in der Sie aufgefordert werden, die Antwort erneut zu laden und einen Link zum erneuten Laden bereitzustellen. Das möchte ich tun!
StackOverflow verwendet dazu Web Sockets, aber in meiner App, die ein Plugin für viele verschiedene Serverkonfigurationen ist, kann ich Sockets nicht verwenden. Ich versuche, mit AJAX ein ähnliches Ergebnis zu erzielen. Auch wenn es eine AJAX-Anfrage ist, die alle 30 Sekunden ausgeführt wird, um die Zeit für die Aufgabe zu ändern und sie mit einer anderen zu vergleichen, um festzustellen, ob der Benutzer Aufgabendaten erneut laden soll, würde in meinem Fall funktionieren.
Ihre Frage ist zu weit gefasst, aber Sie beschreiben im Grunde genommen einen Pub / Sub.
Immer wenn ein Benutzer Ihre Site betritt, erhält er ein Token, um sie zu identifizieren.
Wenn er auf eine Aufgabe zugreift, abonniert er diese Aufgabe, was bedeutet, dass jede Änderung an ihm angezeigt wird.
Er fragt den Server ab, um zu prüfen, ob es eine Warnung für ihn gibt.
Bezüglich der Implementierung können Sie eine Liste mit den Abonnements jedes Benutzers einrichten. Verwenden Sie Ihr Beispiel:
Benutzer1 abonniert (Task1, Task2)
User2 abonniert (Task1)
Bei jeder Subskription behalten Sie einen Wert, der den letzten Status darstellt, den der Benutzer zu diesem Thema hat (z. B. der Zeitstempel der letzten Änderung).
Der Benutzer fragt Ihre Anwendung alle n Sekunden ab. Immer wenn die Anfrage Ihre Anwendung erreicht, überprüfen Sie die Abonnements des Benutzers und überprüfen Sie, ob sich der Zeitstempel geändert hat (wenn sie den neuesten haben). Wenn dies der Fall ist, aktualisieren Sie den letzten Status des Benutzers und rufen ihn mit den neuen Werten für die geänderten Aufgaben ab.
Auf diese Abonnentenliste wird ständig zugegriffen, also seien Sie vorsichtig, wo Sie sie speichern. Denken Sie im Arbeitsspeicher daran, dass Sie es für die verschiedenen Instanzen freigeben müssen (wenn Sie Lasten ausgleichen). Sie können Redis oder etwas ähnliches verwenden.
Sie müssen nicht jedes Mal zu Ihrer Datenbank gehen, wenn Sie Daten abrufen müssen. Wenn jemand es abonniert, behalte es in einem Cache.
Das Konzept und die Idee sind ziemlich trivial und die Implementierung sollte nicht schwieriger sein. Sie benötigen einen Zuletzt aktualisiert Zeitstempel für jede Aufgabe, wie Sie sagen, sowie eine Letzte Aktualisierung Zeitmarke auf dem Client, wenn Sie mit dem beschriebenen Ansatz gehen. Wenn ein Benutzer eine Aufgabe anzeigt, möchten Sie im Allgemeinen (auf der Clientseite JavaScript):
Ein Ansatz könnte einfach ein asynchrones Intervall mit setInterval () erstellen das wird gelöscht, sobald festgestellt wurde, dass eine Aktualisierung stattgefunden hat, und dem Benutzer wird danach eine Nachricht angezeigt.
%Vor%Ich kann mir vorstellen, dass dieser Ansatz in einem erheblich massiven System leicht unzureichend sein könnte, aber für Lösungen ohne Enterprise-Qualität oder für Verbesserungen der Benutzeroberfläche kann dies eine schnelle, billige und spektakuläre Lösung sein.
Natürlich gibt es potentiell robustere und flexiblere Alternativen: lang-polling oder websockets .
Tags und Links javascript php mysql