2023年9月13日

Prisma Client用リードレプリカ拡張機能のご紹介

Prisma Client拡張機能である@prisma/extension-read-replicasを発表できることを嬉しく思います!この拡張機能を使用すると、Prisma Clientを使用して、トラフィックの多いワークロードのためにワークロードをデータベースレプリカに分散できます。ぜひお試しください

Introducing the Read Replicas Extension for Prisma Client

データベースレプリカとは何ですか?また、なぜそれらを使用するのですか?

データベースレプリカ(レプリカとも呼ばれます)は、プライマリデータベースと同じリージョンまたは異なるリージョンにあるプライマリデータベースインスタンスのコピーです。

データベースレプリケーションの主な用途の1つは、リードレプリカを作成することです。リードレプリカは、アプリケーションからの読み取りリクエストを分散し、書き込み操作のためにプライマリデータベースを予約できます。

サーバーからリードレプリカデータベースへの読み取り操作クエリフロー

サーバーからリードレプリカデータベースへの読み取り操作クエリフロー

サーバーからプライマリデータベースへの書き込み操作クエリフローと、リードレプリカデータベースへのデータ伝播

サーバーからプライマリデータベースへの書き込み操作クエリフローと、リードレプリカデータベースへのデータ伝播

レプリカはグローバルに分散でき、データをアプリケーションユーザーに近づけることができます。これにより、アプリケーションのリクエストに応答する際のレイテンシーを短縮できます。

レプリカのもう1つの貴重な利点は、データベースの回復力と信頼性が向上することです。これにより、プライマリデータベースが単一障害点になるのを防ぎます。データベースの障害、データ破損、またはプライマリオブジェクトのデータ損失が発生した場合、レプリカをプライマリオブジェクトに昇格させることができます。

ほとんどのデータベースプロバイダーは、リードレプリカをサポートしています。リードレプリカのサポートを提供するプロバイダーの例をいくつか示します。

Prisma Clientでリードレプリカを使用する

アプリケーションにリードレプリカを統合する方法は複数あります。アプリケーションからリードレプリカに接続する1つの方法は、Amazon Route 53などのDNSサービスを設定することです。これにより、単一の接続文字列が公開されます。次に、DNSサービスは、受信リクエストのボリュームに基づいてレプリカ間の負荷を分散します。

アプリケーションにリードレプリカを統合するもう1つの方法は、データレイヤー(たとえば、データベースドライバー、クエリビルダー、またはオブジェクトリレーショナルマッパー(ORM))を介して行うことです。この場合、データレイヤー、プライマリオブジェクト、およびレプリカに複数の接続文字列を提供できます。次に、データレイヤーは、クエリを適切なレプリカに転送することにより、リクエストの分散を調整します。

Node.jsエコシステムでは、Prismaはアプリケーションデータレイヤーを実装するための最も人気のあるライブラリの1つです。Prisma Clientでのリードレプリカのサポートは、最も要望の多い機能の1つです。

Prisma Client拡張機能でこれを実現する@prisma/extension-read-replicas拡張機能を発表できることを嬉しく思います!

内部的には、この拡張機能は、各データベースレプリカのPrisma Clientインスタンスを作成および管理します。デフォルトでは、この拡張機能は、各読み取りリクエストをランダムに設定されたレプリカにルーティングします。

@prisma/extension-read-replicasを使用してリードレプリカに接続する

@prisma/extension-read-replicasを利用するには、データベースプロバイダーでリードレプリケーションが設定されていることを確認してください。完了したら、リードレプリカで拡張機能を設定できます。

この記事の例では、Neonを使用してリードレプリカを作成して接続します。すでにレプリカが設定されている場合は、Prisma Clientを使用してリードレプリカを接続するに進んでください。

Neonリードレプリカを作成して接続する

Neon

Neonは、ストレージをコンピューティングから分離しているため、従来のPostgreSQLプロバイダーとは異なります。

最近、同リージョンリードレプリカをリリースしました。これは、リードレプリカのコンピューティングインスタンスを使用して、レプリカをスケールアップ、スケールダウン、またはゼロにスケールします。これは、Neonが他のプロバイダーよりもプライマリデータベースのリードレプリカをセットアップする方がはるかに高速であることを意味します。内部的には同じデータストレージを使用します。

コンピューティングインスタンスとは、プロジェクトの仮想化されたコンピューティングリソース(CPU、メモリ、ストレージなど)を提供するサービスです。Neonのリードレプリカの仕組みの詳細については、こちらのブログ記事を読むことをお勧めします。

この記事の残りの部分では、リードレプリカの設定にNeonを使用します。リードレプリカの設定には、別のプロバイダーを選択することもできます。

リードレプリカを作成するには、Neonダッシュボードに移動してサインインします。

  1. プロジェクトがない場合は、新規プロジェクトボタンをクリックして作成します。
  2. プロジェクトの詳細(プロジェクト名、PostgreSQLバージョン、リージョン)を入力します。プロジェクトの作成が完了すると、プロジェクトのダッシュボードにリダイレクトされます。
  3. プロジェクトダッシュボードのサイドバーでBranchesを選択します。
  4. データベースが存在するブランチを選択します。
  5. コンピューティングの追加を選択します。コンピューティングエンドポイントの作成ダイアログが表示されます。
  6. ダイアログで、コンピューティングとして読み取り専用を選択し、ワークロードのコンピューティングサイズを設定します。
  7. コンピューティングエンドポイントの設定が完了したら、作成をクリックします。

Neonでリードレプリカを作成する

次に、作成したばかりのリードレプリカの接続文字列を取得します。

  1. プロジェクトのダッシュボードに移動します。
  2. 接続の詳細で、データベースに接続するブランチ、データベース、およびロールを選択します。
  3. コンピューティングドロップダウンメニューで、作成した「読み取り専用」コンピューティングタイプのエンドポイントを選択します。
  4. コード例から接続文字列をコピーします。この接続文字列を使用して、リードレプリカに接続します。

Neonでリードレプリカに接続する

アプリケーションで、データベースレプリカの新しい環境変数を作成し、コピーしたばかりのNeonダッシュボードの値を貼り付けます。

@prisma/extension-read-replicasを使用してリードレプリカに接続する

アプリケーションでリードレプリカの使用を開始するには、プロジェクトに拡張機能をインストールします。

次に、既存のPrisma Clientインスタンスを拡張し、データベースレプリカをポイントすることにより、拡張機能を初期化します。

複数のレプリカを設定する場合は、上記の手順を繰り返して、追加のレプリカを作成できます。次に、アプリケーションのreadReplicas構成を次のように更新します。

以上です!

アプリを実行すると、拡張機能は、findManyなどのすべての読み取り操作をデータベースレプリカに送信します。複数のレプリカが定義されている場合は、レプリカがランダムに選択されます。

書き込みクエリ(createupdateなど)と、$transactionクエリは、データベースのプライマリオブジェクトに転送されます。これにより、結果の変更が既存のデータベースレプリカに伝播されます。

プライマリデータベースから読み取り、リードレプリカをバイパスする場合は、拡張機能は、拡張されたPrisma Clientインスタンスで$primary()メソッドを提供します。

このPrisma Clientクエリは、最新のデータを保証するために常にプライマリデータベースにルーティングされます。

Prisma Client拡張機能としてリードレプリカサポートを構築したのはなぜですか?

拡張機能を、当面の間、ORMの一部ではなく、別のパッケージとして持つことの大きな利点は、ORMリリースとは独立して拡張機能の改善を提供できることです。したがって、拡張機能がコミュニティのニーズを確実に解決できるように、APIを必要なだけ改良することができます。

別のパッケージ/リポジトリとして出荷することの副作用は、コードベースが比較的小さく、管理しやすい状態を維持することです。これにより、コミュニティメンバーはプルリクエストを作成して拡張機能を改善することで貢献できます。

Prisma Client拡張機能は、Prisma 4.16.0以降、一般提供されていますが、拡張機能を独自に構築した経験を活かして、Prisma Client拡張機能APIをさらに改善する機会としても活用しました。たとえば、5.2.0では、この拡張機能の準備として、Prisma Clientのコンストラクター構成からデータソース名を削除し、拡張機能が使用するプログラムによる接続文字列のオーバーライドを簡素化しました。クライアント拡張機能の将来の改善のために、さらにいくつかのGitHub issueを作成しました。これらの改善にご興味がある場合は、賛成票またはコメントを残してください。

ぜひお試しください

@prisma/extension-read-replicas拡張機能をお試しいただき、フィードバックをお待ちしております!🎉

このサンプルアプリをチェックして、@prisma/extension-read-replicas拡張機能を使用してリードレプリカを起動して実行する方法を学んでください。

Prisma Client拡張機能もお試しになり、TwitterまたはDiscordで作成したものを共有してください。🙌

次回の投稿もお見逃しなく!

Prismaニュースレターにサインアップ