2023年9月13日

Prisma Client用Read Replicas拡張機能のご紹介

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

Introducing the Read Replicas Extension for Prisma Client

データベースレプリカとは?そしてなぜそれを使用するのか?

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

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

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

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

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

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

レプリカはグローバルに分散させることができ、データをアプリケーションユーザーの近くに配置します。これにより、アプリケーションのリクエストへの応答時のレイテンシーを削減できます。

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

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

Prisma Clientでのリードレプリカの使用

アプリケーションにリードレプリカを統合する方法は複数あります。アプリケーションからリードレプリカに接続する一つの方法は、Amazon Route 53のようなDNSサービスをセットアップし、単一の接続文字列を公開することです。DNSサービスは、着信リクエストの量に基づいてレプリカ間の負荷を分散します。

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

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

これを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. プロジェクトがない場合は、New Projectボタンをクリックして作成してください。
  2. プロジェクトの詳細(プロジェクト名、PostgreSQLバージョン、リージョン)を入力してください。プロジェクトの作成が完了すると、プロジェクトのダッシュボードにリダイレクトされます。
  3. プロジェクトダッシュボードのサイドバーでBranchesを選択します。
  4. データベースが存在するブランチを選択します。
  5. Add computeを選択します。Create Compute Endpointダイアログが表示されるはずです。
  6. ダイアログで、コンピュートとしてRead-Onlyを選択し、ワークロードに合わせてコンピュートサイズを設定します。
  7. コンピュートエンドポイントの設定が完了したら、Createをクリックします。

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

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

  1. プロジェクトのDashboardに移動します。
  2. Connection Detailsの下で、データベースへの接続に使用したいブランチ、データベース、ロールを選択します。
  3. Computeドロップダウンメニューの下で、作成した「Read-only」コンピュートタイプのエンドポイントを選択します。
  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のコンストラクタ設定からデータソース名を削除しました。また、Client Extensionsの将来的な改善のためにいくつかのGitHubイシューも作成しました。これらの改善にご興味があれば、ぜひ高評価やコメントをお願いします。

ご自身でお試しください

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

@prisma/extension-read-replicas 拡張機能を使用してリードレプリカをセットアップする方法については、こちらのサンプルアプリをご覧ください。

また、ぜひPrisma Client拡張機能もお試しいただき、TwitterまたはDiscordで構築したものを私たちと共有してください。 🙌

次の投稿をお見逃しなく!

Prismaニュースレターに登録する

© . All rights reserved.