コネクションプーリング
コネクションプーリング全般についてさらに詳しく学ぶには、必ずPrismaのデータガイドで、コネクションプーリングとは何か、何に対処しようとしているのか、そしてどのように機能するのかについての包括的な概要をご覧ください。
Accelerateはデフォルトで組み込みのコネクションプーリングを提供します。Accelerateを使用することで、何も設定せずにコネクションプーリングの利点を得られます。データベース接続の効率的な管理により、データベースは利用可能なデータベース接続を枯渇させることなくより多くのクエリを処理でき、アプリケーションの拡張性を高めます。
ただし、場合によっては、アプリケーションのパフォーマンスを最適化するために、コネクションプーリングをさらに構成することが有益な場合があります。
このドキュメントでは、Prisma Accelerateのコネクションプーリング機能に焦点を当てています。特にPrisma ORMの内部コネクションプールに関する詳細については、ORMのコネクションプーリングに関するドキュメントをご覧ください。
Accelerateでのコネクションプーリング
デフォルトでは、Accelerateの接続制限は10
です。これは、Prisma Accelerateが、Accelerateで使用されるPrismaスキーマごとに、データベースへのデータベース接続を最大10個まで開くことを意味します。スタータープランの場合、これも最大接続制限です。
ほとんどの場合、この接続制限で十分です。ただし、高トラフィックまたは高負荷のコンピューティング環境では、この値を増やす必要がある場合があります。Proプランのプロジェクトの場合、最大接続制限は100
です。Businessプランのプロジェクトの場合、最大値は1000
です。
コネクションプールサイズの構成
Prisma Accelerateを使用していない場合、接続文字列を介してPrisma ORMのコネクションプールを構成できます。Prisma Accelerateを使用している場合、この機能は利用できません。代わりに、プラットフォームプロジェクトでAccelerateのセットアップのConnection limit
設定を使用して、コネクションプールサイズを構成できます。
自動スケーリング
自動スケーリングにより、Accelerateはアプリケーションのトラフィックに基づいてリソースを動的に割り当てることができます。一貫した使用量が現在の接続制限に近づくと、Accelerateは増加した負荷を処理するために新しいリソースの割り当てを開始します。トラフィックが増加し続けると、Accelerateはさらにスケールアップします。逆に、トラフィックが減少すると、Accelerateはそれに応じてスケールダウンします。
より詳細なコンテキストを提供するために、Accelerateは、利用可能な総接続数を複数のクエリエンジンインスタンスに分散することにより、環境を水平方向にスケールします。例えば
- 環境の接続制限が1000に設定されている場合、Accelerateは複数のクエリエンジンインスタンス(例:100インスタンス)にスケールアップします。
- 次に、各クエリエンジンインスタンスには、総接続数の一部が割り当てられます。この場合、インスタンスあたり10接続です。
- これが、個々のクエリエンジンインスタンスが10の接続制限を報告する理由です。環境の総接続制限が1000であってもです。
このスケーリングメカニズムにより、クエリエンジンインスタンスの数を増やすことで、アプリケーションがより高いトラフィック負荷を処理できるようになり、コネクションプール管理を効率的かつ分散化された状態に保ちます。
自動スケーリングは、Accelerateの接続制限がデフォルト値より上に設定されている場合に有効になります。この機能はスタータープランでは利用できません。
Accelerateの接続制限の最大値は、Prisma Data Platformプランに基づいています。
プラン | 最大接続制限 |
---|---|
スターター | 10 |
Pro | 100 |
ビジネス | 1000 |
エンタープライズ | お問い合わせ |
コネクションプールタイムアウトの構成
コネクションプールタイムアウトは、クエリがAccelerateの内部コネクションプールからの接続を待機している間にブロックされる最大秒数です。これは、同時リクエスト数が接続制限を超えた場合に発生し、空き接続が利用可能になるまで追加のリクエストがキューイングされます。プールタイムアウト内に空き接続が利用可能にならない場合、例外がスローされます。コネクションプールタイムアウトは、値を0に設定することで無効にできます。
コネクションプールサイズと同様に、データベース接続文字列を介してコネクションプールタイムアウトを構成することもできます。この値を調整するには、データベース接続文字列にpool_timeout
パラメータを追加します。
例:
postgresql://user:password@localhost:5432/db?connection_limit=10&pool_timeout=20
pool_timeout
のデフォルト値は10
秒です。
クエリ制限の構成
Prisma Accelerateを使用する場合、Accelerate対応プロジェクト環境の設定タブから、最小および最大のクエリ応答サイズ、クエリ時間、およびトランザクション制限を構成できます。
クエリタイムアウト制限
Accelerateには、各クエリに対してデフォルトのグローバルタイムアウト10秒
があり、サブスクリプションプランに基づいて、クエリ時間というラベルのスライダーを使用して構成できます。
プラン | スターター | Pro | ビジネス |
---|---|---|---|
クエリタイムアウト | 最大10秒 | 最大20秒 | 最大60秒 |
詳細については、トラブルシューティングガイドと料金ページをご覧ください。
クエリタイムアウトを増やすことはできますが、データベースクエリが10秒以上かかる場合は、データベースクエリを検査して最適化することをお勧めします。これにより、長時間実行されるクエリは最適化の必要性を示唆していることが多いため、基盤となるデータベースへの負荷を軽減できます。詳細については、トラブルシューティングガイドをご覧ください。
インタラクティブトランザクションクエリタイムアウト制限
Accelerateには、各インタラクティブトランザクションに対してデフォルトのグローバルタイムアウト15秒
があり、サブスクリプションプランに基づいて、トランザクション時間というラベルのスライダーを使用して構成できます。
プラン | スターター | Pro | ビジネス |
---|---|---|---|
インタラクティブトランザクション制限 | 最大15秒 | 最大30秒 | 最大90秒 |
詳細については、トラブルシューティングガイドと料金ページをご覧ください。
Prismaコンソールでより高いインタラクティブトランザクションタイムアウトを設定する場合は、タイムアウトトランザクションオプションを介して、インタラクティブトランザクションクエリで一致するtimeout
値を必ず指定する必要があります。そうしないと、トランザクションは依然として低いデフォルト(たとえば、タイムアウト値が指定されていない場合は5秒の制限)でタイムアウトします。コードで30秒のタイムアウトを設定する方法の例を次に示します
await prisma.$transaction(
async (tx) => {
// Your queries go here
},
{
timeout: 30000, // 30s
}
);
インタラクティブトランザクションタイムアウト制限を増やすことはできますが、データベーストランザクションが15秒以上かかる場合は、データベーストランザクションを検査して最適化することをお勧めします。長時間実行されるトランザクションはパフォーマンスに悪影響を与える可能性があり、最適化の必要性を示唆していることがよくあります。詳細については、トラブルシューティングガイドを参照し、ドキュメントのインタラクティブトランザクションセクションの警告を確認してください。
応答サイズ制限
Accelerateには、デフォルトのグローバル応答サイズ制限5MB
があり、サブスクリプションプランに基づいて、応答サイズというラベルのスライダーを使用して構成できます。
プラン | スターター | Pro | ビジネス |
---|---|---|---|
クエリサイズ | 最大5MB | 最大10MB | 最大20MB |
詳細については、トラブルシューティングガイドと料金ページをご覧ください。
クエリ応答サイズを増やすことはできますが、実際に必要なデータ取得に制限することをお勧めします。これにより、データベースのパフォーマンスが向上し、データベースへの負荷が軽減され、フロントエンドアプリケーションの応答性が向上します。サイズが5MBを超えるクエリは、最適化の必要性を示唆していることがよくあります。詳細については、トラブルシューティングガイドをご覧ください。