2012年11月22日木曜日

SQSのロングポーリング機能を試してみた

スズキです。

先日、SQSに関して下記の機能がリリースしました。
Amazon SQSに新機能が追加! ロングポーリング、
リクエストバッチ処理/クライアントサイドでのバッファリング
ということで、さっそく、ロングポーリングに関して試してみました。

すでに、SQSに関しては、下記でいろいろと試しており、
そこでのスクリプトをブラッシュアップしたもの実験しています。
PHPでSQS
実際の実験用スクリプト(キューからメッセージを取得)は次のものです。
#!/usr/bin/php
<?php
require_once("../php/default/sdk.class.php");
$url = "https://sqs.ap-northeast-1.amazonaws.com/811118151095/suz-lab-queue";
$sqs = new AmazonSQS(array(
    "key"    => "ACCESS KEY",
    "secret" => "SECRET KEY"
));
$sqs->set_region(AmazonSQS::REGION_APAC_NE1);
$response = $sqs->receive_message($url);
$body = $response->body->ReceiveMessageResult->Message->Body;
if(isset($body)) {
    error_log("Body: " . $body);
} else {
    error_log("Empty");
}
$receipt_handle = $response->body->ReceiveMessageResult->Message->ReceiptHandle;
if(isset($receipt_handle)) {
    $response = $sqs->delete_message($url, $receipt_handle);
    error_log("Delete: " . $receipt_handle);
}
if(!$response->isOK()) {
    exit(1);
}
exit(0);
?>

まずは、下記のデフォルト状態で試してみます。


ちなみに設定されているパラメータは次のとおりです。
  • Default Visibility Timeout
    キューからメッセージが取得され、見えなくなっている期間のデフォルト値です。

  • Message Retention Period
    キューのメッセージを保持する期間です。
    1から14日間の間で指定できます。

  • Maximum Message Size
    キューに送れるメッセージのサイズの最大値です。
    1から64kBの間で指定できます。

  • Delivery Delay
    キューにメッセージを送った後、取得できるようになるまでの期間です。
    0から15秒で指定できます。

  • Receive Message Wait time
    キューからメッセージを取得するときにメッセージを待つ時間です。
    0から20秒で指定できます。
    ロングポーリングに関する設定です!

それではテストスクリプトを実行してみます。
$ ./long-polling.php 
Empty
当然ですが今までどおり、キューにメッセージが無ければ、すぐに"Empty"と返ってきます。

キューにメッセージ(test1)をおくると、


下記のように、スクリプトを実行した瞬間にメッセージ(test1)を取得します。
$ ./long-polling.php 
Body: test1
Delete: cOJv9qrD9XLVlpsfwYn3xQmb+PN7hPQPbkCIB97S3YoyAF+H02uR3CuLsjHxWnZJ3AfRM9/AEkwmrLllzyQfgmGr3NvOxZtxgEHdHG7hCuZj60xWB5TI4kPjjV/MUdapjateCyEm0z65WeuxAS4Ek1l0SjmE5N/xC2dpWOLbFUckMs8XBsfXik95Y8/lXq55xFElXroXRfYS7hFdiLJMxTywEwFPlmKnMV2rRGRzq58jxR9z5+ay3Ior+0gT987n3fSpC08KUC9WX1FKSacnxeivQMpOAV9+84TnrPxqcffMy2gO3IT0TA==

次にキューの設定で"Receive Message Wait Time"をMaxの20秒にしてみます。


そして、キューにメッセージ(test2)を送信して、


スクリプトを実行すると、当然、すぐにメッセージ(test2)が取得され、処理が終了します。
$ ./long-polling.php 
Body: test2
Delete: cOJv9qrD9XLVlpsfwYn3xQmb+PN7hPQP7rQDzfWJc5gwt93m4XHEeuFtIE6jhgu6v9ZaF3dmpwgmrLllzyQfgk8KvWkmEINZQVpyT9HSJN4aV7bWdWMuYN9gY5+w9hl+OOTuSnkHs4gU1WDoUVxdpOvnuzRSz8gIC2dpWOLbFUckMs8XBsfXik95Y8/lXq55xFElXroXRfYS7hFdiLJMxajR6XsXPNgEFWxNOhj2eev6AdZeLbZBInCZSlP4VsY9vvW6rzY9Gff4kzffCfO+f6Xq/3+NXJOMTtVxCUuPvGH19TAUVTfd7w==

キューにメッセージがない状態でスクリプトを実行してみると、
$ ./long-polling.php 
今度は、SQSからのレスポンス待ちの状態となり、
下記のようにメッセージ(test3)を送信すると、


その時点で、メッセージ(test3)が取得でき、処理が終了します。
$ ./long-polling.php 
Body: test3
Delete: cOJv9qrD9XLVlpsfwYn3xQmb+PN7hPQPPNwCZ7A4qpAuJRlSAxSID66Ud7UcK/WMoCbIzo57PIwmrLllzyQfgrstDjoj4ylbP9aayqfgia0MLPCcn2kF8rKnKj7ixVwgCAmy4ftW3AdNAIhG69NhjP5fZNpcqcLlC2dpWOLbFUckMs8XBsfXik95Y8/lXq55xFElXroXRfYS7hFdiLJMxQfc5tcttdCff/m2Eeh7/08FGEDrW8e38hsoKOlI7Py/IKq3rPL5nNB8i6cql6Z75zjNEaw+FUliN44ru1GUNYWBo0xBDlfHjA==

つまりメッセージが無い場合は、最大"Receive Message Wait TIme"で指定した時間だけ
処理が待たされ、キューにメッセージが送信された時点で、すぐにメッセージを取得し、
処理が終了する形となっています。

ちなみにメッセージを送信せずに、そのままにしておくと、20秒後に"Empty"で処理が返ってきます。
$ ./long-polling.php 
Empty

次は、Supervisor(d)の組み合わせを試してみよう。
--------
http://www.suz-lab.com

0 コメント: