20.02.2011 09:32
Если вам необходимо написать высоконагруженное и отказоустойчивое приложение или просто разделить существующее высоконагруженное (или просто большое) приложение на части, то вы наверняка уже прочитали про очереди сообщений... Если же нет, то сейчас самое время.
В этой статье у меня есть желание познакомить вас с очередным сервисом от Amazon - Amazon SQS. Это простенькая очередь сообщений однако "заточенная" под высоконагруженные проекты.
Бонус в том что вам совершенно не придётся беспокоится про инфраструктуру очереди. Amazon обещает доступность и надёжность... Чтож до сих пор 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 '<p> Received Message</p>'; print_r( $answer->body->ReceiveMessageResult->Message ); print_r( $answer->body->ResponseMetadata ); } else { echo '<p> NO MESSAGES RECEIVED (But possibly queue messages has the visibility timeout) try again </p>'; }
Удаляем прочитанное сообщение
// необходимо использовать результат предыдущей операции чтения $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.
Уважаемые посетители.
Вы можете абсолютно не стесняясь задавать мне вопросы я обязательно отвечу. Пишите ваши вопросы письмом по адресу sergey@ivanchenko.by.