Cloud for AWS プロトコル

VuGen の Cloud for AWS プロトコルは,Amazon Web Services の Simple Queue Service(SQS)の使用状況を監視する仮想ユーザ・スクリプトの作成に使用されます。

このトピックの内容:

SQS について

Amazon SQS は,完全マネージド型メッセージ・キューイング・サービスを使用して,アプリケーション・コンポーネントがクラウド内で通信できるようにする AWS のサービスです。分散メッセージング・システムにより,プロデューサとコンシューマの分離が可能になります。

エンドツーエンドのプロデューサとコンシューマが複数存在する可能性があり,メッセージは複数のサーバ上で冗長的に複製される可能性があります。すべてのメッセージの送受信は柔軟な設定が可能です。

SQS メッセージの基本的なフローは次のとおりです。

キューへのメッセージ送信 プロデューサは,SendMessage 呼び出しを介してキューにメッセージを送信します。
メッセージの保存 メッセージは,MaximumReceiveCount または MessageRetentionPeriod までキューに保存されます。
キューからのメッセージ受信 コンシューマは,ReceiveMessage 呼び出しを介してキューからメッセージを受信します。
メッセージが処理中 メッセージが「処理中」であり,VisibilityTimeout 内に処理されます。
キューからのメッセージの削除 メッセージが DeleteMessage 呼び出しを介してキューから削除されます。

SQS の操作の詳細については,Amazon の Web サイトの SQS ドキュメントを参照してください。

先頭に戻る

SQS のための Cloud for AWS プロトコル

VuGen の Cloud for AWS プロトコルを使用すると,SQS ベースのシステムの監視と負荷テストを行うためのスクリプトを記述できます。Cloud for AWS スクリプトが LoadRunner Controller で実行されると,送受信の両方のメッセージのやりとりに関する特定のメトリックを収集できます。

Cloud for AWS プロトコルは,Java の標準規約を使用した Java のスクリプト作成をサポートしています。すべての標準 Java メソッドに加えて,SQS 固有の API セットも利用できます。

VuGen は,独自のクラスを使用して SQS クラスを表します。キューを操作するメイン・クラスは LrSqsClient です。LrSqsClient はプロデューサおよびコンシューマとして機能し,ユーティリティ機能も備えています。

SQS クライアントおよび SQS 固有のオブジェクトに加えて,補助クラスが複数あります。SQS のクラスと関数の詳細については,関数リファレンス(該当するバージョンを選択) の 「Cloud for AWS functions」を参照してください。

先頭に戻る

SQS キュータイプ

Cloud for AWS プロトコルは,標準(標準設定)と FIFO(先入れ先出し)の両方のタイプの SQS キューをサポートします。これらのキューには次の属性があります。

  標準キュー FIFO キュー
スループット

秒ごとの API 呼び出し数は無制限。

秒ごとの API 呼び出しは 300,呼び出しごとの最大メッセージ数は 10 - つまり,秒ごとの最大サポートメッセージ数は 3000。

高スループット・モード(秒ごとのメッセージが最大 30,000)に切り替えることもできます。

グループ メッセージ・グループはサポートされていません。

複数のグループをサポート。各メッセージにはグループ ID が必要です。

順序

メッセージの順序が保証されません。

同じグループ内での順序が保証されます(ただし,キュー全体では保証されません)。

配信

メッセージは少なくとも 1 回配信され,複数回配信される可能性もあります(したがって,コンシューマは冪等性を持つ必要があります)。

メッセージは,重複排除 ID(手動で指定するか,メッセージ・コンテンツの MD5 ハッシュを使用)を使用して,1 回だけ配信されます。

先頭に戻る

主なキュー識別子

以下では,VuGen が Cloud for AWS プロトコルの SQS API で使用する主な識別子の一部について説明します。

識別子 説明
キュー URL

キューを識別するために SDK 内で使用される URL。URL を得るには,Amazon コンソールを開いてキューを選択し,[URL]フィールドをコピーします。

この情報は SQS クライアントに入力されるため,クライアントは,使用可能なキューを決定するリージョンと正確なキュー URL の両方で初期化されます。

表示タイムアウト

メッセージが他のコンシューマから非表示になる期間。

詳細については,「表示タイムアウト」を参照してください。

メッセージ保持

メッセージが処理されない場合にキューに留まる時間。指定可能な範囲は 1 分から 14 日までです。

標準設定:4 日

配信遅延

送信要求からメッセージが実際にキューに追加されるまでの時間(キューおよび個々のメッセージに対して設定可能)。

メッセージ受信待機時間

ReceiveMessage 呼び出しがメッセージを待つ時間(秒単位)。メッセージがない場合は,待機時間後にメッセージなしで返されます。

指定可能な範囲は 0 ~ 20 秒です。

標準設定:0

ReceiveCount と最大受信数

メッセージが削除されずに受信されるたびに,その ReceiveCount が増加します。メッセージの ReceiveCount がキューに設定された最大受信数の値に達すると,メッセージは自動的にデッドレター・キューに送信されます。

これにより,メッセージをデバッグする方法が提供されます。デッドレター・キューから未処理のメッセージを取り出して,何が問題だったかを確認できます。

MessageGroupId

(FIFO メッセージのみ)

メッセージが属するグループを定義します。

DeduplicationScope

(FIFO キューのみ)

重複排除の範囲がメッセージ・グループごと(より高速な方法)か,キューごとか。

FifoThroughputLimit

(FIFO キューのみ)

キュー内のメッセージのスループット制限がキューごとに設定されるか,メッセージ・グループ(MessageGroupId)ごとに設定されるか。

高スループットを実現するには,MessageGroupId に設定します。

表示タイムアウト

コンシューマが SQS に新しいメッセージをポーリングすると(ReceiveMessage 要求),メッセージがキューから選択され,コンシューマに返されます。ただし,メッセージはキューから自動的に削除されません。メッセージがコンシューマによって処理されている間,他のコンシューマがメッセージを再度処理するのを防ぐために,SQS は[表示タイムアウト]を設定します。

表示タイムアウト中,メッセージはそのコンシューマにのみ表示されます。コンシューマは,表示タイムアウト期間内に DeleteMessage を呼び出して,処理が終了したことを通知する必要があります。その後,メッセージはキューから削除され,他のコンシューマに表示されることはありません。コンシューマがメッセージを削除する前に表示タイムアウトの期限が切れると,メッセージは他のコンシューマに表示されて受信できるようになります。

標準の表示タイムアウトは 30 秒です。たとえば,あるメッセージにより多くの処理時間が必要だと思われる場合は,そのメッセージに対して表示タイムアウト時間を変更できます。

注: 標準キューにはメッセージの複製が含まれる可能性があるため,元のメッセージが処理されて削除された後でも,コンシューマは複製の 1 つを受信する可能性があります。

表示タイムアウトがまだ有効である間,他のコンシューマからの ReceiveMessage 要求の処理は次のようになります。

  • 標準キュー:コンシューマは別の利用可能なメッセージを受け取ります(順序は保証されません)。

  • FIFO キュー:コンシューマは別のメッセージ・グループからメッセージを受信します。同じメッセージ・グループ内にのみメッセージが存在する場合,順序を保証するためにメッセージがブロックされます。

    注: SQS では,メッセージを受信するメッセージ・グループを選択することはできません。特定のグループから受信するには,手動でフィルタリングする必要があります。

先頭に戻る

スクリプトの作成と編集

VuGen エディタとスクリプト・デザイナを使用して,Cloud for AWS SQS スクリプトを作成できます。

スクリプトを作成する前に,次の手順を実行します。

  • Java 環境をセットアップします。詳細については,「Java プロトコル用の環境のセットアップ」を参照してください。

  • VuGen の Cloud for AWS API を使用して,SQS クライアントを初期化し,クライアントを閉じます。

  • スクリプト名またはパスに非 ASCII 文字が含まれていないことを確認します。

スクリプトを生成するには,次の手順を実行します。

  1. VuGen で,Cloud for AWS スクリプトを開きます。
  2. ツールバーで,[スクリプトのデザイン](Ctrl+R)をクリックして,[スクリプトデザイナ]ウィザードを開きます。
  3. 初期化]セクションで,リージョンを選択し,URL を指定し,キューが FIFO モードを使用するかどうかを指定します。[保存]をクリックします。ウィザードが,右側のペインのアクションのリストに[初期化]ステップを追加します。
  4. 左側のペインでアクションを選択し,関連する詳細を入力します。フィールドにカーソルを合わせると,右側のペインの下部にヒントが表示されます。[属性]セクションで,[+]をクリックして新しい属性を追加します。[保存]をクリックして,スクリプトにコードを追加します。ウィザードが,右側のペインのアクション・リストにステップを追加します。

  5. ビルトイン・アクション・ペインを使用してトランザクションと思考遅延時間を追加します。
  6. 右側のペインでアクションの順序を確認します。リスト内の位置を変更するには,アクションをドラッグします。アクションの内容を編集するには,ダブルクリックします。

  7. 生成]をクリックします。VuGen がエディタ・ウィンドウにスクリプトを表示します。
  8. 必要に応じて,追加のカスタム Java コード・スニペットをスクリプトの関連メソッドにコピーします。すべての初期化を init メソッドに追加し,クロージャを end メソッドに追加します。詳細については,「スクリプトのクラスとメソッド」を参照してください。

    注: Cloud for AWS スクリプトは,スケーラブルなマルチ・スレッド・アプリケーションとして実行されます。含めるコードがスレッドセーフであることを確認してください。詳細については,「Java プロトコルのプログラミングに関するヒント」を参照してください。

  9. ランデブー・ポイント,出力メッセージなどの要素でスクリプトを強化します。詳細については,「Java のスクリプトの拡張」を参照してください。

先頭に戻る

スクリプトのクラスとメソッド

Cloud for AWS スクリプトを使用する場合は,すべてのコードを Actions クラスに配置します。このクラスは,VuGen でスクリプトを開いたときに表示されます。Actions クラスには,initactionend の 3 つのメソッドが含まれています。

次の表に,各メソッドに何を含める必要があり,各メソッドがどのタイミングで呼び出されるかを示します。

スクリプトのメソッド
メソッド実行のタイミング
詳細
init
仮想ユーザが初期化されるとき

このメソッドはサーバへのログインをエミュレートし,1 回だけ実行されます。SQS クライアントの初期化を含め,すべてのログイン手順と 1 度だけ行う構成設定をここに配置します。

例:次の行を init メソッドに挿入すると,AWS クラスタのリージョンとキュー URL を使用して,SQS クライアントが初期化されます。

LrSqsClient.initClient(region, standardQueueUrl);

action
仮想ユーザが「実行中」ステータスのとき
このメソッドはクライアント・アクティビティをエミュレートし,実行環境設定で指定した反復回数に従って実行されます。すべての仮想ユーザ・アクションをここに配置します。
end
仮想ユーザが終了するか停止されるとき

このメソッドはログオフ手順をエミュレートし,1 度だけ実行されます。SQS クライアントを閉じたり,スクリプト中に使用されたリソースの割り当てを解除したりなど,仮想ユーザがスクリプトの最後に実行するすべての手順をここに配置します。

例:end メソッドに次の行を挿入すると,SQS クライアントが閉じます。

LrSqsClient.closeClient();

スクリプトの例:

Copy code
import lrapi.lr;
import mf.protocols.lraws.*;
import mf.protocols.lraws.lrsqs.*;

public class Actions
{
    public int init() throws Throwable {
        LrSqsClient.initClient(LrAwsRegion.EU_CENTRAL_1, "your_queue_url_here");
        return 0;
    }//end of init

    public int action() throws Throwable {
        LrSqsClient.sendMessage("Hello, world!");
        LrSqsMessage m = LrSqsClient.receiveMessage();
        lr.log_message(m.body());
        LrSqsClient.deleteMessage(m);
        return 0;
    }//end of action

    public int end() throws Throwable {
        LrSqsClient.closeClient();
        return 0;
    }//end of end
}

先頭に戻る

関連項目: