4か月も前に。
FaunaDBはスケーラブルで、グローバルで、セキュアで、信頼性があり、強整合性を持っているとかいうすごいデータベースらしいですが、SQLを使うことができず独自言語を覚える必要があったりと導入の敷居が高く、結局マネタイズできずに終了してしまいました。
そのときFaunaをオープンソースにするよ!って言ってたのですが、約束をたがえず公開されました。
のですがー、びっくりするほど話題になっていないですね。
せっかくの高性能データベースがもったいないことです。
Welcome to FaunaDB
FaunaDBは、ドキュメントデータベースの柔軟性とリレーショナルデータベースの性能、強力な一貫性、グローバル分散DB、ACID特性、インターネットネイティブのHTTPS接続が一体となったオペレーショナルデータベースです。
Getting started with development
FaunaDBはJVMで動作しており、JDK version17が必要です。
またビルドツールとしてsbtを使用します。
FaunaDBは複数のサブプロジェクトからできており、本体は主に.extディレクトリに存在します。
プロジェクト構造を理解するには、build.sbtファイルを参照してください。
Basics
如何にFaunaDB固有のsbtの例を示します。
詳細についてはsbtのドキュメントを参照してください。
全てのコードをコンパイル・テストする。
$ sbt Test/compile
全てのテストを実行する。
$ sbt test
一部のテスト、特にマルチコアサブプロジェクトではループバックIPアドレスが複数必要です。
macOSでは次のコマンドでそれを設定可能です。
$ for i in {2..16}; do sudo ifconfig lo0 alias 127.0.0.$i up; done
特定のサブプロジェクトのテストを実行します。
$ sbt model/test
パターンに一致するテストを実行します。
$ sbt model/testOnly *DatabaseSpec
開発用に、テンポラリデータベースを実行します。
永続化がリセットされます。
$ sbt runCore
Building a release
リリース用のFaunaDBはひとつのfat JARにビルドされており、全ての依存が1ファイルに詰め込まれています。
暫定スクリプトmktarball.shを使うとリリースJARをビルドし、tarballを生成します。
その後のデプロイと運用方法についてはOPERATING.mdを参照してください。
Key concepts and features
Relational model
Faunaのデータモデルは、ドキュメントデータベースとリレーショナルデータベースの優れた点を両取りしています。
他のドキュメントデータベースと同様、データはJSON形式のドキュメントとして保存されるため、非構造化データの保存が可能であり、オブジェクトとテーブルの変換にORマッパーを使用する必要がありません。
Faunaは強力な一般性、リレーションシップのサポート、さらに時間経過に伴いスキーマを階層化して管理する機能など、リレーショナルデータベースの主要機能も提供します。
Faunaのドキュメントは、リレーショナルデータベースのテーブルに似た馴染みのあるコレクションで管理されます。
コレクションにはドキュメントタイプを指定することができ、これによりコレクションに含まれるドキュメントの構造を定義可能です。
この機能により、開発者は柔軟なスキーマから始め、アプリケーションの成熟に伴って徐々に構造化を導入することができます。
さらにFaunaは異なるコレクション間のドキュメントのリレーションシップもサポートしているため、データの重複なしに複雑なデータモデリングも可能となります。
このアプローチは、ドキュメントデータベースの扱いやすさと、リレーショナルデータベースの強力なモデリング機能を両立したものです。
Fauna Query Language
Fauna Query Language(FQL)はTypeScriptから着想を得た言語であり、Faunaのデータとクエリ操作に特化して設計された言語です。
簡潔でありながら、複雑な結合、データ変換などをサポートする表現力豊かなリレーショナルクエリ構文を提供します。
FQLは静的型付け機能のオプションも含まれており、早期にエラーを検出することでコード品質を向上させ、実行時の問題を軽減します。
FQLの大きな機能のひとつが、ユーザ定義関数を作成できることです。
これによって、開発者は複雑なビジネスロジックをデータベース内に直接カプセル化することができるため、明確な関心の分離と、コードの再利用の促進が可能となります。
FQLクエリの例を以下に示します。
-- Customerからメアドがaliceの1番目を取得
let customer = Customer.where(.email == "alice.appleseed@example.com")
.first()
-- 最初のOrderを取得。createdAt降順
Order.where(.customer == customer)
.order(desc(.createdAt)).
first() {
-- Customerを取得
customer {
name,
email
},
status,
createdAt,
items {
-- Productを取得、ネストしている
product {
name,
price,
stock,
-- Categoryを取得
category {
name
}
},
quantity
},
total
}
ルックアップ、結合、並び替え、データ投影などの複雑な操作をFQLで簡潔に表現できます。
Fauna Schema Language
Fauna Schema Language(FSL)は、データベーススキーマをコードして定義・管理します。
スキーマ変更のバージョン管理、CI/CDパイプラインとの統合、アプリケーションの進化に合わせた段階的なスキーマ運用が可能です。
データベーススキーマをコードして扱うことで、アプリケーションコードと同様データベースコードも厳格なテスト・レビュープロセスを適用することができます。
FSLクエリの例を以下に示します。
collection Customer {
name: String
email: String
address: {
street: String
city: String
state: String
postalCode: String
country: String
}
compute cart: Order? = (customer => Order.byCustomerAndStatus(customer, 'cart').first())
-- 計算フィールド
compute orders: Set<Order> = ( customer => Order.byCustomer(customer))
-- ユニーク制約
unique [.email]
index byEmail {
terms [.email]
}
}
フィールド、計算フィールド、一意性制約、インデックスを含んだCustomerコレクションを定義します。
*: Anyワイルドカードを使うとアドホックフィールドが許可され、必要に応じて構造を強制しながら柔軟性も確保できます。
Transactions and consistency
Faunaは全てのクエリがトランザクションであり、グローバルに分散されたリージョンであってもACID準拠が保証されます。
CalvinプロトコルをベースとするFaunaの文残トランザクションエンジンは、全てのクエリに対して厳密なシリアル化を提供し、読み取りクエリにはシリアル化可能な分離性を提供します。
Security and access control
Faunaはデータ保護・アクセス制御のための包括的なセキュリティ機能を提供します。
大まかな権限設定を行うロールベースアクセス制御RBACと、詳細で動的なアクセスルールを実現する属性ベースアクセス制御ABACの組み合わせにより、データのアクセスと変更が可能なユーザを柔軟かつ正確に制御可能です。
システムにビルトインされたユーザ認証機能のほか、サードパーティのIDプロバイダ統合もサポートしており、既存の認証システムを使うことができます。
Change data capture (CDC) and real-time events
変更データキャプチャ(CDC)機能により、リアルタイム機能を実現します。
コレクションやドキュメントに対して変更をサブスクライブし、イベントストリームを使用したPUSHアップデートもしくはevent feedsを使用したPULLアップデートを受け取ることができます。
ライブアプリケーションを最新状態に維持したり、リアルタイム同期を構築したり、変更を外部システムにミラーリングすることができます。
Database model
Faunaのデータベースモデルは、ステージングと本番環境など分離されたデータベースを容易に作成可能で、マルチテナントアプリケーションを安全に構築することができます。
License
ライセンスに基いてFaunaを利用可能です。
LICENSE.mdを参照してください。
感想
リレーショナルDBとドキュメントDBの利点を併せ持ち、柔軟性が高いうえにACID準拠と非常に優れた高性能なデータベースです。
さらにApacheライセンス2.0であり、商用利用も改変も再配布も可能という使いやすいライセンス体系です。
これで既存のデータベースを駆逐しなけりゃ嘘だよね。
実際は見てのとおり鳴かず飛ばずの閑古鳥、Issueもプルリクも4か月でわずか1件とたいへんにお寒い状況です。
よっぽど大物に突然見初められたりでもしないかぎり、将来性は全くないでしょう。
やはりエンジニアとかいう連中は流行に飛びついているだけであって、性能とか信頼性とかそういうのは本当はどうでもいいのでは?
あと調べていて気付いたのですが、この手の技術でありがちなベンチマークを調査してみた記事が全く見当たりませんでした。
見つけたのは2021年に書かれたServerless Battleground - DynamoDB vs Firestore vs MongoDB vs Cassandra vs Redis vs FaunaDBくらいでした。
ぱっと見かなり遅いように見えますが、他のデータベースはACID特性を犠牲にすることで高速化を実現しているので、これは仕方ないといえるでしょう。
従ってむしろRDBと比較するのが適切なベンチマークだと思うのですが、なぜかRDBとの比較は見つけられませんでした。
ということでオープンソースになって使いやすくなった高性能データベースFaunaDB、ぜひ導入してみてはいかがでしょうか。
私?
MySQL使うよ。
