2.9. オフライン・同期

オフライン・同期機能を使用する際は、次の点に注意が必要です。

  • ACL
  • 同期範囲の設定
  • 同期範囲の変更
  • 別ユーザログイン
  • 論理削除オブジェクト

以下、順に説明します。

2.9.1. ACL

ローカルキャッシュに関係するアクセス権変更があっても、同期ではローカルキャッシュへは自動的に反映されません。ユーザのアクセス可能なオブジェクトが増加した場合、増加したオブジェクトを取得できない場合があります。

  • 具体例
    • ユーザの所属するグループの追加や変更
    • バケットに対するアクセス権の追加
  • 解説
    • オブジェクトの ACL を変更した場合は、当該オブジェクトは変更されたとみなされ同期によりサーバからクライアントへ送付されるため問題はありません。
    • グループにユーザを追加すると、オブジェクトには変更がないにも関わらずアクセス不可⇒可にアクセス権限が変化する場合があります。この場合、当該オブジェクトは差分同期の対象とならないため、クライアントへ送付されません。
    • 逆にグループからユーザを削除すると、オブジェクトがアクセス可⇒不可 に変化する場合があります。この場合、当該オブジェクトはローカルキャッシュから削除されず、更新もされないオブジェクトとなってしまいます。
  • 対策
    • ユーザのアクセス権が変わるような操作を行う場合には、ローカルキャッシュを削除するようにしてください。

具体例の解説

User A の所属グループが(Group1,Group2)から(Group1,Group3)に変更になった場合、 アクセス権が失われた Object Y は、ローカルキャッシュから消えずに残り、アップデートもされなくなってしまいます。

アクセス権が追加された Object Z は、クライアントにオブジェクトが送付されず、アプリから存在が見えません。

オブジェクト アクセス可能なグループ アクセス権変更前 アクセス権変更後 挙動
Object X Group1 正常
Object Y Group2 × 消えなくなる
Object Z Group3 × 見えない

2.9.2. 同期範囲の設定

同期範囲を決定するために利用するオブジェクトフィールドは書き換えが起こらないフィールドのみとしてください。

  • 具体例
    • 特定のフィールドにIDを入れるなどして、同期範囲を設定する場合、その フィールドの値を変更しないでください。
    • 端末Aでローカルキャッシュにオブジェクトを作成・同期したあと、別の端末Bから そのオブジェクトの ID を端末Aの同期範囲外に変更すると、当該オブジェクトが端末Aのローカルキャッシュから削除されなくなります。
  • 解説
    • ID 変更を行ったオブジェクトが同期範囲から外れると、同期時に当該オブジェクトがクライアントに送信されないため、端末Aのローカルキャッシュから削除されなくなります。
  • 対策
    • 同期範囲として利用するフィールドの値変更は行わないように注意してください。

2.9.3. 同期範囲の変更

同期範囲を変更すると、最終同期日時がリセットされます。

  • 最終同期日時がリセットされると、次回同期は差分同期ではなく全データ同期となるため、同期に要する時間が長くなります。
  • 最終同期日時の考え方は、p33「オフライン・同期アルゴリズムの解説」を参照ください。

2.9.4. 別ユーザログイン

ローカルキャッシュを取得した際のユーザと異なるユーザでのログインを行うと、 ACLや同期範囲設定の影響で、アクセス可能なオブジェクトへアクセスできない場合があります。

  • 具体例
    • ユーザAでアプリの利用を開始し同期実行後、ユーザBでログインし同期を行うケースを考えます。ユーザAにはアクセス権がなくユーザBにアクセス権があるオブジェクトが存在する場合、同期時にクライアントにはそのオブジェクトが送信されません。
    • ユーザ毎に同期範囲を変える設定にしていた場合、同期範囲設定がローカルキャッシュと異なる条件となってしまうため、同期範囲に使う ID を変更するのと同じ結果となります。
  • 解説
    • ユーザAで同期を行った際には、サーバ上でこのオブジェクトに更新があったとしてもクライアントには送信されません(ユーザAのアクセス権限がないため)。この後、ユーザBでログインして同期しても、当該オブジェクトの更新時刻は最終同期日時より古いため更新されていないとみなされ、同期されません。
  • 対策
    • 別ユーザでログインした場合、キャッシュは消すように実装してください。
    • あるいは、ユーザ単位で ACL の設定を変える場合、運用で異なるユーザでのログインを行わないように管理してください。

2.9.5. 論理削除

サーバ上で論理削除されたオブジェクトは、そのままでは物理的には削除されません。古くなったオブジェクトは定期的に削除する処置が必要です。

詳細は オブジェクト削除 を参照ください。

2.9.6. 補足: オフライン・同期アルゴリズムの解説

同期はバケット単位に実行されます。

バケット毎に「Pull」⇒「Push」処理が順に実行されます。 Pull / Push 処理ともに、更新データのみを同期する「差分同期」が行われます。

  • Pull 処理
    • Pull 処理では、サーバ上の更新データがクライアント側に転送、同期されます。
    • Pull 時には、サーバに対して a)「同期範囲内」かつ b)「更新時刻が最終同期日時以降」となるデータをクエリし、同期します。
      • 初回同期時は b) の条件は使用されません。
    • Pull 処理が行われた際、衝突処理も実行されます。
  • Push 処理
    • Push 処理では、クライアント上の更新データがサーバ側に転送されます。
    • ローカルキャッシュ上には、オブジェクト毎に更新フラグ(dirtyフラグ)があり、dirty 状態のオブジェクトのみがサーバに同期されます。
    • なお、Push 時には同期範囲は使用されません (全範囲同期)。