share facebook facebook twitter menu hatena pocket slack

Amazon SQSってなんじゃ?(その1 Scratchpad編)

三浦 悟

WRITTEN BY 三浦 悟

SimpleDBの回は少し一休みして、SQSを触ってみました。
Amazon SQS(Simple Queue Service)は、AWSが提供するメッセージキューシステムで、送信側と受信側が別のプロセスで非同期にメッセージのやりとりを行い、送信と受信の間でお互いの処理待ちをなくすことのできる仕組みになっています。
例として、WEBアプリケーションなどで、画像生成などの重い処理をするときに処理のタスクだけを指示して、レスポンスをすぐ返すことによりクライアントに処理待機をさせないようにするときなどに便利です。

SQSではメッセージの送信、受信側での処理は以下のような流れになっており、使い方はとてもシンプルで、送信側でメッセージを送り、受信側でメッセージの受信を待機するだけです。

○送信側

  • 指定したキュー名のキューオブジェクトを作る
  • メッセージを送る

○受信側

  • 指定したキュー名のキューオブジェクトを作る
  • メッセージの待機
  • メッセージを受け取ったら処理
  • メッセージを削除

では、さっそく利用してみます。
まずAmazon SQSのページで利用申し込みします。

申し込むと登録完了メールが届き、すぐに使えるようになります。

このSQSにもscratchpadというJavascriptで書かれたツールがあるので、利用してみたいと思います。
Javascript Scratchpad for Amazon SQSをダウンロードし、解凍したフォルダのindex.htmlをブラウザで開きます。

ヘッダにアクセスキーとシークレットアクセスキーを入力して、右側のリストから仕様したいAPIを選択します。

○キューの作成

まず送信側の処理に必要なキューの作成で、右側のAPIリストからCreateQueueを選択します。

パラメータは以下のとおりです。

  • QueueName(必須):キュー名。SQSではキューはラジオのチャンネルのようなもので自分が使用するSQSインスタンスの中でユニークである必要があります。あるキュー名を指定するといつでも同じキューが取得でき、同じキューに対してメッセージの送受信を行います。
  • Default Visibility Timeout(オプション):受信側クライアントのインスタンスが複数ある場合、1つのインスタンスがメッセージを受信するとここで指定した時間(秒)の間は、他のインスタンスからは隠されます。それによってその間重複することなく受信処理を完了することができます。デフォルトは30秒で、非常に重い処理をする場合はこの秒数を多くします。

ここではQueueNameにhogeと入力し、Invoke Requestを押します。
すると、以下のようなレスポンスが返ります。



https://queue.amazonaws.com/821635308497/hoge


e490c631-b519-4e02-a610-55ab66b2fac2


ここでQueueURLというのが、hogeというキューにアクセスするための識別子になります。
このURLはキュー名に対して一意で、送信するときも受信するときにも
このURLを指定してメッセージのやりとりを行います。
CreateQueueを何度行ってもキュー名が同じならば、URLは同じものになります。
つまりCreateQueueというのは、キューをいくつも作るのではなく、
与えたキュー名から一意なキューURLを取得する処理だと言えます。
これは76.1MHzにあわせれば毎回interfmにつながるのと同じことです。

○メッセージの送信

次はメッセージの送信です。
ヘッダのAPIリストからSendMessageを選択します。

パラメータは以下の2つです。

  • Queue Url(必須):キューの作成で取得したキューURLを指定します。メッセージはこのURLをキューの識別子として送信され、受信側でもこのURLを指定して受信します。
  • Message Body(必須):メッセージの内容です。

ここではQueueUrlに、先ほど作成したhogeというQueueのQueuUrl
https://queue.amazonaws.com/821635308497/hogeを、
MessageBodyにはHello World!を入力してInvoke Requestをクリックします。
すると、以下のようなレスポンスが返ります。



ed076287532e86365e841e92bfc50d8c>
f5735801-1b32-44f6-a86b-416a04bb969a


233b5572-e2a6-4e30-8ee3-27250276168f
>

これでメッセージがキューに送られました。

○メッセージの受信

次にメッセージを受信してみます。
APIリストからReceiveMessageを選択します。

パラメータは以下のとおりです。

  • QueueUrl(必須):送信時と同じキュー名に該当するキューURLを指定します。CreateQueueで取得します。
  • Max Number Of Messages(オプション):取得する最大のメッセージ件数を指定します。デフォルトは1です。一度にたくさんのメッセージを処理したい場合はこれを増やします。
  • Visibility Timeout(オプション):一度メッセージを受信するとこの秒数の間は、他のインスタンスのReceiveMessageリクエストからこのメッセージを隠します。デフォルトはキューのVisibility Timeoutと同じになります。

ここではQueueUrlに、先ほどの送信時のキューURL
https://queue.amazonaws.com/821635308497/hogeを指定して、
InvokeRequestをクリックすると以下のレスポンスが返ります。




f5735801-1b32-44f6-a86b-416a04bb969a
0NNAq8PwvXtwwfdMtBtd6ZxXkxF39Z/IYeGA072QQSZ0DJ3gVOmjI2Gh/oFnb0IeJqy5Zc8kH4JARkzdFBpldzaAPSeOkXQZwFSsJUhd5VMVLzK3+eRCyfzyRC5taEby2sLs6d2PAFOgJcNQRNWCRx2ZBrIVvHrDEKIvb6EDD5Mzd5Tn7Sx1Kdc/TnR7K9fu
ed076287532e86365e841e92bfc50d8c
      Hello World!



5115c13c-5c58-4f35-aae0-505c892a9c00


ここで、ReceiveMessageResultの中にMessage要素が含まれており、
その中のBody要素に先ほど送信したHello World!を確認することができます。
このBody要素がメッセージ本体になります。
また、 Message要素の中のReceptHandleはメッセージの削除に使用されます。

○メッセージの削除

メッセージは受信しただけでは削除されませんが、
通常メッセージは受信した後に、明示的に削除する必要があります。
APIリストからDeleteMessageを選択します。

パラメータは以下の2つです。

  • Queue Url(必須):削除したいメッセージが含まれているキューのURLです。送信や受信時のキューURLと同じものです。
  • Recept Handle(必須):受信したメッセージに含まれるReceptHandleを指定します。これはそのキューの中のメッセージへのポインタのようなものです。

QueueUrlに、受信時のキューURLとして指定したのと同じ
https://queue.amazonaws.com/821635308497/hoge、
Recept Handleに受信のレスポンスに含まれていたReceptHandleである
0NNAq8PwvXtwwfdMtBtd6ZxXkxF39Z/IYeGA072QQSZ0DJ3gVOmjI2Gh /oFnb0IeJqy5Zc8kH4JARkzdFBpldzaAPSeOkXQZwFSsJUhd5VMVLzK3+eRCyfzyRC5taEby2sLs6d2PAFOgJcNQRNWCRx2ZBrIVvHrDEKIvb6EDD5Mzd5Tn7Sx1Kdc /TnR7K9fu
を指定して、Invoke Requestを押します。

すると以下のレスポンスが返り、メッセージが削除されます。



bb6333a8-bc6f-4151-ace4-efbca103316d

他にもいくつかAPIがありますが、通常メインで使用するのは、上記の4つになります。
次回はこれをプログラムから利用してみます。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら

三浦 悟

三浦 悟

高円寺在住のなんじゃ系男子 またの名をmemorycraftといいます。 炭水化物大好き 日々の「なんじゃ?」を記事にしてます。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。