4

ここで質問
がありまし たが、SQS の使用方法を理解するポイントがまだありません。誰かコードを手伝ってください。

質問: SQS 内の 1 つの場所は?
私はアマゾンのチュートリアルを読んだことがありますが、コンセプトは素敵に見えますが、物事の実用的な側面が欠けています.
たとえば、この図は素晴らしいです: http://awsmedia.s3.amazonaws.com/catalog/images/159-for-madhu.png
SQS の内部には何が入りますか? S3にアップロードする方法は理解できたが、SQS部分についてはまだグレー

require_once('sdk-1.5.6.2/sdk.class.php');
//random strings
$AWS_KEY = "MY_ACCESS_KEY";
$AWS_SECRET_KEY = "MY_SECRET_KEY";


//create a new SQS queue and grab the queue URL
$sqs = new AmazonSQS(array( "key" => $AWS_KEY, "secret" => $AWS_SECRET_KEY ));
$response = $sqs->create_queue('test-topic-queue');
$queue_url = (string) $response->body->CreateQueueResult->QueueUrl;

$queue_arn = 'arn:aws:sqs:us-east-1:ENCQ8gqrAcXv:test-topic-queue';
$topic_arn = 'arn:aws:sns:us-east-1:ENCQ8gqrAcXv:test-topic';
$response = $sns->subscribe($topic_arn, 'sqs', $queue_arn);
$subscription_arn = (string) $response->body->SubscribeResult->SubscriptionArn;




/*  *   * * * * * * * * * * * * * * * *     

THIS IS THE BIG GREY AREA, WHAT HAPPENS HERE ??? 

*   * * * * * * * * * * * * * * * * */



// delete SQS queue
$queue_url = 'https://sqs.us-east-1.amazonaws.com/ENCQ8gqrAcXv/test-topic-queue'; 
$response = $sqs->delete_queue($queue_url);
4

3 に答える 3

11

メッセージをキューに挿入するプロセスとワーカー スレッドの 2 つのプロセスが必要です。典型的なワーカー スレッドは次のようになります。

while(true) {
    $res = $client->receiveMessage(array(
        'QueueUrl'          => $url,
        'WaitTimeSeconds'   => 1
    ));
    if ($res->getPath('Messages')) {

        foreach ($res->getPath('Messages') as $msg) {
            echo "Received Msg: ".$msg['Body'];

            // Do something useful with $msg['Body'] here

            $res = $client->deleteMessage(array(
                'QueueUrl'      => $url,
                'ReceiptHandle' => $msg['ReceiptHandle']
            ));
        }
    }
}

WaitTimeSeconds パラメータは「ロング ポーリング」を行うことを意味し、さまざまな利点があります ( http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.htmlを参照)。

ワーカー スレッドが実行されていることを確認するには、supervise または monit を使用する必要があります。

更新: API v3 の場合、getPath() の代わりに get() を使用します - getPath は非推奨になりました

于 2014-04-17T19:25:20.033 に答える
10

コードはありません..例です(基本的に図を説明しています)。

人々がビデオをアップロードできるウェブサイトを持っています。あなたはすべてのビデオを .mp4 (またはあなたがそういう人なら .flv) に変換したいと考えています。

トランスコードには (議論のために) ビデオごとに 1 分かかります。動画が返されるまでに 1 分かかるため、アップロードと同じ HTTP / PHP リクエストでこれを行うことは望ましくありません。これは、特定の瞬間に多くの動画が Web サーバーでトランスコードされる可能性があることを意味します。

代わりに必要なのは、トランスコーディングを 100% 担当する個別のマシン/インスタンスです。それらは「ジョブ」を取得し、順番に処理します (キュー)。私たちは彼らを労働者と呼んでいます。

では、ワーカーがトランスコーディングを開始する必要があることを Web サーバーからどのように伝えるのでしょうか。1 つの方法は、ワーカーが x 秒ごとにチェックするデータベース レコードを設定することです。

これは素晴らしいデザインではありません。通常、ポーリングに頼らなければならないときはいつでも、より効率的な回避策を開発しています。

PHP の世界では、これを行う 1 つの方法は Gearman を使用することです。代わりに、ZeroMQ、RabbitMQ がありますが、Gearman は非常に人気のある PHP ソリューションです。AWS の世界では、SQS を提供しています。1つのことに責任があります:

一方の端にメッセージを押し込みます。この例では、これらは Web サーバーからのジョブです。相手側で新しいメッセージを待っています。この例では、これらは作業を待機しているワーカーです。

SQS の優れた点は、一方にワーカーを追加し、もう一方に Web サーバーを追加できることです。SQS は、1 つのワーカーだけがメッセージを受け取るようにします。したがって、水平方向のスケーリング パラダイムを満たしています (SQS 自体が水平方向にスケーリングする場合)。

于 2012-06-28T19:09:42.033 に答える
1

質問は、与えられた画像に従って SQS を持つ目的は何なのかを尋ねています。この画像に従って SQS をどのように使用できるかについて、高レベルのアイデアを提供します。質問で言及しました。

SQS は、複数の要求が一度に来ると一部のプロセスが圧倒される可能性があるため、プロセスが受ける負荷を処理するためにプロセスによって使用される単なるバッファーです。与えられた画像に従って、段階的に画像を説明します。ユーザーが写真をアップロードすると、ユーザーは処理された写真を取得する写真処理サーバーのように見えます。

ステップ 1 : ユーザーが写真を にアップロードするweb-serverと、S3 に保存されます。その間、リクエストは に送信されますRequest Queue(おそらくキューの場所が含まれています)。このプロセスは、すべてのユーザー要求に対して発生します。

ステップ 2 :Photo processing serverは SQS をポーリングし、着信要求を確認します。リクエスト (S3 上の画像の場所を含む) を受け取り、S3 から画像を取得して処理します。

ステップ 3 : 処理された画像は によって S3 に保存されPhoto Processing Server、その URL が に送信されますResponse Queue。はWeb ServerをポーリングしResponse Queue、ダウンロード URL をユーザーに提供します。そのため、ユーザーは処理された画像を S3 からダウンロードできます。

これは、イメージ内の SQS の使用例の 1 つです。コードによると、SNS は本当に必要ありません。Web サーバーは単純に S3 にアップロードでき、S3 は SQS でアップロード イベントを発行できます。(これを読んでください)。これは、応答キューでも実行できます。

これは、SQS がこのタスクに使用されている灰色の領域で発生することです。

于 2018-04-28T13:57:31.060 に答える