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本身水平缩放).
小智 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
| 归档时间: |
|
| 查看次数: |
9801 次 |
| 最近记录: |