« 特別記念講演:「Webサービスの現場」 | メイン | Amazon Web Services Newsletter #10 »

[日本語訳]複数のオペレーションを1つにまとめる

以下、ECS 4.0のドキュメントの中にある「Combining Operation Requests」を和訳しました。この機能を使うと、複数(現在は2つまで)のリクエストを単一のリクエストとして実行できるので、1秒1コールのルールの範囲内で、実質的に2コールを行えます。

複数のオペレーションを1つのリクエストにまとめる

Amazon E-Commerce Service (ECS) に対しては、1秒間に1つ以上のリクエストを送信することはできません。できるだけ少ないリクエストで最大のアウトプットを得られるように、ECSにはリクエストをまとめる方法が2つあります。

  1. バッチ・リクエスト - 複数(現在は2までに制限されています)の同じオペレーションのリクエストを1つにまとめることができます。たとえば、書籍の検索とDVDの検索を1つのリクエストで同時に行うことができます。

  2. マルチオペレーション・リクエスト - 複数(現在は2までに制限されています)の異なるオペレーションのリクエストを1つにまとめることができます。たとえば、ItemLookupとItemSearchを1つのリクエストで同時に行うことができます。

バッチ・リクエストやマルチオペレーション・リクエストでは、以下に示すとおり、エラー処理に特別の配慮が必要になることに注意してください。

バッチ・リクエスト-1つのオペレーションに対する2セットのパラメータをまとめる

バッチ・リクエストでは、同じオペレーションを行う2つのリクエスト(サブリクエスト)を、ECSへの単一のリクエストとしてまとめます。バッチ・リクエストでは、サブリクエスト間でパラメータを共有することもできるので、同一の値を繰り返し設定する必要もありません。たとえば、「dog」という単語をタイトルに含む書籍とDVDを両方検索したい場合、Title=dogというパラメータ設定を共有パラメータにすることで、同じものを2度書かなくても済みます。

バッチ・リクエストの作成

  1. オペレーションに共通のパラメータ(ServiceOperationSubscriptionIdAssociateTag(任意))を準備します。バッチ・リクエストの場合、これらのパラメータはサブリクエストに関係なく共通になります。

  2. 共有パラメータを準備します。たとえば、2つのサブリクエストで書籍を検索するのであれば、SearchIndexパラメータにBooksを設定して、2つのサブリクエストで共有できます。

  3. 1つ目のリクエストに固有のパラメータを準備します。たとえば、著者名に「阿部和重」が含まれる書籍を検索するのであれば、Authorパラメータに%E9%98%BF%E9%83%A8%E5%92%8C%E9%87%8Dを設定します。

  4. 2つ目のリクエストに固有のパラメータを準備します。たとえば、タイトルに「対岸の彼女」が含まれる書籍を検索するのであれば、Titleパラメータに%E5%AF%BE%E5%B2%B8%E3%81%AE%E5%BD%BC%E5%A5%B3を設定します。

これまでの手順で作成されたリクエストはRESTでは次のようになります。

JP
http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService
    &SubscriptionId=[your subscription ID here]
    &Operation=ItemSearch
    &ItemSearch.Shared.SearchIndex=Books
    &ItemSearch.1.Author=%E9%98%BF%E9%83%A8%E5%92%8C%E9%87%8D
    &ItemSearch.2.Title=%E5%AF%BE%E5%B2%B8%E3%81%AE%E5%BD%BC%E5%A5%B3

RESTとSOAPのリクエストを構成する手順の詳細は以下のとおりです。

RESTでのバッチ・リクエスト

バッチ・リクエストでは、RESTのパラメータ定義は次のテーブルに示すように拡張されます。これによって、2つのオペレーションに対してパラメータを設定できるようになります。

バッチ・リクエストにおけるオペレーションのパラメータ(REST)

パラメータ説明
バッチ・オペレーションに直接指定されるパラメータ バッチ・リクエストにおいて、この種のパラメータに属するのは ServiceOperationSubscriptionId(必須)、および AssociateTag(任意)だけです。
Operation.1.Parameter 1つ目のリクエストに適用されるパラメータです。オペレーションに適用できる標準的なパラメータを指定できます。たとえば、ItemSearch.1.KeywordsSellerLookup.1.SellerIdなどと指定できます。
Operation.2.Parameter 2つ目のリクエストに適用されるパラメータです。オペレーションに適用できる標準的なパラメータを指定できます。たとえば、ItemSearch.2.KeywordsSellerLookup.2.SellerIdなどと指定できます。
Operation.Shared.Parameter 2つのサブリクエストで共有されるパラメータです。たとえば、ItemSearch.Shared.KeywordsSellerLookup.Shared.SellerIdなどと指定できます。

たとえば、2つのItemLookupオペレーションを、1つはASINを利用して、もう1つはEAN(JAN)コードを利用してそれぞれ行い、結果を同じXSLTスタイルシートにかけて整形したい場合、次のようなRESTリクエストを送信することになります。

バッチリクエストでItemLookupを行うときのパラメータ設定の例

パラメータValue
Operation ItemLookup
ItemLookup.1.IdType ASIN
ItemLookup.1.ItemId [取得したいASIN]
ItemLookup.2.IdType EAN
ItemLookup.2.ItemId [取得したいEANコード]
ItemLookup.2.SearchIndex Music
ItemLookup.Shared.Style [適用するXSLTスタイルシートへのURL]
ItemLookup.Shared.ResponseGroup Small,Offers

SOAPでのバッチ・リクエスト

SOAPでバッチ・リクエストを行う場合は、2つのサブリクエストの内容をそれぞれ別個のRequest要素の中に指定します。

共有パラメータはShared要素の中に指定します。

マルチオペレーション・リクエスト-2つの異なるオペレーションを1つのリクエストにまとめる

マルチオペレーション・リクエストでは、異なる2つのオペレーションを1つのリクエストにまとめることができます。2つのリクエストは並行して処理されます(連鎖的に動作するわけではありません)。つまり、1つ目のリクエストの検索結果を2つ目のリクエストのパラメータとして利用するような指定はできません。

RESTでのマルチオペレーション

マルチオペレーションのリクエストでは、バッチリクエストと同様に、RESTのパラメータ定義が拡張され、2つのオペレーションに対してパラメータを設定できるようになります。

マルチオペレーションに含まれるオペレーションは、Operationパラメータにカンマで区切って並べる形で指定します。

Operation=Operation1,Operation2

たとえば

Operation=ItemLookup,ListSearch 

のように指定すると、1つ目のサブリクエストがItemLookupで2つ目のサブリクエストはListSearchということになります。

1つ目のサブリクエストに指定するパラメータは、Operation1.1.parameterという形式で指定し、2つ目のサブリクエストに指定するパラメータは、Operation2.1.parameterという形式で指定します。

Operation=ItemLookup,ListSearch 

この場合、パラメータはItemLookup.1.parameter、およびListSearch.1.parameterという形式になります。

たとえば、ItemLookupListSearchを行う場合、RESTリクエストに対して次のようにパラメータを指定します。

マルチオペレーションでItemLookupとListSearchを行うときのパラメータ例(REST)

パラメータ
Operation ItemLookup,ListSearch
ItemLookup.1.IdType ASIN
ItemLookup.1.ItemId [取得するASIN]
ItemLookup.1.ResponseGroup Request,Medium,Variations
ListSearch.1.ListType WishList
ListSearch.1.Name [検索するものの名前]

リクエストをまとめたときのエラー処理

2つのリクエストを1つのリクエストにまとめると、2種類のエラーが発生する可能性があります。

エラーの種類結果
リクエストの構文エラー(例:レスポンスグループが不正、あるいはパラメータのつづりミス) 2つのオペレーションはどちらも処理されず、エラーになります。
リクエスト自体は正しいが、データが返されない(キーワードのつづりがおかしいなど) エラーになるほうのオペレーションにはErrors要素が含まれ、エラーの詳細が返されます。正しい処理が行われたリクエストの結果は正しく返されます。