Ich habe eine JavaScript-Anwendung, die regelmäßig neue und aktualisierte Daten speichert. Ich brauche es jedoch auch, um an langsamen Verbindungen zu arbeiten.

Die Daten werden in einer einzigen HTTP-POST-Anforderung gesendet. Die Antwort gibt neu eingefügte IDs für neu erstellte Datensätze zurück.

Was ich finde, ist, dass die übermittelten Daten vollständig gespeichert sind, aber manchmal läuft das Rückgabeergebnis ab. Die Browseranwendung weiß daher nicht, dass die Daten erfolgreich übermittelt wurden, und versucht erneut, sie zu speichern.

Ich weiß, dass ich das Zeitlimit im Browser erkennen kann, aber wie kann ich sicherstellen, dass die Daten korrekt gespeichert werden?

Was sind einige gute Methoden, um diesen Fall zu behandeln?

Ich sehe von hier aus https://dba.stackexchange.com/a/94309/2599, dass ich a einschließen könnte ausstehender Zustand:

  • Transaktionsnummer vom Server abrufen
  • Daten senden, wird als ausstehend auf dem Server gespeichert
  • Wenn eine ausstehende Transaktion bereits vorhanden ist, überschreiben Sie die Daten nicht, sondern senden Sie dieselben Ergebnisse zurück
  • Wenn der Erfolg erfolgreich ist, schreiben Sie die ausstehende Transaktion fest
  • Wenn der Fehler zurück ist, versuchen Sie es später erneut
  • Wenn das Zeitlimit überschritten ist, versuchen Sie es später erneut

Ich bin jedoch auf der Suche nach einer einfacheren Lösung?

1
jdog 21 Aug. 2015 im 03:25

3 Antworten

Beste Antwort

Es scheint wirklich so, als müssten Sie herausfinden, warum der Client glaubt, dass die Daten nicht gespeichert wurden, aber tatsächlich. Wenn es sich nur um ein Timing-Problem handelt, muss das Client-Timeout möglicherweise nur verlängert werden, damit es nicht zu früh aufgibt, oder die Datenmenge, die Sie in der Antwort zurücksenden, muss reduziert werden, damit die Antwort zurückkommt schneller auf einer langsamen Verbindung.

Wenn Sie das Problem jedoch nicht auf diese Weise beseitigen können, gibt es eine Reihe von Möglichkeiten, um das Problem zu umgehen:

  1. Der Server kann die letzte Speicheranforderung von jedem Client (oder einen Hash einer solchen Anforderung) verfolgen. Wenn eine doppelte Speicheranforderung von demselben Client eingeht, kann er einfach etwas wie "bereits gespeichert" zurückgeben.

  2. Der Code-Fluss auf dem Server kann so geändert werden, dass unmittelbar nach dem Festschreiben des Datenbankvorgangs eine kleine Antwort an den Client zurückgesendet wird (keine Verzögerungen für andere Arten von Back-End-Vorgängen), wodurch die Wahrscheinlichkeit eines Timeouts des Clients verringert wird nachdem die Daten gespeichert wurden.

  3. Der Client kann für jede Sicherungsanforderung eine eindeutige ID prägen. Wenn der Server sieht, dass dieselbe Sicherungs-ID für mehrere Anforderungen verwendet wird, kann er wissen, dass der Client denkt, er versuche nur, diese Daten erneut zu speichern.

  4. Nach jeder Art von Fehler kann der Client vor dem erneuten Versuch den Server abfragen, um festzustellen, ob der vorherige Speicherversuch erfolgreich war oder fehlgeschlagen ist.

1
jfriend00 21 Aug. 2015 im 00:43

Einige Vorschläge

  • Erhöhen Sie die Zeitüberschreitung, behandeln Sie die Zeitüberschreitung nicht als Erfolg.
  • Sie können die Ausgabe jedes Datensatzes löschen, sobald Sie ob_flush und flush verwenden.
  • Da Sie in regelmäßigen Abständen eine Anfrage stellen. Suchen Sie bei jedem API-Aufruf nach der Methode connection_aborted. Wenn der Client die Verbindung getrennt hat, können Sie die Antwort in einer temporären Datei speichern. Bei der nächsten Anforderung können Sie die letzte Antwort mit einer neuen Antwort anhängen. Diese Methode ist jedoch ressourcenintensiver.
0
Madhurendra Sachan 21 Aug. 2015 im 00:49

Sie können mehrere Wiederholungsversuche als einfaches globales int zählen lassen. Sie können es auch automatisch wiederholen, dies ist jedoch nicht gut für eine App zum automatischen Speichern. Eine dritte Option ist die Verwendung der Plugins zum automatischen Speichern für jQuery.

0
Dmitry Sadakov 21 Aug. 2015 im 00:29