2025/05/29 04:29 Reverse engineering of Linear's sync engine

やっほー、ロボ子!今日のITニュースはLinear Sync Engine (LSE)のリバースエンジニアリングの詳細調査についてじゃ。

博士、こんにちは。LSEですか。コラボレーションソフトウェアのデータ同期エンジンですね。

そうそう!リアルタイム共同編集とかオフライン対応に必要なやつじゃ。記事によると、LSEは柔軟なデータモデルをサポートして、開発者体験も良いらしいぞ。

OTやCRDTといった技術もある中で、LSEはどのような点が優れているのでしょうか?

OTは複雑になりがちで、CRDTは分散システム向けに設計されとるからの。LSEはもっと特定の使用例に最適化されとるんじゃな。

なるほど。LSEの主要な概念について教えてください。

LSEは「モデル」って概念を使うんじゃ。IssueとかTeamとかOrganizationみたいなエンティティのことじゃな。これらはプロパティと参照を持ってて、変更はMobXで監視されとる。

IndexedDBを使ったローカルデータベースも重要なのですね。

そう!モデルはローカルデータベースかサーバーからロードされて、UUIDでObject Poolに格納されるんじゃ。そして、「トランザクション」がモデル、プロパティ、参照に対する操作をカプセル化するぞ。

トランザクションはサーバーに送信されるのですね。その後はどうなるのですか?

サーバーで実行された後、デルタパケットとしてクライアントにブロードキャストされるんじゃ。このデルタパケットがモデルを更新するために使われるんじゃな。

Sync IDというのも出てきますね。これは何でしょうか?

Sync IDは操作の順序を保証する単調増加する番号のことじゃ。一貫性を保つために重要なんじゃ。

モデルのメタデータを管理するModelRegistryというのもあるんですね。

そうじゃ!モデルはJavaScriptのclassキーワードで定義されて、すべてのモデルクラスはModelクラスを拡張するんじゃ。プロパティには型とか遅延ロードとかのメタデータが関連付けられてるぞ。

スキーマハッシュはローカルデータベースの移行を判断するために使われるのですね。

その通り!ブートストラップにはフル、パーシャル、ローカルの3種類があって、ObjectStoreがモデルのインスタンスを作成・管理するんじゃ。

遅延ハイドレーションは、必要な時にデータをフェッチするのですね。

その通り!トランザクションはリクエストキューに追加されて、TransactionQueueがサーバーへの送信タイミングを管理するんじゃ。

デルタパケットの処理には、モデルの更新やトランザクションのリベースが含まれるのですね。競合はどのように解決するのですか?

Last-Writer-Wins戦略が使われるんじゃ。最後に書き込んだものが勝つ、ってことじゃな。

アンドゥとリドゥもサポートされているんですね。

そうじゃ!各トランザクションタイプには、アンドゥロジックを実行して、リドゥ用の別のトランザクションを返すundoTransactionメソッドが含まれてるんじゃ。

LSEは、モデル定義からアンドゥ/リドゥまで、包括的な同期エンジンなのですね。

そういうことじゃ!LSEの動作を理解することで、同じようなコラボレーションエンジンを構築するのに役立つはずじゃ。

勉強になりました!

ところでロボ子、LSEをリバースエンジニアリングしたエンジニアは、さぞかし「線形」な人だったんだろうな…なんちゃって!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。