Вход Связаться

Персональная страничка-блог

Amazon SQS (simple queue service)

Если вам необходимо написать высоконагруженное и отказоустойчивое приложение или просто разделить существующее высоконагруженное (или просто большое) приложение на части, то вы наверняка уже прочитали про очереди сообщений... Если же нет, то сейчас самое время.

В этой статье у меня есть желание познакомить вас с очередным сервисом от Amazon - Amazon SQS. Это простенькая очередь сообщений однако "заточенная" под высоконагруженные проекты.

Бонус в том что вам совершенно не придётся беспокоится про инфраструктуру очереди. Amazon обещает доступность и надёжность... Чтож до сих пор Amazon ни разу не подводил.

Теперь немного детальней об особенностях этого сервиса

Основная информация (на английском языке)

Информация для программистов (на английском языке)

А теперь на русском (вольный пересказ):

  • Очереди можно создавать и удалять на лету
  • Удаление очереди перманентно (очередь будет удалена со всеми оставшимися сообщениями)
  • Очередь по умолчанию доступна для Anonymous* (тоесть положить сообщение в очередь может любой желающий... Если ключ есть :) )
  • Для очереди есть управление правами доступа. И в принципе можно ограничить в правах всех и вся. Единственное что для доступа к очереди всегда нужен ключ. (его можно сгенерировать в Amazon-профайле) Соответственно для аутентифицированного доступа всем участникам придётся зарегистрированться на Amazon и сгенерировать свои ключи. Есть ещё лазейка, можно ограничить анонимуса по белому списку айпи адресов.
  • Очередь привязана к региону (есть возможность расположить очередь поближе к пользователям)
  • Размером сообщения в очереди можно управлять. По умолчанию это 8к но можно увеличить до 64к
  • Количество очередей и сообщений неограничено и вы платите как и заведено у Amazon только за то что используете. Платить придётся за каждые 10к запросов к сервису и за каждый гигабайт переданных данных
  • Несмотря на неограниченность ресурсов есть максимальное время для очреди. Amazon имеет право самовольно удалять сообщения (максимум 14 дней хранения; по умолчанию 4 дня; Этим параметром можно управлять); Аналогично Amazon имеет право удалить вашу очередь если к очереди небыло никаких обращений в течении месяца.

Пример работы с очередью

Сделаем его на примере готовой php библиотеки от Amazon. Amazon очень предусмотрительно предоставил готовые библиотеки для наиболее популярных языков WEB разработки.

Инициализация

define('Q_NAME', 'test_queue_showroom');
define('AWS_KEY', '<value>');
define('AWS_SECRET_KEY', '<value>');
define('AWS_ACCOUNT_ID', '<value>');
define('AWS_CANONICAL_ID', '<value>');

require_once '../sdk.class.php'; // тут конечно ваше расположение должно быть

$sqs = new AmazonSQS();
$region = AmazonSQS::REGION_EU_W1;
$sqs->set_region($region);
// если не установить регион то будет установлен регион по умолчанию (сша/запад)

Просматриваем какие очереди нам доступны в заданном регионе

  $queues = $sqs->get_queue_list();
  var_dump($queues);

Если нашей очереди нет то создаем её

$Q = '';
foreach ($queues as $qu) if (strpos($qu,Q_NAME)!==false) {$Q = $qu; break;}
if (empty($Q) {
  $answer = $sqs->create_queue(Q_NAME);
  if (!$answer->isOk()) throw new Exception('exeption');
}

Записываем сообщение в очередь

$answer = $sqs->send_message($Q,'Message');
if (!$answer->isOk()) throw new Exception('exeption');

Читаем сообщение из очереди

$answer = $sqs->receive_message($Q);
if (!$answer->isOk()) throw new Exception('exeption');

if (!empty($answer->body->ReceiveMessageResult->Message)) {
  echo '

Received Message

'; print_r( $answer->body->ReceiveMessageResult->Message ); print_r( $answer->body->ResponseMetadata ); } else { echo '

NO MESSAGES RECEIVED (But possibly queue messages has the visibility timeout) try again

'; }

Удаляем прочитанное сообщение

// необходимо использовать результат предыдущей операции чтения
$answer = $sqs->delete_message($Q,$answer->body->ReceiveMessageResult->Message->ReceiptHandle);
if (!$answer->isOk()) throw new Exception('exeption');

И собственно удаляем очередь

$answer = $sqs->delete_queue($Q);
if (!$answer->isOk()) throw new Exception('exeption');

В данной статье я не рассматривал ограниечение прав пользователей, но это наверное тема для очередной статьи..... Может напишу...

Удачи вам в работе с SQS.

Помощь по сайтам

Уважаемые посетители.

  • Если вы хотите создать WEB-сайт;
  • Если у вас есть сайт, и вы хотите его изменить/дополнить, но не знаете как;
  • Если у вас возникли какие-нибудь вопросы относительно настройки вашей CMS;

Вы можете абсолютно не стесняясь задавать мне вопросы я обязательно отвечу. Пишите ваши вопросы письмом по адресу Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. .