AWS SQS 实用代码 PHP


AWS SQS practical code PHP

>我这里有
一个问题但是我仍然没有抓住理解如何使用 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);

您应该有两个进程,一个将消息插入队列和工作线程。典型的工作线程如下所示:

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)。

您应该使用 监督或监控来确保您的工作线程保持运行。

更新:对于 api v3,请使用 get() 而不是 getPath() - getPath 现已弃用

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

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

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

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

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

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

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

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

SQS 的好处是,您可以在一端添加工作线程,在另一端添加 Web 服务器。SQS 确保只有 1 个工作人员收到消息。因此,它符合水平扩展范式(前提是 SQS 本身水平扩展)。

问题是问,根据给定图像拥有 SQS 的目的是什么。您将根据此图像给出有关如何使用SQS的高级想法,您在问题中已经提到。

SQS 只是进程用来处理它们获得的负载的缓冲区,因为当多个请求同时出现时,某些进程可能会不堪重负。我将根据给定的图像逐步解释图像。它看起来像一个照片处理服务器,用户在其中上传照片,用户将取回经过处理的照片。

第 1 步:用户将照片上传到 web-server ,并将其存储在 S3 中。同时,请求被发送到Request Queue(可能包含队列的位置)。此过程发生在所有用户请求上。

第 2 步Photo processing server将轮询 SQS 并检查是否有任何传入请求。接受请求(其中包含图像在 S3 上的位置)并从 S3 获取图像并对其进行处理。

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

这是图像中 SQS 的一个可能用例。根据您的代码,您真的不需要SNS。Web 服务器可以简单地上传到 S3,S3 可以在 SQS 中发布上传事件。(阅读此内容)。这也可以通过响应队列来完成。

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