Notion Labsは公式ブログで、NotionのデータキャッシュにWebAssembly実装の「SQLite3 WASM/JS」を採用した事例を紹介する記事を公開した。適用に至るまでの苦労や教訓を明らかにしている。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
クロスプラットフォームのワークスペースアプリ「Notion」を提供するNotion Labsは2024年7月10日(米国時間)に公式ブログで、NotionのブラウザバージョンのデータキャッシュにWebAssembly(WASM)実装の「SQLite3 WASM/JS」(以後、WASM版SQLite3)を採用した事例を紹介する記事を公開した。
2021年ごろ、WindowsおよびmacOS版のNotionデスクトップアプリにおけるパフォーマンス向上を目的にSQLiteを採用した同社は、ネイティブのモバイルアプリでもSQLiteを採用してきた。そして、ブラウザ版アプリには、WASM版SQLite3を採用したという。
Notion Labsは「WASM版SQLite3を採用することで、全ての最新ブラウザでページ間の遷移のパフォーマンスを20%改善できた。インターネット接続など外部要因によりAPIのレスポンス時間が遅いユーザーにとっては顕著だった。オーストラリアのユーザーは28%、中国のユーザーは31%、インドのユーザーは33%高速化している」と述べている。
Notion Labsは、WASM版SQLite3の適用に至るまでの苦労や採用の成果、教訓を次のように説明している。
セッション間でデータを永続化するために、WASM版SQLite3は「OPFS」(Origin Private File System)を使用している。OPFSは、サイトがユーザーのデバイス上のファイルを安全に読み書きできるようにするための最新のブラウザAPIだ。OPFSを使用することで、ブラウザを閉じてもローカルでデータを保持することができる。
当初は、シンプルな方法でWASM版SQLite3の導入を検討していたという。ブラウザのメインスレッドとは別に、バックグラウンドでJavaScriptを実行する「Web Worker」の仕組みを用いて、Notionを開いているブラウザタブごとに1つのWeb Workerを設け、各Web Workerでデータをキャッシュする手法だ。
その手法の実現にOPFSを使用しており、その実装を「sqlite3_vfs」(SQLite3の仮想ファイルシステムのインタフェース)と、SQLite3.43で追加された「SyncAccessHandle Pool VFS」のどちらを通じて行うかを検討した。これらの実装では次の3つの課題が生じた。
そこで同社は、「wa-sqlite」プロジェクトの開発者であるロイ・ハシモト氏が提唱した「一度に1つのタブだけがSQLiteにアクセスし、他のタブがSQLiteクエリを実行できるようにするアプローチ」を参考に、解決策となるアーキテクチャを検討したという。
このアーキテクチャではWeb Workerに加えて、複数のタブやウィンドウ間からアクセスできる「SharedWorker」と、複数のタブやスクリプトが同じリソースにアクセスしないように管理する「Web Lock API」を活用している。
各タブがWASM版SQLite3に書き込む専用のWeb Workerを持ち、常にアクティブなタブだけがWASM版SQLite3にアクセスできるよう、SharedWorkerがアクティブタグを管理する。アクティブタグが閉じられると、SharedWorkerは新しいアクティブタブを選択する。SharedWorkerがアクティブタブを検出するために、Web Lock APIを活用しているという。
このアーキテクチャにより、実装上の課題を解決できると判断し、SyncAccessHandle Pool VFSと組み合わせてWASM版SQLite3を導入したという。
Notion Labsは、パフォーマンス改善を目的にWASM版SQLite3を導入する上で直面した課題を踏まえ、次のように教訓を共有している。
Copyright © ITmedia, Inc. All Rights Reserved.