先日、SQSに関して下記の機能がリリースしました。
Amazon SQSに新機能が追加! ロングポーリング、リクエストバッチ処理/クライアントサイドでのバッファリング
ということで、さっそく、ロングポーリングに関して試してみました。
すでに、SQSに関しては、下記でいろいろと試しており、そこでのスクリプトをブラッシュアップしたもの実験しています。
実際の実験用スクリプト(キューからメッセージを取得)は次のものです。
#!/usr/bin/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);
?%gt;
まずは、下記のデフォルト状態で試してみます。
ちなみに設定されているパラメータは次のとおりです。
- 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)の組み合わせを試してみと思います。