2012-06-28 38 views
3

我有一個question here
但我仍然錯過了解如何使用SQS的重點,請任何人都可以幫助一些代碼請。

問題: SQS內的一個地方會是什麼?
我已閱讀amazons教程,這個概念看起來很可愛,但我錯過了事物的實用方面。
例如,該圖是巨大的:http://awsmedia.s3.amazonaws.com/catalog/images/159-for-madhu.png
你會去SQS裏面?我明白如何上傳到S3,但還是灰色有關SQS部分AWS SQS實用代碼PHP

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'; 



$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); 

回答

7

你應該有兩個過程,一個消息插入到隊列中,你的工作線程。一個典型的工作線程會是這個樣子:

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

您應該使用監督或monit的,以確保您的工作線程保持運行。

更新:對於API V3使用的get()代替的getPath() - 的getPath現在已經過時

+5

AWS允許您在Elastic Beanstalk中使用具有SQS守護程序的Worker層,而不是使用「while(true)」,它會自動從隊列中檢索消息並將它們發佈到您的應用程序。這裏有更多信息:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html –

8

無代碼..但一個實例(基本說明圖)。

你有一個網站,人們可以上傳視頻。你想把每個視頻轉換成.mp4(或者.flv,如果你是那個人)。

轉碼需要(爲了論證)每個視頻需要1分鐘。您不希望在上傳的HTTP/PHP請求中執行此操作,因爲視頻要等待1分鐘纔會返回,這意味着許多視頻可能會在任何特定時刻在網絡服務器上進行轉碼。

你需要什麼,而不是,是單獨的機器/實例負責轉碼100%。他們得到'工作'並按順序處理它們(一個隊列)。我們稱他們爲工人。

那麼你怎麼從你的網絡服務器,工人應該開始trancoding溝通。 1種方法是設置一個數據庫記錄,工人每隔x秒檢查一次。

這不是一個偉大的設計。一般來說,只要你必須求助於投票,你就可以開發一種解決方案來提高效率。

在PHP世界中,一種方法是使用Gearman。或者,ZeroMQ,RabbitMQ,但Gearman是非常流行的PHP解決方案。在AWS世界中,他們提供SQS。負責一件事:

在1端推送消息。在這個例子中,這些是來自web服務器的工作。 等待另一端的新消息。在這個例子中,這些是等待事情做的工人。

約SQS的好處是,你可以只需添加1月底的工人,並在另一端添加Web服務器。 SQS確保只有1名工作人員獲得該信息。所以它符合水平縮放範例(SQS本身水平縮放)。

+0

「你怎麼從你的網絡服務器,工人應該開始trancoding溝通」 - 你建議設立在檢查隊列的處理實例的cron? –

+0

嗨!不,那會打敗目的。只需要等待消息的長時間運行的PHP進程。 – Evert

+2

好奇該怎麼做!這個問題正在成倍地創造更多的問題 –