トランザクションのサポート - Amazon Cloud Directory

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

トランザクションのサポート

Amazon Cloud Directory では、実際の階層の変更を反映するために、新しいオブジェクトを追加したり、新しいオブジェクトと既存のオブジェクト間の関係を追加したりする場合があります。バッチ操作では、以下の利点を活用して、このようなディレクトリタスクを容易に管理できます。

  • バッチ操作では、ディレクトリに対するオブジェクトの読み書きに必要なラウンドトリップの数を削減し、アプリケーションの全体的なパフォーマンスを改善できます。

  • バッチ書き込みでは、SQL データベースと同等のトランザクションセマンティクスを利用できます。すべてのオペレーションは正常に完了します。または、いずれかのオペレーションが失敗すると、他のすべてのオペレーションも適用されません。

  • バッチ参照により、新規作成したオブジェクトへの参照を使用して、オブジェクトを関係に追加するなどの他のアクションを行い、書き込み操作の前の読み取り操作の使用に伴うオーバーヘッドを削減できます。

BatchWrite

バッチ書き込み操作では、ディレクトリに対する複数の書き込み操作を実行します。バッチ書き込みのすべてのオペレーションはシーケンシャルに実行されます。これは SQL データベーストランザクションのように機能します。バッチ書き込み内のオペレーションの 1 つに障害が発生しても、バッチ書き込み全体としてはディレクトリに影響しません。バッチ書き込みが失敗すると、バッチ書き込みの例外が発生します。例外には、例外のタイプとメッセージと共に失敗したオペレーションのインデックスが含まれます。この情報は、障害の根本原因を特定するのに役立ちます。

バッチ書き込みの一部として、以下の API オペレーションがサポートされています。

バッチ参照名

バッチ参照名は、中間バッチ操作の一部としてオブジェクトを参照する必要がある場合に、バッチ書き込みに対してのみサポートされます。たとえば、特定のバッチ書き込みの一環として、デタッチされている 10 個の異なるオブジェクトをディレクトリの別の部分にアタッチするとします。バッチ参照がないと、10 個のオブジェクト参照のすべてを読み取り、これらをバッチ書き込みの一環として再アタッチする際に入力として提供する必要があります。バッチ参照を使用すると、デタッチされているリソースをアタッチする際に識別できます。バッチ参照は、番号記号/ハッシュタグ記号 (#) を接頭辞とする任意の通常の文字列です。

次のコード例では、リンク名 "this-is-a-typo" のオブジェクトが、バッチ参照名 "ref" のルートからデタッチされています。後で、同じオブジェクトがリンク名 "correct-link-name" でルートにアタッチされています。オブジェクトは、バッチ参照に設定された子リファレンスを使用して識別されます。バッチ参照がないと、最初にデタッチされている objectIdentifier を取得して、それをアタッチ中に子リファレンスに提供する必要があります。バッチ参照名を使用してこの余分な読み取りを回避することができます。

BatchDetachObject batchDetach = new BatchDetachObject() .withBatchReferenceName("ref") .withLinkName("this-is-a-typo") .withParentReference(new ObjectReference().withSelector("/")); BatchAttachObject batchAttach = new BatchAttachObject() .withParentReference(new ObjectReference().withSelector("/")) .withChildReference(new ObjectReference().withSelector("#ref")) .withLinkName("correct-link-name"); BatchWriteRequest batchWrite = new BatchWriteRequest() .withDirectoryArn(directoryArn) .withOperations(new ArrayList(Arrays.asList(batchDetach, batchAttach)));

BatchRead

バッチ読み取り操作では、ディレクトリに対して複数の読み取り操作を実行します。次のコード例では、1 回のバッチ読み取りで参照 “/managers” を持つオブジェクトの子が、参照 “/managers/bob” を持つオブジェクトの属性と共に読み取られています。

BatchListObjectChildren listObjectChildrenRequest = new BatchListObjectChildren() .withObjectReference(new ObjectReference().withSelector("/managers")); BatchListObjectAttributes listObjectAttributesRequest = new BatchListObjectAttributes() .withObjectReference(new ObjectReference().withSelector("/managers/bob")); BatchReadRequest batchRead = new BatchReadRequest() .withConsistencyLevel(ConsistencyLevel.SERIALIZABLE) .withDirectoryArn(directoryArn) .withOperations(new ArrayList(Arrays.asList(listObjectChildrenRequest, listObjectAttributesRequest))); BatchReadResult result = cloudDirectoryClient.batchRead(batchRead);

バッチ読み取りでサポートされる API オペレーションは以下のとおりです。

バッチオペレーションの制限

サーバーへのリクエスト (バッチリクエストを含む) ごとに、リクエスト内のオペレーション数に関係なく、操作できるリソースの最大数が決められています。これにより、リソースの最大数を超えない限り、柔軟性の高いバッチリクエストを構成できます。リソースの最大数の詳細については、「Amazon Cloud Directory の制限」を参照してください。

制限は、バッチ内の各オペレーションの書き込みまたは読み取りを合計することで計算されます。たとえば、読み取り操作の制限は現在、API コールあたり 200 オブジェクトです。たとえば、バッチを構成して 9 個の ListObjectChildren API コールを追加し、各コールで 20 オブジェクトを読み取る必要があるとします。読み取りオブジェクトの合計数 (9 x 20 =180) は 200 を超えないため、このバッチ操作は成功します。

同じコンセプトが、書き込み操作の計算にも該当します。たとえば、現在の書き込み操作の制限は 20 です。バッチを設定して 2 つの UpdateObjectAttributes API コールを追加し、各コールで 9 個の書き込み操作を行う場合、これも成功します。いずれの場合も、バッチ操作が制限を超えると、オペレーションは失敗し、LimitExceededException がスローされます。

バッチ内に含まれているオブジェクトの数を計算するには、実際のノードと leaf_node オブジェクトの両方を含めるのが正しい方法です。パスベースのアプローチを使用してディレクトリツリーを反復処理している場合は、バッチ内で反復処理されている各パスも含める必要があります。たとえば、基本的なディレクトリツリーの次の図に示すように、オブジェクト 003 の属性値を読み込むため、オブジェクトの合計読み込み数は 3 になります。

Simple directory tree with root node 001 connected to leaf nodes 002 and 003 via paths 1 and 2.

ツリーを下方向に読み込む際のトラバース動作は次のようになります。

1. 001 オブジェクトを読み込み、オブジェクト 003 へのパスを決定します。

2. Path 2 まで下に移動します。

3. オブジェクトの読み取り 003

同様に、属性の数についても、オブジェクト 001 および 003 の数をカウントして制限に到達しないようにする必要があります。

例外処理

Cloud Directory でのBatch 操作が失敗し、エラーになる場合があります。このような場合、エラーの処理方法を知っておくことが重要です。エラーの解決方法は、読み取り操作と書き込み操作で異なります。

バッチ書き込み操作のエラー

バッチ書き込み操作が失敗すると、Cloud Directory はバッチ操作全体を失敗させて例外を返します。例外には、失敗した操作のインデックスと共に例外のタイプとメッセージが含まれます。RetryableConflictException と表示された場合は、エクスポネンシャルバックオフを使用してもう一度試すことができます。これを行うシンプルな方法としては、例外またはエラーが返されるたびに待機時間を倍化します。たとえば、最初のバッチ書き込み操作が失敗した場合は、100 ミリ秒待ってから、リクエストを再試行します。2 番目のリクエストが失敗したら、200 ミリ秒待ってから再試行します。3 番目のリクエストが失敗したら、400 ミリ秒待ってから再試行します。

バッチ読み取り操作のエラー

バッチ読み取り操作が失敗すると、レスポンスには成功応答または例外応答のいずれかが含まれます。個々のバッチ読み取り操作エラーでバッチ読み取り操作全体がエラーになることはありません。Cloud Directory は、操作ごとに成功応答または失敗応答を個別に返します。

Cloud Directory 関連ブログ記事