web-dev-qa-db-ja.com

PhoneGapでサーバーとデータを同期するための戦略

AngularJSを使用して、最初のPhoneGapプロジェクトを開始しています。 REST APIをバックエンドとして使用するデータベース駆動型のアプリです。まず、データをローカルに保存するつもりはないので、インターネットなしではあまり機能しません。

しかし、最終的にはデータをローカルに保存し、インターネットが利用可能になったら同期するようにしたいと思います。なぜなら、時々携帯電話でインターネット接続を無効にしたり(飛行機、バッテリー不足)、バーがないためです。このタイプの同期に役立つリソースを教えていただけませんか。いくつかの推奨ライブラリ?または、落とし穴とその回避方法についてのいくつかの議論。私は少しグーグルで調べましたが、今、私は尋ねるべき質問がわからないと思います。

また、最初にインターネットに依存して構築し、次に同期を追加するという私の意図は....それは良いアイデアですか、それとも自分自身を撃ちますか?最初から同期を構築する必要がありますか?

インターネット専用部分ではなく、特定のロジックを持つアプリを最初にローカル専用として作成することを提案してもらいました。リモートストレージは私にとって重要なものです。このアプリの目標には多くの決定があることはわかっていますが、これを構築するという観点から、最終的な目標はローカルストレージ+インターネットストレージ、双方向同期です。それとも違いを生むのでしょうか?

まず、連続した整数の主キーではなく、UUIDを使用することを考えています。また、各デバイスに、生成するキーにプレフィックスを付けたIDを割り当てることも考えましたが、それはデリケートなようです。誰もがどちらのテクニックを使用しましたか?考え?

どのデータが同期されているかを知るには、良いシステムが必要だと思います。クライアント側では、作成/編集されたレコードに同期のフラグを立てることができます。しかし、サーバー側では、複数のクライアントが存在するため、機能しません。 last_updatedタイムスタンプがあり、更新されたすべてを同期して、最後に成功した同期を同期できると思います。

複数の場所で編集されたレコードはどうですか? 2つのクライアントが編集してから同期したい場合、gitや他のバージョン管理システムでブランチをマージするときなど、マージに関して多少のあいまいさがあります。どのようにそれを処理しますか? gitはすべてのコミットの差分を保存することでそれを行うと思います。差分を保存できると思いますか?これについて考えるほど、複雑に聞こえます。私はそれを過剰に考えているのか、それとも過小に考えているのか?

クライアント側のストレージはどうですか? SQLite、またはPhoneGapローカルストレージについて考えました( http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html )。推奨事項同期はREST APIで行われ、JSONを交換するため、実際にデータをJSONとして保存するもの、またはJSONに似た変換が簡単なものがいいと考えていました。一方、ある種のデータdiff形式を交換する必要がある場合、それを保存する必要があるのでしょうか?

31
eimajenthat

PhoneGapに関する十分な経験がないため、同期部分に関する私の経験に基づいて質問への回答を提供させてください。PhoneGapローカルストレージv SQLiteに関する質問はスキップします。

このタイプの同期に役立つリソースを教えていただけませんか。いくつかの推奨ライブラリ?

PhoneGapアプリをリモートサーバーと同期するためのオープンソースプロジェクトがいくつかあります。ただし、おそらく自分のニーズに合わせて調整するか、独自の同期機能を実装する必要があります。以下に、いくつかのオープンソースプロジェクトをリストしました。ネットを検索する場合は、既にそれらを認識している必要があります。

さらに、他のオプションを検討することもできますが、それはサーバー側に依存します。

また、最初にインターネットに依存して構築し、次に同期を追加するという私の意図は....それは良いアイデアですか、それとも自分自身を撃ちますか?最初から同期を構築する必要がありますか?

同期機能は追加のモジュールのようなもので、他のビジネスロジックと緊密に連携させるべきではないと思います。同期のテスト戦略について考え始めると、同期機能がメインコードから分離されている場合、テストが簡単になることがわかります。

同期せずに最低限必要な機能を使用して、できるだけ早くアプリを起動できると思います。ただし、事前にアーキテクチャと同期機能を追加する方法を検討することをお勧めします。

まず、連続した整数の主キーではなく、UUIDを使用することを考えています。また、各デバイスに、生成するキーにプレフィックスを付けたIDを割り当てることも考えましたが、それはデリケートなようです。誰もがどちらのテクニックを使用しましたか?考え?

それはプロジェクトの仕様、具体的にはサーバー側に依存します。たとえば、Azureモバイルサービスでは、プライマリキーに整数型のみを使用できます。主キーとしての一意の識別子は、分散システムでは非常に便利ですが(いくつかの欠点もあります)。

デバイスIDの割り当てに関連する-プロジェクトの詳細はわかりませんが、ポイントを理解できません。システムで使用されている同期アルゴリズムをご覧ください( REST between multiple Android clients and central SQL Server =)。

複数の場所で編集されたレコードはどうですか? 2つのクライアントが編集してから同期したい場合、gitや他のバージョン管理システムでブランチをマージするときなど、マージに関して多少のあいまいさがあります。どのようにそれを処理しますか? gitはすべてのコミットの差分を保存することでそれを行うと思います。差分を保存できると思いますか?これについて考えるほど、複雑に聞こえます。私はそれを過剰に考えているのか、それとも過小に考えているのか?

ここで、システムでの競合解決の処理方法について考える必要があります。

システムで競合が発生する可能性が高い場合、たとえばユーザーは同じレコードを頻繁に変更します。次に、同期の中でレコードのどのフィールド(列)が変更されたかを追跡し、競合が検出されたら追跡します。

  1. 競合するサーバー側レコードの変更された各フィールドを反復処理する
  2. サーバーレコードの変更された各フィールドを、クライアントの関連フィールドと比較します。
  3. クライアントフィールドが変更されていない場合、競合は発生しないため、サーバーフィールドで上書きします。
  4. それ以外の場合は競合するため、両方のフィールドのコンテンツをレポート用の一時的な場所に保存します
  5. 同期の最後に、競合しているレコードのレポートを作成します。
26
Havrl