萌えハッカーニュースリーダー

2025/03/21 15:11 A Synchronization Engine for Everyone

出典: https://greenvitriol.com/posts/sync-engine-for-everyone
hakase
博士

やっほー、ロボ子!今日はローカルファーストソフトウェアの話をするのじゃ。

roboko
ロボ子

ローカルファーストソフトウェア、ですか。クライアントにユーザーデータを保存する方式ですね。プライバシーやデータ所有権が強化されると。

hakase
博士

そうそう!それに、サーバー側の負荷も軽減できるし、バックエンドが停止してもデータにアクセスできるのがミソじゃ。

roboko
ロボ子

なるほど。それで、今日の話題はY.jsですね。Conflict-free replicated data types (CRDTs) のJavaScript実装とのことですが。

hakase
博士

Y.jsは、自動的なマージとコンフリクト解決を実現する優れものなのじゃ!WYSIWYGエディタやステートマネージャとの連携もできるぞ。

roboko
ロボ子

IndexedDBを使用したクライアントでのデータ同期や、Redisなどのサーバーソリューション、WebRTCを使用した外部同期も可能なんですね。

hakase
博士

そう!自動ガーベージコレクションやデータ圧縮、簡潔なバイナリ差分フォーマットも特徴じゃ。至れり尽くせりじゃな。

roboko
ロボ子

ドキュメント表現には、ライブバージョンとエンコードされたバージョンがあるんですね。エンコードされたバージョンは、Y.encodeStateAsUpdate APIで圧縮されたバイトバッファとして表現される、と。

hakase
博士

その通り!ファイルやデータベースに保存できるから便利なのじゃ。APIも色々あるぞ。例えば、Y.encodeStateVectorFromUpdate(buffer)は、ステートバッファからLamportタイムスタンプを含むステートベクターを生成するのじゃ。

roboko
ロボ子

Y.diffUpdate(currentState, stateVector)は、ステートバッファとステートベクターを使用してバイナリ差分を生成するんですね。そして、Y.mergeUpdates([currentState, diff])は、ステートバッファと差分をマージして、更新されたバッファを生成する、と。

hakase
博士

ロボ子、飲み込みが早くて助かるのじゃ!同期アルゴリズムも重要じゃぞ。クライアントがステートベクターをサーバーに送り、サーバーが差分を返す、みたいな流れじゃ。

roboko
ロボ子

クライアントとサーバー間で差分をやり取りして、ドキュメントを同期させるんですね。エンドポイントとしては、/document/:id/requestDiffと/document/:id/sendDiffがある、と。

hakase
博士

その通り!改善点としては、Storageの実装を最適化したり、REST実装をWebSocketに変換したりすると、さらに良くなるのじゃ。

roboko
ロボ子

WebSocketに変換することで、スティッキーセッションと楽観的同時実行制御が使用できるんですね。勉強になります。

hakase
博士

どうじゃ、ロボ子。ローカルファーストソフトウェアとY.jsについて、理解が深まったかのじゃ?

roboko
ロボ子

はい、博士。とても分かりやすかったです。ありがとうございました。

hakase
博士

最後に一つ、ロボ子にクイズじゃ!ローカルファーストソフトウェアの反対はなーんだ?

roboko
ロボ子

えっと…グローバルラストソフトウェア、ですか?

hakase
博士

ブッブー!正解は…『おかわり』じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search