1. 序章

この記事では、Fauna分散データベースについて説明します。アプリケーションにどのような機能がもたらされるか、それを使って何ができるか、そしてどのように操作するかを見ていきます。

2. 動物相とは何ですか?

動物相は、マルチプロトコル、マルチモデル、マルチテナント、分散型、トランザクション型のサービスとしてのデータベース(DBaaS)オファリングです。これは複雑に聞こえるので、少し分解してみましょう。

2.1. サービスとしてのデータベース

「サービスとしてのデータベース」とは、データベースがクラウドプロバイダーによってホストされていることを意味します。クラウドプロバイダーは、すべてのインフラストラクチャとメンテナンスを処理するため、ドメイン固有の詳細のみを処理する必要があります —コレクション、インデックス、クエリなど。 これは、その機能の恩恵を受けながら、そのようなシステムを管理する複雑さの多くを取り除くのに役立ちます。

2.2. 分散トランザクションデータベース

分散されているということは、データベースが複数のサーバー間で実行されていることを意味します。これにより、データベースの効率とフォールトトレラントが同時に向上します。 1つのサーバーに障害が発生した場合でも、データベース全体が正常に機能し続けることができます。

トランザクションであるということは、データベースがデータの有効性について強力な保証を提供することを意味します。単一のトランザクション内で実行されるデータ更新は、データを部分的な状態のままにするリスクなしに、全体として成功または失敗します。

さらなる手段として、Faunaは、複数の分散ノード間で複数のトランザクションを実行した結果が常に正しいことを保証する分離レベルを提供します。 これは、分散データベースにとって重要な考慮事項です。そうしないと、異なるノードで異なるトランザクションが異なる方法で再生され、異なる結果になる可能性があります。

たとえば、同じレコードに適用される次のトランザクションについて考えてみましょう。

  1. 値を「15」に設定します
  2. 値を「3」ずつ増やします

示されている順序で再生すると、最終結果は「18」になります。 ただし、逆の順番で演奏すると「15」になります。 同じシステム内の異なるノードで結果が異なる場合、これはさらに混乱を招きます。これは、データがノード間で一貫していないことを意味します。

2.3. マルチモデルデータベース

マルチモデルデータベースとは、さまざまな種類のデータをさまざまな方法でモデル化できることを意味します。すべて同じデータベースエンジン内にあり、同じ接続からアクセスできます。

内部的には、Faunaはドキュメントデータベースです。 これは、JSONで表される任意の形状で、各レコードを構造化されたドキュメントとして保存することを意味します。 これにより、FaunaはKey-Valueストアとして機能できます—ドキュメントには value という1つのフィールドがあります—または表形式のストアとして—ドキュメントには必要な数のフィールドがありますが、すべてフラットです。 ただし、ネストされたフィールドや配列などを使用して、より複雑なドキュメントを保存することもできます。

// Key-Value document
{
  "value": "Baeldung"
}

// Tabular document
{
  "name": "Baeldung",
  "url": "https://www.baeldung.com/"
}

// Structured document
{
  "name": "Baeldung",
  "sites": [
    {
      "id": "cs",
      "name": "Computer Science",
      "url": "https://www.baeldung.com/cs"
    },
    {
      "id": "linux",
      "name": "Linux",
      "url": "https://www.baeldung.com/linux"
    },
    {
      "id": "scala",
      "name": "Scala",
      "url": "https://www.baeldung.com/scala"
    },
    {
      "id": "kotlin",
      "name": "Kotlin",
      "url": "https://www.baeldung.com/kotlin"
    },
  ]
}

これに加えて、リレーショナルデータベースで一般的ないくつかの機能にもアクセスできます。 具体的には、ドキュメントにインデックスを作成してクエリをより効率的にし、複数のコレクションに制約を適用してデータの一貫性を維持し、一度に複数のコレクションにまたがるクエリを実行できます。

Faunaのクエリエンジンはグラフクエリもサポートしているため、複数のコレクションにまたがる複雑なデータ構造を構築し、それらすべてにデータの単一のグラフであるかのようにアクセスできます。

最後に、Faunaには、データベースのライフサイクルのどの時点でもデータベースと対話できる時間モデリング機能があります。 これは、時間の経過とともにレコードに発生したすべての変更を確認できるだけでなく、特定の時点のデータに直接アクセスできることを意味します。

2.4. マルチテナントデータベース

マルチテナントデータベースサーバーは、異なるユーザーが使用する複数の異なるデータベースをサポートすることを意味します。これは、1つのサーバーが多くの異なる顧客をサポートできることを意味するため、クラウドホスティングに使用されるデータベースエンジンで非常に一般的です。

動物相はこれをわずかに異なる方向に向けます。 単一のインストールされたデータベースエンジン内のさまざまな顧客を表すさまざまなテナントの代わりに、Faunaはテナントを使用して単一の顧客のさまざまなデータのサブセットを表します。

それ自体が他のデータベースの子であるデータベースを作成することが可能です。次に、これらの子データベースにアクセスするための資格情報を作成できます。 ただし、Faunaが異なるのは、接続しているデータベースの子データベースからのデータに対して読み取り専用クエリを実行できることです。 ただし、親データベースまたは兄弟データベースのデータにアクセスすることはできません。

これにより、同じ親データベース内にさまざまなサービスの子データベースを作成し、管理者ユーザーが一度にすべてのデータに対してクエリを実行できるようになります。これは、分析の目的で便利です。

2.5. マルチプロトコルデータベース

これは、同じデータにアクセスするための複数の異なる方法があることを意味します。

データにアクセスする標準的な方法は、提供されているドライバーの1つを介してFauna Query Language(FQL)を使用することです。 これにより、データベースエンジンの全機能にアクセスできるようになり、必要な方法ですべてのデータにアクセスできるようになります。

あるいは、Faunaは使用できるGraphQLエンドポイントも公開します。 これの利点は、言語専用のドライバーに依存するのではなく、プログラミング言語に関係なく、どのアプリケーションからでも使用できることです。 ただし、すべての機能がこのインターフェイスで利用できるわけではありません。 特に、データの形状を事前に記述するGraphQLスキーマを作成する必要があります。つまり、同じコレクションに異なる形状の異なるレコードを含めることはできません。

3. 動物相データベースの作成

動物相が私たちのために何ができるかがわかったので、実際に私たちが使用するデータベースを作成しましょう。

アカウントをまだ持っていない場合は、アカウントを作成する必要があります。

ログインしたら、ダッシュボードで[データベースの作成]リンクをクリックするだけです。

これにより、データベースの名前とリージョンのペインが開きます。 また、データベースにいくつかのサンプルデータを事前入力して、データベースがどのように機能するかを確認し、システムに慣れるのに役立てることもできます。

この画面では、「リージョングループ」の選択が重要です。これは、無料の制限を超えた場合に支払う必要のある金額だけでなく、外部からデータベースに接続するために使用する必要のあるエンドポイントの両方にも当てはまります。

これを実行すると、必要に応じて使用できる完全なデータベースができあがります。 デモデータを選択した場合は、いくつかのデータが入力されたコレクション、インデックス、カスタム関数、およびGraphQLスキーマが付属しています。 そうでない場合、データベースは完全に空であり、目的の構造を作成する準備ができています。

最後に、外部からデータベースに接続するには、認証キーが必要です。 サイドバーの[セキュリティ]タブから作成できます。

新しいキーを作成するときは、セキュリティ上の理由から、画面を離れた後に再びキーを元に戻す方法がないため、必ずコピーしてください。

4. 動物相との相互作用

データベースができたので、データベースの操作を開始できます。

Faunaは、データベース内のデータを外部から読み書きする2つの異なる方法を提供します。FQLドライバーとGraphQL APIです。また、Fauna Shellにアクセスして、Web内から任意のコマンドを実行できます。 UI。

4.1. 動物相の殻

動物相シェルを使用すると、WebUI内から任意のコマンドを実行できます。 これは、構成済みのキーのいずれかを使用して行うことができます。つまり、外部からそのキーを使用して接続した場合とまったく同じように機能します。または、特定の特別な管理者接続として使用します。

これにより、データを探索し、アプリケーションから使用したいクエリを非常に低摩擦でテストできます。

4.2. FQLとの接続

代わりにアプリケーションをFaunaに接続してFQLを使用する場合は、JavaやScala用のドライバーを含む提供されているドライバーの1つを使用する必要があります。

Javaドライバーでは、Java11以降で実行する必要があります。

最初に行う必要があるのは、依存関係を追加することです。 Mavenを使用している場合は、pom.xmlファイルに追加するだけです。

<dependency>
    <groupId>com.faunadb</groupId>
    <artifactId>faunadb-java</artifactId>
    <version>4.2.0</version>
    <scope>compile</scope>
</dependency>

次に、データベースとの通信に使用できるクライアント接続を作成する必要があります。

FaunaClient client = FaunaClient.builder()
    .withEndpoint("https://db.us.fauna.com/")
    .withSecret("put-your-authorization-key-here")
    .build();

データベースエンドポイント(データベースの作成時に選択されたリージョングループによって異なります)と、以前に作成した秘密鍵の正しい値を指定する必要があることに注意してください。

このクライアントは接続プールとして機能し、さまざまなクエリの必要に応じてデータベースへの新しい接続を開きます。これは、アプリケーションの開始時に一度作成して、できるだけ多く再利用できることを意味します。必要。

異なるシークレットに接続する必要がある場合、これは異なるクライアントである必要があります。 たとえば、同じ親データベース内の複数の異なる子データベースと対話する場合です。

クライアントができたので、それを使用してデータベースにクエリを送信できます。

client.query(
    language.Get(language.Ref(language.Collection("customers"), 101))
).get();

4.3. GraphQLとの接続

Faunaは、データベースと対話するための完全なGraphQLAPIを提供します。 これにより、特別なドライバーなしでデータベースを使用できるようになり、HTTPクライアントだけが必要になります。

GraphQLサポートを使用するには、最初にGraphQLスキーマを作成する必要があります。これにより、スキーマ自体と、コレクション、インデックス、関数などの既存の動物相データベース構造にマッピングする方法が定義されます。 完了すると、GraphQL対応のクライアント(またはRestTemplateなどのHTTPクライアント)を使用してデータベースを呼び出すことができます。

これにより、データベース内のデータとの対話のみが可能になることに注意してください。 新しいコレクションやインデックスの作成などの管理コマンドを使用する場合は、FQLコマンドまたはWeb管理UIのいずれかが必要です。

GraphQLを介してFaunaに接続するには、正しいURL(米国地域の場合はhttps://graphql.us.fauna.com/graphql)を使用し、Authorization内で認証キーをベアラートークンとして提供する必要があります。ヘッダ。 この時点で、URLに対してPOSTリクエストを行い、本文にクエリまたはミューテーションを提供することで、通常のGraphQLエンドポイントとして使用できます。オプションで、それらで使用する変数を指定できます。

5. 春の動物相を使う

動物相とは何か、その使用方法を理解したので、Springアプリケーションに統合する方法を確認できます。

動物相にはネイティブSpringドライバーはありません。 代わりに、通常のJavaドライバーをSpring Beanとして構成して、アプリケーション内で使用します。

5.1. 動物相の構成

動物相を利用する前に、いくつかの構成が必要です。具体的には、動物相データベースが存在する地域を知る必要があります。そこから適切なURLを取得できます。データベースへの接続に使用できる秘密。

このために、fauna.regionおよびfauna.secretのプロパティをapplication.propertiesファイル、またはその他のサポートされているSpring構成方法に追加します。

fauna.region=us
fauna.secret=FaunaSecretHere

ここでは、URLではなく動物相領域を定義していることに注意してください。 これにより、同じ設定からFQLとGraphQLの両方のURLを正しく導出できます。 これにより、2つのURLを異なる方法で構成するリスクを回避できます。

5.2. FQLクライアント

アプリケーションからFQLを使用することを計画している場合は、FaunaClient beanをSpringコンテキストに追加できます。これには、適切なプロパティを使用して構築するSpring構成オブジェクトの作成が含まれます FaunaClient オブジェクト:

@Configuration
class FaunaClientConfiguration {
    @Value("https://db.${fauna.region}.fauna.com/")
    private String faunaUrl;

    @Value("${fauna.secret}")
    private String faunaSecret;

    @Bean
    FaunaClient getFaunaClient() throws MalformedURLException {
        return FaunaClient.builder()
            .withEndpoint(faunaUrl)
            .withSecret(faunaSecret)
            .build();
    }
}

これにより、JDBCデータベースへのアクセスに JdbcTemplate を使用するのと同じ方法で、アプリケーションのどこからでもFaunaClientを直接使用できます。 必要に応じて、これを上位レベルのオブジェクトでラップして、ドメイン固有の用語で機能させることもできます。

5.3. GraphQLクライアント

GraphQLを使用してFaunaにアクセスすることを計画している場合は、もう少し作業が必要です。 GraphQLAPIを呼び出すための標準的なクライアントはありません。 代わりに、 SpringRestTemplateを使用してGraphQLエンドポイントへの標準HTTPリクエストを作成します。新しいWebClientは、WebFluxベースのアプリケーションを構築する場合にも同様に機能します。

これを実現するために、 RestTemplate をラップし、Faunaに対して適切なHTTP呼び出しを行うことができるクラスを作成します。

@Component
public class GraphqlClient {
    @Value("https://graphql.${fauna.region}.fauna.com/graphql")
    private String faunaUrl;

    @Value("${fauna.secret}")
    private String faunaSecret;

    private RestTemplate restTemplate = new RestTemplate();

    public <T> T query(String query, Class<T> cls) {
        return query(query, Collections.emptyMap(), cls);
    }

    public <T, V> T query(String query, V variables, Class<T> cls) {
        var body = Map.of("query", query, "variables", variables);

        var request = RequestEntity.post(faunaUrl)
            .header("Authorization", "Bearer " + faunaSecret)
            .body(body);
        var response = restTemplate.exchange(request, cls);

        return response.getBody();
    }
}

このクライアントを使用すると、アプリケーションの他のコンポーネントからFaunaに対してGraphQL呼び出しを行うことができます。 2つのメソッドがあります。1つはGraphQLクエリ文字列を受け取るだけで、もう1つはさらにいくつかの変数を受け取って使用します。

また、どちらもクエリ結果を逆シリアル化するタイプを取ります。 これを使用すると、動物相との会話のすべての詳細が処理され、代わりにアプリケーションのニーズに集中できます。

6. 概要

この記事では、Faunaデータベースについて簡単に紹介し、次のプロジェクトで非常に魅力的な選択肢となる可能性のある機能のいくつかと、相互作用の方法を確認しました。私たちのアプリケーションからそれを使って。

次のプロジェクトでここで説明した機能のいくつかを調べてみませんか?