2013-07-15 5 views
7

Cloudantをリモートサーバーとして使用するアプリケーションがあります。それにもかかわらず、Cloudantは以前の経験からのTouchDBの継続的な複製と完全には互換性がありません。だから私たちの現在の選択肢は、固定周波数で手動でワンショットの複製をトリガすることです。それにもかかわらず、連続レプリケーションではlongpollが使用され、サーバーに頻繁に問い合わせる必要がないため、このアプローチでは連続レプリケーションよりもコストがかかりますか?言い換えれば、ターゲットとしてのCloudantのワンショットプルレプリケーションは、私たちにGETリクエストを要求しますか?連続レプリケーションとワンショットレプリケーションのコスト(TouchDBとCloudantを使用)

は、[1]私はあなたがを参照してください。問題があると思い、 ポール

+2

"CloudantはTouchDBの連続レプリケーションと互換性がありません。"何故なの? – garbados

+0

マイクは彼の返答で非互換性の問題を指摘した。まだ解決されていない未解決の問題です。 TouchDBの著者やCloudantのサポートは、問題の原因を特定することはできませんでしたが、比較的容易に再現することができました。 – airpaulg

答えて

8

、ありがとうございました。 CloudantのレプリケーションはCouchDBと100%互換です。この インスタンスでは、TouchDBのログは、不完全なJSONからTouchDBへの が渡されたiOSネットワークスタックを示します。この場合、レプリケーションが失敗したために、誰が を非難したのかは明らかではありません。コストの問題については

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

、ワンショットプルレプリケーションは_changes フィードそれが起こるたびに、プラス 複製するために必要なその他の要求にGETになります。この_changesリクエストは、Cloudantアカウントに対してHTTPリクエストとして とカウントされます。

ただし、これ以上の要求があるかどうかは、 の場合は、リモートサーバーからの変更の数によって異なります。

それは_changes呼の数が関与する他の呼(例えば、多くの 添付ファイルがある場合は特に変更自身の コンテンツを取得して)の数に 比べ非常に小さいことを覚えておくことも重要です。この質問はTouchDBに固有のものであり、私はそのコードベースの特定 行動に言及しながら

は、要求にこの答えのお得な情報は、CouchDBのレプリケーション プロトコルを話す任意の2つのシステム間でのレプリケーションに を関与[2]。

[2]

http://www.dataprotocols.org/en/latest/couchdb_replication.htmlはのは不自然な例を見てみましょう:TouchDBデータベース が対象となる複製するための1更新 への第2の窓10ごとに、ソース・データベース。連続した複製と5分間のアンケートを行いましょう。 コールカウンティングを簡単にするため、添付ファイルを 画像から取り出してみましょう。また、デバイスには一定のネットワーク接続があるものとします。

連続している場合、TouchDBはすべて、 _changesフィードで更新を受信します。これにより、longpoll接続が閉じます。 TouchDBは変更を実行し、 ソースデータベースからの更新を要求します。リモートサーバー上の1つ以上のGET要求 これが起こっている間、TouchDBは別のlongpoll要求を開く必要があります。 〜_changesだから5分の間におそらく の_changesへの呼び出しと、ドキュメントを取得して のチェックポイントを記録するためのすべての呼び出しで終わるでしょう。

5分ごとにワンショットレプリケーションと比較してください。 は、1回の_changesフィード呼び出しで30個の更新の通知を受け取ります。 TouchDBは、最適化を実装して、[3]それはあなたが のような連続する場合では不可能すべての30件の文書を(得るために、単一の 呼び出しで終わるかもしれないので、1-回転域用の更新された文書を取得するために _all_docs呼び出すことによって、あなた一回の変更を受けました)。次に、チェックポイント文書 を記録します。最高5つ未満のHTTPコール、最大でも の約3分の1、継続的なケースとしては、追加の_changesリクエストを避けました。

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

は、それはあなたがソース データベースへの期待の更新頻度にダウンしています。ワンショットレプリケーションでは、作成するリクエストの数をより適切に制御できるため、より円滑な価格を提供する可能性があります( )。

さらに、モバイルデバイスで定期的に発生するネットワーク切断のため、接続がどの程度頻繁に切断されるかが問題です。 ユーザが(_replicatorデータベースを介して追加された場合)ユーザーがオンラインになるたびに、TouchDBの連続レプリケーションが実行されます。これは、予測不可能なコストのさらなる原因である です。

しかし、変更のより迅速な可視性のメリットは確かに不確実性に値する かもしれません。

+0

非常に詳細な回答をいただきありがとうございます。それにもかかわらず、私はロングポールが引っ張る変更があるときだけ閉じた印象を受けていました。私は、ロングポールを閉じる引っ張りがないことを伝えるアップデートを受け取ったことを知らなかった。私は、プロキシを使って連続的にプルをテストしたことを思い出して、実際にサーバー側のデータを変更したときにリクエストをトリガしたように見えましたが、間違っている可能性があります。つまり、10秒ごとにロングポールが引き出されることがなくても閉じられ、別のGETリクエストを再度開くように強制することを確認しますか? – airpaulg

+1

longpoll要求にはタイムアウト(デフォルトは60秒)があり、変更がなければリセットされます。これは、複製ごとに構成可能です(http://docs.couchdb.org/en/latest/changes.htmlを参照)。 –

+0

10秒ごとに変更がない場合、ロングポールのタイムアウトがかなり長いため、連続レプリケーションのためにコスト計算が変更されますか?また、実際には、タイムアウトが長くなれば、継続的な複製が安価になるでしょうか?長いタイムアウトの否定的な側面は何ですか? – airpaulg

関連する問題