AWS SQS实用代码PHP

t q*_*t q 4 php amazon-sqs amazon-web-services

我在这里有一个问题,
但我仍然忽略了如何使用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);
Run Code Online (Sandbox Code Playgroud)

Eve*_*ert 10

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

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

转码需要(为了争论)每个视频1分钟.你不想这样做在同一个HTTP/PHP请求的上传,因为它会花1分钟的视频,返回,这意味着许多视频可以对任何给定时刻的网络服务器进行转码.

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

那么你如何从你的网络服务器通知工人应该开始转码.1种方法是设置工作人员每隔x秒检查一次的数据库记录.

这不是一个很棒的设计.通常,只要你必须求助于民意调查,你就可以开发一种更有效率的解决方法.

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

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

关于SQS的好处是你可以在一端添加worker,在另一端添加webservers.SQS确保只有1名工作人员获得该消息.因此它符合水平缩放范例(假设SQS本身水平缩放).

  • 好奇怎么做!这个主题以指数方式创造出更多问题 (2认同)

小智 9

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

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']
            ));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

WaitTimeSeconds参数意味着执行"长轮询"并具有各种好处(请参阅http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html).

您应该使用supervise或monit来确保您的工作线程保持运行.

更新:对于api v3,使用get()而不是getPath() - 现在不推荐使用getPath

  • AWS不允许使用最终会占用所有服务器资源的`while(true)`,而是允许您在Elastic Beanstalk中使用具有SQS守护程序的Worker Tier,该守护程序会自动从队列中检索消息并将其发布到您的应用程序.更多信息:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html (5认同)