2013-07-15 13 views
7

Wir haben eine App, die Cloudant als Remote-Server verwendet. Dennoch ist Cloudant nicht vollständig kompatibel mit TouchDBs fortlaufenden Replikationen aus früheren Erfahrungen. Daher besteht unsere Alternative derzeit darin, manuelle One-Shot-Replikationen mit einer festen Frequenz auszulösen. Nichtsdestotrotz würden wir gerne wissen, ob dieser Ansatz mehr Geld kostet als kontinuierliche Replikationen, da kontinuierliche Replikationen longpoll verwenden und den Server nicht oft abfragen müssen. Mit anderen Worten, kostet One-Shot-Pull-Replikation mit Cloudant als Ziel eine GET-Anforderung?Kosten von kontinuierlichen Replikationen im Vergleich zu One-Shot-Replikationen (mit TouchDB und Cloudant)

Danke, Paul

+2

"Cloudant ist nicht mit den fortlaufenden Replikationen von TouchDB kompatibel." Warum nicht? – garbados

+0

Mike bezog sich in seiner Antwort auf das Problem der Inkompatibilität. Es ist ein offenes Problem, das noch nicht gelöst ist. Weder die TouchDB-Autoren noch die Cloudant-Unterstützung konnten feststellen, woher das Problem stammt, aber wir konnten es relativ einfach reproduzieren. – airpaulg

Antwort

8

Ich denke, das Problem Sie ist verweisen [1]. Cloudants Replikation ist 100% kompatibel mit CouchDB. In dieser Instanz zeigen die Protokolle von TouchDB an, dass der iOS-Netzwerkstapel auf unvollständigem JSON an TouchDB übergeben hat. Es ist nicht klar, wer in diesem Fall für den Replikationsfehler verantwortlich gemacht werden sollte.

[1] https://github.com/couchbaselabs/TouchDB-iOS/issues/241

Für die Kostenfrage, eine One-Shot-Pull-Replikation wird in einem GET auf die _changes Feeds jedes Mal führt es passiert, und die andere zu Replikation erforderlich Anfragen. Diese _changes Anfrage wird als leichte HTTP-Anfrage gegen Ihr Cloudant-Konto gezählt.

Ob dies jedoch als mehr oder weniger Anfragen insgesamt funktioniert, hängt von der Anzahl der Änderungen ab, die vom Remote-Server kommen.

Es ist auch wichtig, dass die Zahl der _changes Anrufe zu erinnern ist sehr klein im Verhältnis zur Anzahl anderer Anrufe beteiligt (zum Beispiel immer den Inhalt der Änderungen selbst und vor allem, wenn es viele Attachments).

Während diese Frage zu TouchDB spezifisch ist, und ich erwähne spezifische Verhalten dieser Code-Basis, diese Antwort befasst sich mit den Anträgen beteiligt bei der Replikation zwischen zwei beliebigen Systemen die CouchDB-Replikation Protokoll sprechen [2].

[2] http://www.dataprotocols.org/en/latest/couchdb_replication.html

Lassen Sie uns ein konstruiertes Beispiel nehmen: 1 Update pro 10 Sekunden Fenster die Quelldatenbank für die Replikation, wo eine TouchDB Datenbank das Ziel ist. Nehmen wir eine Umfrage von 5 Minuten im Vergleich zu einer fortlaufenden Replikation. Zur Vereinfachung der Anrufzählung nehmen wir auch Anhänge aus dem Bild. Wir gehen auch davon aus, dass das Gerät eine konstante Netzwerkverbindung hat.

Für den kontinuierlichen Fall erhält jede 10s TouchDB ein Update in der _changes Feed. Dies führt dazu, dass die longpoll-Verbindung geschlossen wird. TouchDB führt dann die Änderungen durch und fordert die Updates von der Quelldatenbank an; eine oder mehrere GET-Anforderungen auf dem Remote-Server. Während dies geschieht, muss TouchDB eine weitere longpoll Anfrage zu _changes öffnen.In einem Zeitraum von fünf Minuten würden Sie also mit 30 Aufrufen von _changes enden, plus alle Anrufe, um Dokumente abzurufen und Prüfpunkte aufzuzeichnen.

Vergleichen Sie dies alle fünf Minuten mit einer einmaligen Replikation. Sie erhalten Benachrichtigungen über die 30 Updates in einem _changes Feed-Aufruf. TouchDB implementiert eine Optimierung [3], wobei es _all_docs , um aktualisierte Dokumente zu erhalten für 1- Umdrehungen nennen, so dass Sie könnte mit einem einzigen Anruf beenden, um alle 30 Dokumente (nicht möglich im kontinuierlichen Fall als erhalten Sie habe eine einzige Änderung erhalten). Dann musst du die Checkpoint-Dokumente aufzeichnen. Im besten Fall weniger als 5 HTTP-Aufrufe, höchstens etwa ein Drittel von den kontinuierlichen Fall, da Sie extra _changes Anfragen vermieden haben.

[3] https://github.com/couchbaselabs/TouchDB-iOS/wiki/Replication-Algorithm#performance

Es kommt auf die Häufigkeit der Aktualisierungen, die Sie an die Quelle Datenbank erwarten. One-Shot-Replikation bietet wahrscheinlich einen glatteren Preis Kurve, wie Sie in einer besseren Kontrolle über die Anzahl der Anforderungen, die Sie vornehmen.

Eine weitere Frage ist, wie oft Verbindungen wegen der Netzwerkunterbrechungen fallen, die regelmäßig mit mobilen Geräten passieren. Die fortlaufenden Replikationen von TouchDB werden jedes Mal neu gestartet, wenn der Benutzer online geht (falls über die _replicator-Datenbank hinzugefügt). Dies ist eine weitere Quelle von unvorhersehbaren Kosten.

Die Vorteile einer direkteren Sichtbarkeit von Änderungen können jedoch sicherlich die Unsicherheit wert sein.

+0

Vielen Dank für die sehr detaillierte Antwort. Nichtsdestotrotz hatte ich den Eindruck, dass das Longpoll nur geschlossen wird, wenn eine Zugänderung stattfindet. Ich wusste nicht, dass es ein Update bekommen hat, dass es nichts gibt, was den Pull schließt, was das Longpoll schließt. Ich erinnere mich irgendwie daran, einen kontinuierlichen Pull mit einem Proxy zu testen, und es schien nur Anfragen auszulösen, wenn ich tatsächlich Daten auf der Serverseite änderte, aber ich könnte mich irren. Mit anderen Worten, du bestätigst, dass das longpoll alle 10 Sekunden geschlossen wird, auch wenn nichts zu ziehen ist, was es zwingt, eine weitere GET-Anfrage auszulösen, um es wieder zu öffnen? – airpaulg

+1

Die longpoll-Anfrage hat eine Zeitüberschreitung (standardmäßig 60s). Nach dieser Zeit wird sie zurückgesetzt, wenn keine Änderungen vorgenommen wurden. Dies ist pro Replikationsbasis konfigurierbar - siehe http://docs.couchdb.org/en/latest/changes.html. –

+0

Falls sich alle 10 Sekunden keine Änderungen ergeben, ändert sich dadurch die Kostenberechnung zugunsten der fortlaufenden Replikation, da die Longpoll Timeouts ziemlich lang sind? Würde eine längere Zeitüberschreitung in der Praxis keine kontinuierlichen Replikationen weniger kosten? Was sind die negativen Aspekte längerer Timeouts? – airpaulg