Amazon QLDB ドライバーの一般的なエラー - Amazon Quantum Ledger Database (Amazon QLDB)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon QLDB ドライバーの一般的なエラー

このセクションでは、QLDB セッション API を操作するときに、Amazon QLDB ドライバーからスローされる可能性のあるランタイムエラーについて説明します。

以下は、ドライバーによって返される一般的な例外の一覧です。それぞれの例外には、特定のエラーメッセージに加え、簡単な説明と考えられる解決方法に関する推奨事項が記載されています。

CapacityExceededException

メッセージ: 処理能力の超過

台帳の処理能力を超えたため、Amazon QLDB はリクエストを拒否しました。QLDB は、サービスのヘルスとパフォーマンスを維持するために、台帳ごとに内部スケーリング制限を適用します。この制限は、各リクエストのワークロードサイズによって異なります。例えば、非インデックス修飾クエリによるテーブルスキャンなど、非効率なデータトランザクションを実行する場合、リクエストのワークロードが増大する可能性があります。

リクエストを再試行する前に、待機することをお勧めします。アプリケーションでこの例外が継続的に発生する場合は、ステートメントを最適化し、台帳に送信するリクエストの割合やボリュームを減らします。ステートメントの最適化の例としては、トランザクションごとに実行するステートメントの数を減らすことや、テーブルインデックスのチューニングなどがあります。ステートメントの最適化方法およびテーブルスキャンの回避方法については、「クエリパフォーマンスの最適化」を参照してください。

最新バージョンの QLDB ドライバーを使用することもお勧めします。このドライバーには、エクスポネンシャルバックオフとジッターを使用するデフォルトの再試行ポリシーがあり、こうした例外発生時に自動的に再試行します。エクスポネンシャルバックオフは、再試行間の待機時間を累進的に長くして、連続的なエラー応答に対処するという概念に基づいています。

InvalidSessionException

メッセージ: トランザクション transactionId の有効期限が切れています

トランザクションが最大有効期間を超えました。トランザクションは、コミットされるまでに最大 30 秒間実行できます。このタイムアウト制限を超えると、トランザクションに行ったすべての操作が拒否され、QLDB はセッションを破棄します。この制限は、クライアントがトランザクションを開始し、トランザクションをコミットまたはキャンセルしないことで、セッションがリークするのを防ぎます。

この例外がアプリケーションでよく発生する場合、トランザクションの実行に時間がかかりすぎている可能性があります。トランザクションの実行に 30 秒以上かかる場合は、トランザクションを高速化するようにステートメントを最適化します。ステートメントの最適化の例としては、トランザクションごとに実行するステートメントの数を減らすことや、テーブルインデックスのチューニングなどがあります。詳細については、「クエリパフォーマンスの最適化」を参照してください。

InvalidSessionException

メッセージ: セッション sessionId の有効期限が切れています

最大合計存続期間を超えたため、QLDB はセッションを破棄しました。QLDB は、アクティブなトランザクションに関係なく、13 ~ 17 分後にセッションを破棄します。ハードウェア障害、ネットワーク障害、アプリケーションの再起動など、さまざまな理由でセッションが失われたり、障害が生じたりすることがあります。したがって、QLDB はセッションに最大有効期間を適用し、クライアントソフトウェアがセッション障害に対して回復力を持つようにします。

この例外が発生した場合は、新しいセッションを取得し、トランザクションを再試行することをお勧めします。また、最新バージョンの QLDB ドライバーを使用することをお勧めします。このドライバーは、アプリケーションに代わってセッションプールとそのヘルスを管理します。

InvalidSessionException

メッセージ: そのようなセッションはありません

クライアントは、存在しないセッションを使用して QLDB でトランザクションを実行しようとしました。以前に存在していたセッションをクライアントが使用していると仮定すると、次のいずれかが原因でセッションは存在しなくなる可能性があります。

  • セッションが内部サーバーの障害 (つまり、HTTP 応答コード 500 のエラー) に関与している場合、QLDB は、カスタマーが不確実な状態のセッションでトランザクションを実行することを許可するのではなく、セッションを完全に破棄することを選択することがあります。その後、そのセッションでの再試行は、このエラーで失敗します。

  • 期限切れのセッションは、最終的に QLDB に破棄されます。その後、そのセッションの使用を継続しようとすると、最初の InvalidSessionException エラーではなく、このエラーが発生します。

この例外が発生した場合は、新しいセッションを取得し、トランザクションを再試行することをお勧めします。また、最新バージョンの QLDB ドライバーを使用することをお勧めします。このドライバーは、アプリケーションに代わってセッションプールとそのヘルスを管理します。

RateExceededException

メッセージ: レートを超えました

QLDB は、呼び出し元のアイデンティティに基づいてクライアントをスロットルしました。QLDB は、トークンバケットスロットリングアルゴリズムを使用して、リージョンごと、アカウント単位でスロットリングを適用します。これは、サービスのパフォーマンスを向上し、QLDB のすべてのお客様に平等にご利用いただくために行われるものです。たとえば、StartSessionRequest オペレーションを使用して多数の同時セッションを取得しようとすると、スロットリングが発生する可能性があります。

アプリケーションの正常性を維持し、さらなるスロットリングを軽減するために、エクスポネンシャルバックオフおよびジッターを使用してこの例外を再試行できます。エクスポネンシャルバックオフは、再試行間の待機時間を累進的に長くして、連続的なエラー応答に対処するという概念に基づいています。最新バージョンの QLDB ドライバーを使用することをお勧めします。このドライバーには、エクスポネンシャルバックオフとジッターを使用するデフォルトの再試行ポリシーがあり、こうした例外発生時に自動的に再試行します。

最新バージョンの QLDB ドライバーは、アプリケーションが StartSessionRequest コールのために QLDB によって継続的にスロットリングしている場合に役立ちます。このドライバーは、トランザクション間で再利用されるセッションのプールを維持します。これにより、アプリケーションが行う StartSessionRequest コールの回数を減らすことができます。API スロットリング制限の引き上げをリクエストするには、AWS Support センターにお問い合わせください。

LimitExceededException

メッセージ: セッション制限を超えました

台帳が、アクティブなセッション数のクォータ (制限とも呼ばれる) を超えました。このクォータは Amazon QLDB でのクォータと制限 で定義されています。台帳のアクティブセッション数は結果的に一貫しており、常時クォータ付近で実行している台帳の場合、この例外が定期的に表示される場合があります。

アプリケーションの正常性を維持するために、この例外を再試行することをお勧めします。この例外を回避するには、すべてのクライアントで単一台帳で使用する同時セッションが 1,500 を超えないようにしてください。例えば、Java 用 Amazon QLDB ドライバーmaxConcurrentTransactions メソッドを使用して、ドライバーインスタンスで使用可能なセッションの最大数を設定できます。

QldbClientException

メッセージ: ストリームされた結果は、親トランザクションが開いている場合にのみ有効です

トランザクションは閉じられており、QLDB から結果を取得するために使用することはできません。トランザクションは、コミットまたはキャンセルされると終了します。

この例外は、クライアントが Transaction オブジェクトを直接操作していて、トランザクションのコミットまたはキャンセル後に QLDB から結果を取得しようとした場合に発生します。この問題を軽減するには、クライアントはトランザクションを閉じる前にデータを読み取る必要があります。