オフラインシステムとの同期


9

私は、データを生成してサーバーに送信するモバイルデバイス(アプリケーションが埋め込まれている)からのビジネスデータを同期するシステムを設計しています。同期される各行は、データベースに特定のビジネスログを生成します。

同期するデータによって、ビジネスデータの最終変更日よりも古い日付(同期データ内)のデータが生成された場合、それを無視して、ログをデータベースに追加するだけです。アップロードされたデータが処理されると、データベースからデータがフェッチされ、デバイスにダウンロードされます。

書き込み直後のこのダウンロードのため、同期は同期でなければなりません。このような何かが私の既存のソリューションを置き換えるのに十分な価値がある場合は、まだリーダー/ライターのパターンを持つことが可能です。より重要なことは、最新のデータをダウンロードできることです。そのデータは全体としてフェッチされ、現時点では差分は実装されていません(後で来る可能性がありますが、問題はありません)。

同じビジネスオブジェクトで複数の同期を実行している可能性があります。それは起こりそうにありませんが、起こり得、それを処理できることを望んでいます。組み込みモバイルアプリケーションを数日間再同期せずに使用しない限り、同期は数秒続くことが予想されますが、数分は続きません。

同期されるデータの量は、同期プロセスも大きくなることは想定されていません。

つまり、同期の方法で相互排除を使用することになります。より正確には、Javaを使用し、読み取り専用の同期をブロックしないように、同期プロセス全体ではなく、書き込みメソッドに同期を設定します。

私が知りたいのですが :

  1. この方法が理にかなっていますか?同期プロセスの量と時間は許容範囲です。
  2. 一般的に、どのような概念を検討する必要がありますか。おまけ:Springモジュールにこれらの概念の実装がある場合。

オフラインの原因は何ですか?つまり、デバイスがオフラインのときは、サーバーだけにアクセスできないか、インターネットにもアクセスできないということですか?
Laiv

インターネットにアクセスできません。または頻繁に。
Walfrat 2017年

複数のクライアント/サーバーが同期している場合、何かが異なる場合に備えて、最初にデータのマスターシップを決定する必要があります。断続的な接続のみと複数のクライアントを検討する場合、これを段階的に行う方法はありません。
tofro 2018年

@tofroデータマスターシップは、私の場合は簡単に判別できるため、問題ありません。しかし、断続的な接続を使用して段階的にそれを行うことができないのはなぜですか?最終同期日だけを使用できませんか?このような日付を使用する私の場合の唯一の問題は、現在デバイス上にあるデータが移動されており、デバイスから削除する必要があることをどのようにして知るかです。
Walfrat 2018年

あなたの説明から、同じデータ項目がサーバーまたは1つ以上の複数のクライアントで変更される可能性があることを理解しました。モバイル#1に移動し、サーバーで変更され、モバイル#2に移動してそこで変更されたデータアイテムを、モバイル#1が(モバイル#2が接続されていない状態で)接続する三方向同期をどのように行いますか?
tofro 2018年

回答:


1

日付(信頼できない可能性がある)や同期要求に依存せずにクライアントデータをサーバーデータと同期させるために、しばらくの間(ある程度の成功を収めて)調査してきた1つのアプローチは、JSONパッチ(おそらくPOJO)の組み合わせです。あなたの場合)とイベントの調達

基本的な考え方は、クライアントとサーバーの現在の状態を保存する代わりに、クライアントとサーバーが変更のリストを保存し、イベントまたはパッチリクエストを通じてお互いにメッセージを送ることです。

したがって、クライアントにすべてのデータと日付をサーバーに送信させる代わりに、クライアントはイベントと、クライアントがデータが更新されたと最後に思った時刻に対応するリビジョン番号を送信します。このようなもの:

Server.send("MODIFY FOO", 3);

サーバーはこのイベントを(非同期的に)取得すると、すでに受信している他のイベントと調整します。たとえば、同じデータを使用する別のクライアントがすでに一部を変更していて、サーバーのリビジョン番号が5になっている可能性があります。したがって、このリビジョンは最後の2つが適用される前に適用する必要があり、すべてクライアントはこの変更について通知を受ける必要があります。

サーバーが終了すると、変更が行われたこと、および新しい現在のリビジョン番号が関係するすべてのクライアントに通知されます。次に、クライアントはこれらの変更を適用し、その内部リビジョン番号を更新します。

あなたの走行距離は異なる場合がありますが、私はそれが役立つことを願っています。

編集:この関連する質問で述べられているように、このアプローチの別の名前またはそのバリエーションは、メッセージキューイングと呼ばれます


システムは数日間オフライン(サーバーにアクセスできない)になる可能性があり、イベントがサーバーと同期された日付ではなく、イベントが発生した日付を登録する必要があります。そのため、日付を使用する必要があります。私もoptimisticLockingのリビジョン番号を持っていますが、同じ理由で、2台のデバイスがPOJOのバージョンXをダウンロードし、後で同期するときに、バージョンX + 1およびX + 2を生成する必要があるイベントをそれぞれ送信します。そして、デバイスは互いに通信できません。
Walfrat 2016年

この回答のリビジョン番号は常にサーバーで生成され、クライアントは古いリビジョン番号を送信します。リビジョンの増分はその責任ではないため、他のクライアントについて知る必要はありません。この回答では、提案されたソリューションの最も重要な部分である競合解決については触れていません。
バシレフ2017

0

最初の問題は、データを同期する方法として日付を使用することです。私はあなたの解決策のすべての詳細を得られなかったと確信していますが、私はそれを言うでしょう:

  1. 日付は携帯電話で生成されますか?この場合、モバイルで実行されているアプリは常に正しい日付を使用しますか?モバイルデバイスのシステム日付を多少変更できる悪意のあるユーザーはどうですか?異なるタイムゾーンのユーザーはどうですか?@jeffreyが言ったように、デバイスで生成された日付に依存するのは最善のアプローチではないかもしれません。

  2. 私が正しく理解していれば、楽観的同時実行制御を使用します。あなたのアプローチに本質的に間違っているものは何もありません。

  3. この質問は、Springでのオプティミスティックロックの実装に関するものです。多分あなたはそれにいくつかのインスピレーションを見つけることができます。


アクションが実行された日付を記録する必要があります。そのため、モバイルの日付で立ち往生しています。モバイルの日付は頻繁にシステムと再同期されます。登録済みのdevicedのみがサーバーと同期できます。セキュリティに関しては、今のところもう1つの懸念事項です(X509デバイス認証など)
Walfrat 2018年

日付をさらに別のデータフィールドとして記録できます。同期トークンとして扱う必要はありません。
バシレフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.