4

我在这里有一个问题,
但我仍然没有理解如何使用 SQS,任何人都可以帮忙提供一些代码。

问题: SQS 中的一个地方是什么?
我已经阅读了亚马逊的教程,这个概念看起来很可爱,但我错过了实用的一面。
例如,这张图很棒: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

您应该有两个进程,一个将消息插入队列和您的工作线程。一个典型的工作线程看起来像这样:

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 使用 get() 而不是 getPath() - getPath 现在已弃用

于 2014-04-17T19:25:20.033 回答
10

没有代码..但是一个例子(基本上解释了图表)。

你有一个人们可以上传视频的网站。您想将每个视频转换为 .mp4(或者 .flv,如果您是那种人)。

转码(为了争论)每个视频需要 1 分钟。您不想在与上传相同的 HTTP / PHP 请求中执行此操作,因为视频返回需要 1 分钟,这意味着许多视频可能在任何给定时刻都在网络服务器上进行转码。

相反,您需要的是 100% 负责转码的独立机器/实例。他们获得“工作”并按顺序处理它们(队列)。我们称他们为工人。

那么,您将如何从您的网络服务器传达工作人员应该开始转码的信息。一种方法是设置工作人员每 x 秒检查一次的数据库记录。

这不是一个伟大的设计。通常,每当您必须求助于轮询时,您都在为更有效的方法开发解决方法。

在 PHP 世界中,一种方法是使用 Gearman。或者,ZeroMQ、RabbitMQ,但 Gearman 是相当流行的 PHP 解决方案。在 AWS 世界中,他们提供 SQS。负责一件事:

在 1 端推送消息。在此示例中,这些是来自网络服务器的作业。在另一端等待新消息。在这个例子中,这些是等待工作的工人。

SQS 的好处是您可以在一端添加工作人员,在另一端添加网络服务器。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 获取图像并对其进行处理。

第三步:处理后的图片会被存储在S3中Photo Processing Server,并将其url发送到Response Queue。将Web Server轮询Response Queue并将下载 URL 提供给用户。因此用户可以从 S3 下载处理后的图像。

这是图像中 SQS 的一种可能用例。根据您的代码,您确实不需要 SNS。Web Server 可以简单的上传到 S3,S3 可以在 SQS 中发布上传事件。(读这个)。这也可以通过响应队列来完成。

这就是在 SQS 用于此任务的灰色区域中发生的情况。

于 2018-04-28T13:57:31.060 回答