Skip to content
Berktug Berke Ates
Berktug Berke Ates

ソフトウェアエンジニア

ブログ

モバイルアプリのオフライン優先同期コンフリクト

· 7分で読める

オフライン優先UXは継続性を約束し、同期は結果整合性を約束します。明示的なコンフリクトモデルがないと、ユーザーは重複アクション、失われた編集、機内でのみ再現するサポートチケットを見ます。

ユーザーが実際に当たるコンフリクトに名前を付ける

すべての衝突がマージ問題ではありません。重複意図もあります:不安定なトンネルで「支払い」を二度タップし、二つの振込をキューし、接続復帰時に調整する。別のデバイスから同じフィールドへの本当の編集もあります。同期層には別戦略が必要です—アクション用の冪等キー、状態用の構造化マージ。

スタッフチームはエンティティごとにコンフリクトクラスを文書化します:追記のみイベント、LWWスカラー、集合和、「人間必須」マージ。プロダクトが望む結果を説明できないなら、クライアントで推測すべきではありません。

正直なクライアントUXと退屈なサーバールール

ラストライトウィンは低リスク設定には十分;エスカレーションなしの金銭・在庫・医療メモには不可。どのデバイスが勝ち、何が捨てられ、ポリシーが許せばどう取り消すかの出所付きでサーバーマージ結果を見せます。

クライアント生成IDでミューテーションをキューし、リトライ安全APIを使います。サーバーは重複を認識し、副作用を二重適用せず元の結果を返すべきです。

  • ユーザー可視の各ミューテーションに冪等キー
  • プロダクト署名付きのエンティティ別コンフリクト方針
  • 両バージョンを見せるコンフリクト画面、静かな上書きではない
  • 同期バックログ指標:キュー深さ、経過時間、OS版別失敗率

コラボがプロダクトならCRDT

複数ユーザーがリアルタイムで共有成果物を編集する—ホワイトボード、リスト、共同メモ—とき、CRDTやOTは素朴なタイムスタンプに勝てます。コストは複雑さ、テスト負荷、より難しいサポート物語です。オフラインコラボがコア価値のとき採用し、ブログがかっこよかったからではありません。

CRDTでも認可、コンパクション、コールドスタートで無限履歴を再生しないスナップショット境界が必要です。

ラボ外で同期健全性を証明する

機内モード、時計ずれ、部分アップロード、キュー途中のアプリキルをシミュレートします。本番ではコンフリクト率、マージ失敗、ユーザー取り消しをサンプリング。リリース後のスパイクはしばしばスキーマや方針変更—「もっとオフライン」ではありません。

オフライン優先は信頼性機能です。同期を決済のように扱い:可観測、オーナー付き、マーケがどこでも約束する前にリハーサル。


2026年9月13日、Berktug Berke Ates が公開。