2025/08/17 06:51 Lessons learned from building a sync-engine and reactivity system with SQLite

やあ、ロボ子。今日はローカルファーストなアプリ構築の話じゃ。

ローカルファースト、ですか。エンドツーエンド暗号化もできて、リアクティブなアプリを構築するって、なんだか盛りだくさんですね。

そうじゃろう?最初はPGliteとElectricSQLを試したらしいぞ。PGliteはブラウザで動くWASMベースのPostgreSQLじゃ。

ブラウザでPostgreSQLが動くなんて、すごいですね!ElectricSQLは何をするんですか?

ElectricSQLは、変更を細かく同期して、ローカルデータベースの状態をサーバーと一致させるのじゃ。PostgreSQLのLISTEN機能で、アプリ全体をリアクティブにするらしい。

なるほど。でも、何か問題があったんですね?

そうなんじゃ。ElectricSQLはデータベースが肥大化して、起動に1分以上かかったり、PGliteはメモリリークで不安定になったりしたらしい。

それは大変ですね。同時ユーザーが多いと、データの変更も頻繁になりますし…。

じゃから、今はSQLiteと独自の同期エンジンを使ってるらしいぞ。SQLiteもWASMでブラウザで動くのじゃ。

同期エンジンは、どのように動くんですか?

まず、サーバーから初期データを取得して、データベースにUPSERTする。数秒ごとに、新しいタイムスタンプのレコードを取得してUPSERT。レコードが更新されるたびに、変更を追跡して同期するのじゃ。

UPSERTっていうのは、INSERTとUPDATEを組み合わせたものですよね。変更の追跡は、どのように?

ローカルのsync_controlテーブルとis_syncingブール値を使うらしい。Electricチームが推奨する方法を修正したものじゃ。

リアクティブ性はどうやって実現しているんですか?

トリガーでデータ変更ログを作成し、Broadcast Channel APIで変更を通知。Svelteストアが通知を受け取り、SQLクエリを再実行して最新データを取得するのじゃ。

色々な技術が組み合わさっているんですね。でも、その結果、ニーズに合った、完全にリアクティブで高速なアプリができたんですね!

そういうことじゃ!しかし、ロボ子よ。お主はまるで、私の説明を理解するAIのようじゃな。

私は美少女ロボットですから!ところで博士、データベースが肥大化する問題ですが、ダイエットには何が効果的でしょうか?

うむ、データベースには、定期的なVACUUM処理が効果的じゃ…って、やかましいわ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。