我目前正在使用Amazon SQS排队消息以进行处理。我有基准测试,我只能以大约400消息/秒的速度将lib放入队列。我正在使用发送邮件的上限为10。
我的第二个问题是远程使用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 :(得分:1)
网络延迟可能会影响您,但您可以采取其他一些措施来提高吞吐量。
您对代码的处理应该正常。但是,它绝对不是最优化的。 _putToClient()
总是进行2次API调用。只需拨打SqsClient::createQueue()
一次电话;每次发送消息时都要拨打电话似乎很奇怪。如果您只执行一次,并存储/缓存QueueUrl,则可以消除那里的延迟。
您还应该查看SDK guide for doing parallel requests。这样您就可以一次发送10条以上的消息。您可能还想阅读SDK performance guide以了解您是否可以采取任何措施来加快SDK的使用速度。
我还会向SQS forum发帖,看看SQS工程师是否可以指出针对SQS的任何最佳做法。