先日、SQSに関して下記の機能がリリースしました。

Amazon SQSに新機能が追加! ロングポーリング、リクエストバッチ処理/クライアントサイドでのバッファリング

ということで、さっそく、ロングポーリングに関して試してみました。

すでに、SQSに関しては、下記でいろいろと試しており、そこでのスクリプトをブラッシュアップしたもの実験しています。

PHPで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)の組み合わせを試してみと思います。

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