Docs Menu
Docs Home
/ /
Atlas App Services
/ /

Atlas Device Sync プロトコル

項目一覧

  • Overview
  • 重要な概念
  • 変更セット
  • 運用上の変換
  • クライアント ファイル識別子
  • ネットワークセキュリティ
  • 同期セッション プロセス
  • アプリ サーバーへのクライアント接続
  • クライアントによる同期セッションの開始
  • App Services による新しいクライアント ファイル識別子の割り当て
  • クライアントがクライアント識別子を送信
  • クライアントによる同期変更セット
  • クライアントが同期セッションを終了
  • リクエスト タイプ
  • クライアント -> サーバー メッセージ
  • サーバー -> クライアント メッセージ

Atlas Device Sync は、 プロトコルを使用して、それぞれがローカルの Realm ファイルを保持する複数のクライアント間でデータの変更をリアルタイムで正しく効率的に同期します。 このプロトコルは、事前定義されたリクエスト タイプのセットと、Realm SDK などのクライアントが Atlas App Services アプリケーション サーバーに接続してデータを同期するためのプロセスを定義します。

注意

Realm SDK は同期プロトコルを内部的に実装および管理するため、ほとんどのアプリケーションにおいて Device Sync を使用するために同期プロトコルを理解する必要はありません。 このページでは高レベルのプロトコルを説明しており、実装仕様ではありません。

変更セットは、1 つ以上の書込み操作によって既知のオブジェクトの状態またはバージョンに対して行われた詳細な変更を説明する指示のリストです。 変更セットは、同期プロトコルの基本単位です。 同期された Realm クライアントは、書込み操作を実行するたびに変更セットを Device Sync サーバーに送信します。 サーバーは、接続された各クライアントに、他のクライアントによって実行された書込み (write) 操作の変更セットを送信します。

Device Sync サーバーは、接続された同期クライアントからの変更セット(同期された MongoDB クラスターの変更を含む)をいつでも受け入れ、運用変換アルゴリズムを使用して変更を線形順序で直列化し、競合する変更セットを接続クライアントに送信する前に解決します。

注意

差分同期

同期されたオブジェクトに変更を加えても、App Services はオブジェクト全体を再アップロードしません。 代わりに、App Services は変更前と変更後の差(「デルタ」)のみを送信します。 サービスは zlib でデルタを圧縮します 圧縮。これによりネットワーク負荷が軽減され、モバイル ネットワークの条件において特に有用です。

演算子変換とは、2 つの変更セットの場合、指定された変更セットの一方を論理的に適用することを表す 3 つ目の変更セットを生成する関数です。 Device Sync は 運用変換 を使用して、同じ基本状態に適用される異なる同期クライアントからの変更セット間の競合を解決します。

Realm は、同期が有効になっている場合でも、オフライン ファーストのローカル データベースです。つまり、ネットワーク接続が再確立されたときに、どのデバイスもオフライン書き込みを実行し、対応する変更セットをアップロードできます。 運用変換アルゴリズムは、同期されたすべての Realm ファイルが変更された各オブジェクトの同じバージョンに統合されるように、論理サーバーのクロックに対して「順序」から順に到着した変更セットを正常に処理するように設計されています。

Tip

Realm 変更セットでの運用変換は 再ベース操作 に類似 Git 。

クライアント ファイル識別子は、同期されたクライアントの Realm ファイルとそれに対応するサーバー ファイルを一意に識別する値です。 サーバーは、Realm ファイルの最初の同期中に SDK が要求するたびにクライアント ファイル識別子を生成します。 各識別子は 64 ビットのゼロ以外の正の符号付き整数で、2 ^ 63 未満です。

注意

サーバーは、特定のサーバー ファイルに代わって生成されたすべての識別子が互いに一意であることを保証します。 サーバーは、異なるサーバー ファイルに関連付けられている場合、2 つのクライアント ファイルに対して同一の識別子を無料で生成できます。

SDK は、 TLS を使用して、HTTPS1.3 によって保護された WebSocket 接続を介してアプリケーション サーバーと同期します。

Device Sync セッションを開始、実行、終了するために、Realm SDK とアプリケーション サーバーはプロトコル固有のリクエストのセットを送受信します。

SDK は HTTP 経由で WebSocketBIND IDENT接続をネゴシエートし、WebSocket 接続経由でサーバーに リクエストと リクエストを送信して同期セッションを確立します。セッションが確立されると、SDK とサーバーは特定の Realm ファイルの同期された変更セットをUPLOAD } メッセージとDOWNLOADメッセージを介して相互に送信します。 セッションを終了するには、SDK はUNBINDリクエストを送信します。

Realm SDK App Server
| |
| <---- 1. HTTP Handshake -----> |
| |
| --------- 2. BIND -----------> |
| |
| <-- 3. IDENT (first time) ---- |
| |
| --------- 4. IDENT ----------> |
| |
| <---- 5. UPLOAD/DOWNLOAD ----> |
| |
| --------- 6. UNBIND ---------> |
1

同期プロトコルは、主に SDK とサーバー間の WebSocket 接続を介して処理されます。 接続を確立するために、SDK は次の内容を含むハンドシェイク HTTP リクエストを送信します。

  • プロトコルバージョン

  • WebSocket キー

  • 認証された App Services アプリケーション ユーザーの有効な アクセス トークン

サーバーが HTTP101 スイッチ プロトコル を送信する SDK の WebSocket 接続を指定する応答。同期プロトコルの残りの部分は、この接続を介して行われます。

2

同期セッションを開始するために、Realm SDK は Device Sync サーバーにBINDリクエストを送信します。 このリクエストは、同期する特定のローカル Realm データベース ファイルを識別し、サーバーが SDK への双方向接続を開くために使用する WebSocket 接続キーを含みます。

SDK が特定の Realm Database ファイルを初めて同期しようとする場合、ファイルのサーバーが生成したクライアント識別子はまだ存在しません。 この場合、 BINDリクエストは、Device Sync サーバーが 1 を割り当てる必要があることも示します。

3

BINDリクエストが SDK にクライアント ファイル識別子が必要であることを示す場合、Device Sync サーバーは指定された Realm データベース ファイルに対して一意の 値を生成し、それをIDENT応答で SDK に送信します。 SDK がIDENTを受信すると、新しいクライアント識別子をローカルの Realm Database ファイルに永続的に保存します。

SDK は、各 Realm データベース ファイルを初めて同期するときにのみクライアント ファイル識別子を要求する必要があります。 後続の同期セッションでは、SDK は永続化された識別子を使用できます。

4

SDK がBINDリクエストで同期セッションを開始したら、同期するローカル Realm Database ファイルを識別する必要があります。 そのために、SDK はクライアント ファイル識別子を含むIDENTメッセージをアプリケーション サーバーに送信します。 SDK が以前に Realm をサーバーと同期したことがある場合は、同期プロセスを最適化するために最後に同期されたサーバー バージョンを指定できます。

サーバーはIDENTメッセージを受信すると、セッションを確立します。 SDK とサーバーは、いつでも同期の変更セットをいつでも自由に送信できるようになりました。

5

同期セッションが確立されると、SDK とサーバーはUPLOADDOWNLOADメッセージを自由に送受信でき、変更が発生するたびに同期できます。

SDK は、サーバーから メッセージで受信した変更を除く、適用されるすべての変更セットに対してUPLOAD DOWNLOADメッセージを送信します。

サーバーはUPLOADメッセージを受信すると、運用変換を適用して他の変更セットとの競合を解決し、変換された変更セットを Realm のサーバー バージョンに適用します。 これによりサーバーはトリガーされ、サーバー邦土をミラーリングする同期された Atlas クラスターなど、接続されている他のクライアントにDOWNLOADメッセージを送信します。 DOWNLOADメッセージは、1 つ以上の変換された変更セットを、サーバーの履歴に従って、最も古いものから最新のものまで時系列でグループ化します。 SDK は変更セットを同じ順序で適用します。

6

同期セッションが確立されると、DK がセッションを終了するまで、Device Sync サーバーは引き続きUPLOADメッセージを受け入れ、 DOWNLOADメッセージを送信し続けます。 同期セッションを終了するには、SDK から Device Sync サーバーにUNBINDリクエストが送信されます。

次の表では、同期クライアントが Device Sync サーバーに送信できるリクエストの種類について説明します。

リクエスト
説明
BIND

サーバー上で新しい同期セッションを開始し、現在のアプリケーション ユーザーに署名された認可トークンを提供します。 クライアントが同期する Realm ファイルのクライアント ファイル識別子をまだ持っていない場合は、サーバーが識別子を生成し、クライアントに送り返す必要があることも示します。

クライアントは、他のリクエストを送信する前に、BIND を送信する必要があります。

IDENT

次の内容を示すクライアント ファイル識別子を提供します。

  • 同期する Realm ファイル

  • クライアント邦土の現在のバージョン

  • クライアント邦土の最新同期されたサーバー バージョン

このリクエストは、クライアントが クライアント ファイル識別子をリクエストしたときにサーバーが送信するIDENTメッセージと関連していますが、それとは異なります。

UPLOAD
クライアントで発生した操作の 1 つ以上の変更セットを指定します。 変更セットは、クライアントのバージョン別に昇順で表示されます。
TRANSACT
クライアント上で発生したシリアル化されたトランザクションを記述する変更セットを指定します。 サーバーがトランザクションを確認または拒否するまで、クライアントは他の変更セットをアップロードできません。
UNBIND

実行中の同期セッションを終了します。

クライアントはUNBOUNDセッションに他のリクエストを送信できません。

MARK
サーバーがクライアントにサーバー履歴(リクエストの時点で)最新の変更セットを同期したときを通知することを要求します。
REFRESH
現在の同期セッションを新しいユーザー トークンで再認可します。
STATE_REQUEST
サーバーが 1 つ以上のSTATEメッセージを送信することをリクエストします。このメッセージは、クライアントが Realm ファイルの現在のサーバー バージョンをダウンロードするために使用します。 クライアントは、同期された Realm を非同期に開くときに状態リクエストを発行します。
CLIENT_VERSION_REQUEST
クライアントによって送信され、サーバーによって処理された最新の変更セットのクライアント バージョンをサーバーが送信することを要求します。 これは、SDK がクライアント リセットを実行するときに最も一般的に使用されます。
PING

クライアントがまだ接続されており、サーバーが同期セッションを維持する必要があることを示します。 クライアントは10分ごとに少なくとも 1 つの PING をサーバーに送信する必要があります。 サーバーはPONGを使用して各 PING に確認応答を返します。

サーバーが 10 分以上クライアントからの PING を受信しない場合、クライアントは切断されたと見なされ、セッションが自動的に終了することがあります。

次の表では、Device Sync サーバーが同期クライアントに送信できるリクエストの種類について説明します。

リクエスト
説明
IDENT
識別子をリクエストした に応答してサーバーが生成した クライアント ファイル識別子BIND を提供します。
DOWNLOAD

他のクライアントで発生した操作に対して 1 つ以上の変更セット(合計16 MB まで)を指定します。 変更セットは、サーバーのバージョン別に昇順で表示されます。

ダウンロードの変更セットは、他のクライアントによってアップロードされた変更セットと正確に一致しない場合があります。 代わりに、Device Sync の運用変換アルゴリズムによって出力される同等の変更セットになる場合があります。

UNBOUND
TRANSACT
サーバーがクライアントからのTRANSACTで指定された変更セットを正常に処理したかどうかを示します。
MARK
サーバーがクライアントから を受信したときにサーバー履歴にあった最新のMARK 変更セット をサーバーがクライアントに送信したことを示します。
STATE
クライアントが連結して Realm の最新のサーバー バージョンを構築できるエンコードされたデータの 1 つ以上のセグメントが含まれます。 STATE_REQUESTに応答して送信されます。
CLIENT_VERSION
クライアントによって送信され、サーバーによって処理された最新の変更セットのクライアント バージョンを指定します。 CLIENT_VERSION_REQUESTに応答して送信されます。
ERROR
接続済みクライアントが原因と思われる問題がサーバーで発生したことを示します。 詳細については、 「同期クライアント エラー」 を参照してください。
PONG
PINGを確認します。 クライアントが PING 確認応答を受信しない場合は、クライアントが現在ネットワーク経由でサーバーと通信できず、サーバーが対応するPINGを受信していない可能性があることを示します。

戻る

競合の解決