-
Movable tree CRDTs and Loro's implementation
-
背景
- 分散システムやコラボレーションソフトウェアで階層関係を管理することは複雑
- データ構造において削除と挿入を組み合わせて移動をモデル化する際、競合解決とユーザーの期待を満たすことが難しい
- たとえば、同じノードを別々の親へ同時に移動すると、同じ内容を持つ重複ノードが生成される可能性がある
-
移動可能なツリーにおける競合
- 移動可能なツリーの主な操作: 作成、削除、移動
- 同時操作の同期時に発生しうる競合:
- 同じノードが削除され、かつ移動される
- 同じノードが別のノードの配下へ移動される
- 別のノードが移動されて循環が発生する
- 祖先ノードが削除されている間に子孫ノードが移動される
-
同じノードの削除と移動
- 比較的解決しやすい
- 分散システムのタイムスタンプやアプリケーション固有の要件に応じて、一方の操作を適用し、もう一方を無視する
-
同じノードを別の親の配下へ移動
- 同時移動操作のマージはより複雑
- アプリケーションに応じてさまざまなアプローチを採用可能:
- ノードを削除し、別の親ノードの配下にコピーを生成する
- ノードが2つの親に接続されることを許可する(通常は許可されない)
- すべての操作を整列させて順次適用する
-
別のノードの移動によって循環が発生する場合
- 同時移動操作による循環の解決は複雑
- 複数の解決策:
- エラーを発生させる
- 循環ノードを特別な「タイムアウト」領域にレンダリングする
- サーバー側で移動操作を処理する
- トポロジカルソートを使用する
- 循環を引き起こすエッジを隠す
-
祖先ノードの削除と子孫ノードの移動
- 祖先ノードの削除時に子孫ノードの移動は見落とされやすい
- すべての子孫ノードを直接削除すると、データ損失と誤解される可能性がある
-
人気アプリケーションにおける競合処理方法
- Dropbox: ファイル移動を削除後の作成として処理していたが、データ損失のリスクがある
- Figma: 中央サーバーが循環を検出して操作を拒否し、一貫性を維持
-
移動可能なツリーCRDTs
- 中央集権的なソリューションの代わりにCRDTsを使用
- 初期のCRDTベースアルゴリズムは実装が難しく、ストレージオーバーヘッドも大きい
- 継続的な最適化により、一部のCRDTベースのツリー同期アルゴリズムは本番環境に適するようになった
-
複製されたツリーのための高可用な移動操作
- ツリーの3つの操作(作成、削除、移動)を移動操作に統合
- 移動操作は
Move t p m c として定義される
- ノード削除は
TRASH ノードへ移動することで処理
-
グローバルに整列された論理タイムスタンプ
- Lamportタイムスタンプを使用して、分散システムにおけるイベントの因果順序を決定
- 小さい数値ほどより早いイベントを意味する
-
リモート操作の適用
- 操作の安全性は、適用時のツリー状態によって異なる
- リモート更新を処理する際は、直近の操作を巻き戻し、新しい操作を挿入した後、巻き戻した操作を再適用する
-
CRDT: 可変ツリー階層
- 各ノードが過去のすべての親ノードを追跡し、カウンタを付与する
- 同期時に循環が発生した場合、最も近い履歴上の親ノードへ再接続する
-
Loroにおける移動可能なツリーCRDTsの実装
- Martin Kleppmannのアルゴリズムを実装し、高い性能を提供
Fractional Index アルゴリズムを統合し、子ノードの並び順を決定可能にした
-
子ノードの並び順における潜在的な競合
- 同じ位置に複数のノードを挿入すると、同一の
Fractional Index が割り当てられる可能性がある
PeerID を使用して、同じ Fractional Index を持つノード同士の相対順序を判断する
-
実装とエンコーディングサイズ
Fractional Index はノード順序を提供する
- エンコーディングサイズは最悪の場合に追加バイトが必要になるが、まれな状況である
-
関連作業
Fractional Index のほかにも移動可能なリストCRDTがある
Fractional Index は実装が簡単で、相対順序だけが必要な場合に有用
-
ベンチマーク
- Loroの移動可能なツリー実装の性能ベンチマークを実施
- リアルタイムコラボレーションとスムーズな履歴バージョンのチェックアウトをサポート可能
-
要約
- 移動可能なツリーCRDTs実装の難しさと、2つの革新的なアルゴリズムを紹介
- LoroはMartin Kleppmannのアルゴリズムと
Fractional Index を統合し、さまざまなアプリケーションシナリオに対応
-
GN⁺のまとめ
- 移動可能なツリーCRDTsは、分散システムで階層的データ構造を管理するうえで重要な役割を果たす
- Loroは高い性能と効率的な競合解決を提供し、リアルタイムコラボレーションアプリケーションに適している
Fractional Index を使って子ノードの並び順の問題を解決する
- 類似機能を持つ他のプロジェクトとしてFigmaとDropboxがある
1件のコメント
Hacker Newsの意見
新しいマルチプレイヤーエディタを開発中
React Table Libraryをオープンソースで提供している
アドバイスを求めている
Google Docs/Zoho Writerのような整形済みテキストコンテンツを扱う際にはツリー操作が必要
画像(ピクセル)や3Dモデルのようなデータ密集型アプリケーション向けに実用的なCRDTがあるのか気になっている
最初の段落がChatGPTの文体に似ていると思う