bumper sticker:
“There is no cloud, it’s just someone else’s computer.”─ クラウドなんて存在しない。それは誰かのコンピューターだ。
「ローカルファースト」という言葉を聞く機会があり、気になったので調べてみました。
この記事では入門的な内容をまとめます。
こちらの論文がとても読みやすいです。
当記事を完読していただけるなら、その後に読んでいただくのが良いかと思います。
https://www.inkandswitch.com/essay/local-first/
ローカルファーストとは
ローカルファーストとは「データの所有権は自分である」という思想に根付いた考え方のことです。
「ローカルファーストな設計」「ローカルファースト・アプリケーション」などの文脈で使用されます。
所有権が自分?当たり前では?と思われるでしょう。私ももちろんそう思いました。
しかし、本当にそうでしょうか?
クラウドファーストなあらゆるサービスでは、サーバーをデータソースとして持っています。
この時のデータの所有者は果たしてだれでしょうか。
- サービスを利用するユーザー
- サービスのプロバイダー
- データソースを保持するインフラ層のプロバイダー
データの所有者から最も遠いのは、考え方によってはユーザーかもしれません。
ローカルファーストな考え方は、自分のデータが他人の持ち物である違和感の解決と、ネットワークトラフィックを介さない圧倒的に高速なデータアクセスによるUX向上を目指しています。
「えっ、私のサービス遅すぎ…?」と感じたら、ローカルに所有権を移せるか検討してみるのもいいかもしれません。
ローカルファーストソフトウェアの7つの理想
論文によると7つの理想が提唱されています。
- スピナー不要(高速であること)
- マルチデバイスでの同期(ひとつのデバイスに閉じ込められない)
- オフライン動作(ネットワークは「オプション」である)
- 他ユーザーとのシームレスなコラボレーション
- 長期保存(ソフトウェアプロバイダーが倒産しても、データは私のもの)
- セキュリティとプライバシーの担保
- データの最終的な所有権と管理権はあなたである
それぞれの詳細については先ほどの論文をご確認ください(笑)
各項目の文量は多くないので、当記事での説明はしません!
オフラインファーストとの違い
よく混同され、一緒に解釈されるのがオフラインファーストですが、全く違うものです。
- オフラインファースト
- オフラインでの動作の担保に比重を置いた考え方
- ローカルファースト
- データの所有権・アクセスに比重を置いた考え方
この通り根底となる考え方が全く違う土俵のものですので、本来は並列なものではありません。
相反する思想
私が思うに、今まで当たり前のようにあった「Single source of Truth(信頼できる唯一の情報源)」の考え方に反している思想だと思います。
データソースがサーバーからローカルになりますので、別のノード(別デバイス・クラウド上のサーバー)に反映されるまでが即時とはいきません。
SSOTではなくなるため、要件を見極めて設計する必要があります。(ミスったら大火傷しそうですね)
クラウドファースト
- プライマリ:サーバー
- オプション:ローカル(フロントエンド側のキャッシュなど)
ローカルファースト
- プライマリ:ローカル
- オプション:サーバー(マルチデバイス同期のための中継地・共通設定など)
※一貫性(Consistency)に期待しない・担保がない
マルチデバイスへの対応(データの同期)
CRDTによるアプローチ
データの同期にはCRDTと呼ばれる方針が有名なようです。
筆者は深い理解には至っておりませんが、、
要するに「各ノードでの操作をどうやってマージするか?」のアルゴリズムのことらしいです。
CRDTの中にもいくつか種類があります。
- CmRDT:データに対するイベントを送りあってマージ
- CvRDT:各ノードレプリカ自体を送り合い、取り決めた判断基準(和集合なか、最大値なかなど)を元にマージ
こちらの記事を読ませていただきました↓
ミリしらの私でしたが、記事にもあるとおり「わかった気に」していただけました!
CRDT (Conflict-free Replicated Data Type)を15分で説明してみる
Tursoによるアプローチ
CRDTと並列なものではありませんが、データベース層から同期に対する課題を解決しているのがTursoCloudと呼ばれるDBaasを活用する方法です。
Tursoの概要
ザッと説明しますが、TursoはSQLiteをベースとしたDBソリューションです。
現在はRustで書き直され「Turso」という名の新しいDBMSを謳っています。
何といっても料金体系が明瞭で良心的です。
執筆時点では「Free<Developer<Scaler<Pro」と4プランがあり、下から2番目のDeveloperプランは5ドルにもかかわらず、DB数が無制限に作成できます。
TursoのEmbeddedReplica機能
Tursoでは表題の機能で、マルチデバイス間のデータ同期を解決します。
このようにユーザーごとにDBのレプリカをクラウドに同期します。
DBへのReadはローカルを利用しているのでもちろん早いですし、Writeはレプリカを同期するので、サーバーへの書き込みが必要ないということです。
SQLiteをベースとしておりDB数が無制限というのは、これを実現するためなんですね。
コードは以下のような感じです。
import { createClient } from "@libsql/client";
// 同期しないローカルデータ
// - デバイス内で複数のDBをもつことで同期しない選択も取れる
createClient({
url: 'file:local-only.db'
});
// 同期対象のデータ
createClient({
url: 'file:sync.db',
syncUrl: `turso://user-${userId}.turso.io`,
authToken: userToken,
syncInterval: 60 // 同期間隔
});
ローカルファーストなアプリケーションを構築する上で、有力な選択肢となるでしょう。
ローカルファーストのコミュニティ
2024年から「Local-First Conf」が海外で開催されています。
YouTubeに発表のプレイリストがあるので見放題です。
すごい!
以上です!!!
最後までお付き合いいただき、ありがとうございました🎉