2014-03-27 67 views
0

我正在使用Amazon SQS排隊處理消息。我有基準,我只能以約400條消息/秒的速度將lib放入隊列中。我使用發送消息的上限爲10.SQS亞馬遜在服務器之間調節請求

我的第二個問題是SQS正在被遠程使用(即:我有一個服務器正在創建不在亞馬遜或EC2實例旁邊的消息)。

我的目標是增加這個瓶頸,因爲我至少要做10K的請求。

這是因爲網絡延遲而失敗嗎?或者可以有更好的解決方案來實現SQS或代碼重新調整。

此外,SQS的lib是PHP。

編輯:代碼添加

use Aws\Sqs\SqsClient; 
class Sqs implements QueueInterface 
{ 
    private static $_instance = null;  
    private $_client = null;  

protected function __construct($setting) 
{    
    if ($this->_client === null) { 
     try { 
      $this->_client = SqsClient::factory($setting); 
     } catch (Exception $e) { 
       $this->_client = null;      
     } 
    } 

}   
    public static function getQueue($setting)  
    { 

     if (self::$_instance === null) { 
      self::$_instance = new Sqs($setting); 
     } 
     return self::$_instance; 
    } 

    public function put(Data\DataRepository $data, $queueName) 
    { 
     $attributes=array(); 

     if (!$this->_client) return false; 
     return self::_putToClient($this->_client, $data->getData(), $queueName, $attributes); 

    } 

    /** 
    * Put data into the queue using a defined client. 
    * 
    * @param mixed $client  The client to use. 
    * @param mixed $data  The data to insert. 
    * @param string $queueName The name of the queue in which to insert. 
    * @param mixed $attributes Some attributes for the client (QueueAttribute::DELAY_SECONDS) 
    * 
    * @return string The job id in the queue or false if a problem happened. 
    */ 
    private static function _putToClient($client, $data, $queueName, $attributes=array()) 
    { 
     try { 
      $result = $client->createQueue(array('QueueName' => $queueName, 'Attributes' => $attributes)); 
      $queue_url = $result->get('QueueUrl'); 

      $response = $client->sendMessage(array('QueueUrl' => $queue_url, 'MessageBody' => $data)); 

      return $response->getPath('MessageId'); 
     } catch (Exception $e) { 
      return false; 
     } 
    } 
} 
+0

也許都是。你的代碼是什麼樣的?您是否使用適用於PHP的AWS開發工具包? –

+0

@JeremyLindblom yup「aws/aws-sdk-php」:「2.4.10」 – azngunit81

+0

您是否爲每封郵件創建了一個新隊列? –

回答

1

這有可能是網絡延遲是影響你,但也有可能是一些其他的事情可以做,以獲得更多的吞吐量。

你在做什麼與你的代碼應該工作正常。但是,它絕對不是最優化的。 _putToClient()總是會發出2個API調用。只有一個電話SqsClient::createQueue()應該是必要的;每次發送消息時都要打這個電話似乎很奇怪。如果只做一次,並存儲/緩存QueueUrl,則可以消除一些延遲。

您還應該查看SDK guide for doing parallel requests。這將允許您一次發送超過10條消息。您可能還需要閱讀SDK performance guide,以瞭解您是否可以做任何事情來加速您對SDK的使用。

我也會發布到SQS forum以查看SQS工程師是否可以指出SQS特有的任何最佳實踐。

+0

旁邊的「升級你的PHP」似乎有很多設置可以關閉,以便消息可以更快地傳遞。感謝您的輸入 – azngunit81