Вступление
Эта статья знакомит с концепцией очередей сообщений и обсуждает сильные и слабые стороны трех конкретных служб очереди сообщений: Beanstalkd, IronMQ и Amazon SQS.
Любая информация, описанная в этой статье, является верной на момент написания и может быть изменена.
Что такое очереди сообщений?
Очереди позволяют хранить метаданные для обработки заданий позднее. Они могут помочь в разработке SOA (сервис-ориентированной архитектуры), предоставляя гибкость в переносе задач на отдельные процессы. При правильном применении очереди могут значительно повысить удобство работы веб-сайта за счет сокращения времени загрузки.
Преимущества очередей сообщений:
- Асинхронный: поставьте в очередь сейчас, запустите позже.
- Развязка: разделяет логику приложения.
- Устойчивость: не удалит все ваше приложение, если часть его не удастся.
- Избыточность: может повторить работу, если она не удалась
- Гарантии: гарантирует, что рабочие места будут обработаны.
- Масштабируемость: многие работники могут обрабатывать отдельные задания в очереди.
- Профилирование: может помочь в выявлении проблем с производительностью.
Недостатки очередей сообщений:
- Асинхронный: вы должны ждать, пока работа не будет завершена.
- Загрузка: каждое задание в очереди должно дождаться своей очереди, прежде чем оно сможет быть обработано. Если одна работа выходит за рамки, это влияет на каждую последующую работу.
- Архитектура: приложение должно быть разработано с учетом очередей.
Варианты использования очередей сообщений:
Любой трудоемкий процесс может быть помещен в очередь:
- Отправка / получение данных от сторонних API
- Отправка электронной почты
- Генерация отчетов
- Запуск трудоемких процессов
Вы также можете творчески использовать очереди — блокируя задания, чтобы только один пользователь мог одновременно получить доступ к информации.
Сервисы
Существует множество сервисов, которые вы можете использовать для реализации очередей сообщений, в этой статье описываются различия между Beanstalkd, IronMQ и Amazon SQS.
Beanstalkd
Beanstalkd — это «… простая, быстрая очередь на работу». Он выпущен как открытый исходный код под лицензией MIT. Он хорошо документирован, проверен модулем и может быть загружен бесплатно для запуска на вашем собственном сервере. Архитектура заимствована из memcached и разработана специально для очереди сообщений.
Статья Дэйва Кеннеди о SitePoint под названием « Гигантское убийство с помощью Beanstalkd» содержит информацию о том, как начать использовать Beanstalkd с Ruby.
IronMQ
IronMQ — это размещенный веб-сервис RESTful. Существует бесплатный уровень для разработчиков и множество других уровней подписки для коммерческих приложений.
SQS
Amazon SQS является недорогим размещенным решением для реализации очередей сообщений. Он входит в состав Amazon Web Services (AWS). Amazon предлагает бесплатный уровень для оценки своих веб-сервисов, который включает SQS.
Настройка сервера
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
Самопринятый | Удаленно размещен | Удаленно размещен |
Beanstalkd
Работает на Linux и Mac OS X. Прочтите инструкции по установке на веб-сайте Beanstalkd, чтобы узнать, как заставить его работать в вашей системе. Сервер Beanstalkd не работает в Windows.
IronMQ и SQS
IronMQ и Amazon SQS — это облачные веб-сервисы. На вашем сервере не нужно настраивать приложения, вам просто нужно зарегистрировать учетную запись и настроить очередь.
Соглашения об уровне обслуживания (SLA)
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
Никто | 99,95% в месяц | Никто |
Beanstalkd
Поскольку Beanstalkd является сервером, который вы размещаете, вы несете ответственность за обеспечение его доступности.
IronMQ
Iron.IO имеет соглашение об уровне обслуживания с процентом работоспособности не менее 99,95% в течение любого ежемесячного цикла выставления счетов. Их пакет Pro Platinum (2450 долл. США в месяц) имеет пользовательские условия контракта, включая соглашения об уровне обслуживания. Они обеспечивают возврат в сервисных кредитах.
SQS
У Amazon нет специального соглашения об уровне обслуживания для SQS. У них есть службы поддержки, которые могут покрывать SQS за дополнительную плату.
Архитектура
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
PUSH (розетки) | Веб-служба HTTP | Веб-служба HTTP |
Beanstalkd
Связь через PUSH-сокеты обеспечивает мгновенную связь между поставщиками и работниками.
Когда поставщик ставит работу в очередь, работник может зарезервировать ее немедленно, если она подключена и готова. Задания резервируются до тех пор, пока работник не отправит ответ (удалить, похоронить и т. Д.)
IronMQ
SQS — это размещенный веб-сервис RESTful.
В IronMQ есть поддержка типа push. Абонент может быть вызван всякий раз, когда поставщик ставит задание в очередь. Как правило, вы хотите использовать стандартный сервис RESTful для постановки в очередь и удаления из очереди заданий вместо принудительного подхода.
SQS
SQS — это размещенный веб-сервис.
Для SQS нет push-поддержки. Вы должны регулярно опрашивать, чтобы проверить, есть ли задания в очереди.
SQS может использовать длительный опрос, известный как время ожидания Message Receive Wait Time
Это может означать меньшее количество запросов и большее время открытия сокетов.
Клиентские библиотеки
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
Открытый источник | официальный | официальный |
Beanstalkd
Существует множество клиентских библиотек с открытым исходным кодом Beanstalkd, доступных на множестве языков программирования. Это все независимые проекты от Beanstalkd.
IronMQ
Клиентские библиотеки IronMQ предоставляются Iron.IO и могут быть загружены из Центра разработки.
Вы также можете использовать клиентскую библиотеку Beanstalkd с IronMQ, если вам нужна гибкость переключения между двумя сервисами; однако некоторые команды (например, kick, bury) не поддерживаются. Вам также может понадобиться реализовать команду oauth вручную для подключения к службе.
SQS
Клиентские библиотеки AWS включают клиентские библиотеки SQS. Они предоставляются Amazon и доступны на многих языках программирования.
Интерфейс управления
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
Открытый источник | Приборная доска | Приставка |
Beanstalkd
Графический интерфейс управления по умолчанию не распространяется. Есть несколько проектов с открытым исходным кодом, которые помогут с отладкой и администрированием, которые можно найти на странице инструментов Beanstalkd .
IronMQ
Панель инструментов IronMQ управляет очередями. Он содержит полезное руководство, описывающее, как настроить очереди, и показывает, как добавлять задания (IronMQ: messages) в очередь через cURL.
Интерфейс позволяет вам управлять своими очередями на AJAX-управляемом веб-сайте. Вы можете создавать, читать и удалять задания, просматривать историческую информацию и управлять конфигурацией очередей в представлении панели мониторинга.
SQS
Консоль управления AWS позволяет управлять SQS. Интерфейс построен поверх протокола без сохранения состояния, поэтому вам нужно нажать кнопку обновления, чтобы получить актуальную информацию.
Вы можете создавать, читать и удалять задания (SQS: сообщения) и управлять настройкой очереди.
избыточность
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
Сторона клиента | Облако основе | Облако основе |
Beanstalkd
Избыточность обрабатывается на стороне клиента, и если сервер выйдет из строя, вы потеряете работу.
В Beanstalkd есть возможность хранить задания в двоичном журнале. Вы должны запустить Beanstalkd с параметром -b
IronMQ
IronMQ — это облачный сервис с высокой устойчивостью, доступностью и избыточностью.
SQS
Задания хранятся на нескольких серверах в размещенной зоне. Такой подход гарантирует доступность услуги и рабочие места никогда не должны быть потеряны.
Безопасность
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
Никто | знак | Ключ и секрет |
Beanstalkd
Для подключения к Beanstalkd аутентификация не требуется. Провайдеры могут ставить в очередь рабочие места, а работники могут резервировать рабочие места без прохождения модели безопасности. По этой причине настоятельно рекомендуется создать брандмауэр, блокирующий внешние подключения к порту, на котором работает Beanstalkd.
IronMQ
Вы можете пригласить соавторов через настройки проекта, чтобы использовать ваши очереди сообщений. Аутентификация в приложении выполняется с помощью токена Iron.IO и идентификатора проекта.
SQS
Аутентификация в SQS осуществляется через ключ и секретный ключ Amazon API. Разрешения могут быть предоставлены и отозваны для других учетных записей AWS для доступа к вашим очередям через Консоль управления AWS.
скорость
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
Быстро | Интернет задержки | Интернет задержки |
Beanstalkd
Beanstalkd очень быстрый, так как он должен быть в той же сети, что и его провайдеры и работники. Beanstalkd иногда может быть настолько быстрым, что если провайдер помещает задание в очередь и следует за ним с вызовом MySQL, работник может забрать вашу работу до того, как MySQL завершит выполнение.
IronMQ
Запросы имеют повышенную задержку, поскольку они отправляются в веб-службу IronMQ RESTful через HTTP.
SQS
Запросы имеют повышенную задержку при отправке в веб-службу SQS через HTTP.
Задания не могут быть получены сразу, поскольку они должны быть распределены по различным серверам и центрам обработки данных. Эта задержка должна быть незначительной, если приложение, поставщик или работник размещены в экземпляре EC2.
Когда вы ставите задание в очередь в SQS, оно может быть недоступно сразу. Задания должны распространяться на другие серверы. Обычно это не более одной секунды.
верность
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
ФИФО | ФИФО | Нет гарантий |
Prioritisable | Нет приоритета | Нет приоритета |
Beanstalkd
Очереди FIFO (первым пришел, первым вышел). Рабочие места с более высокой важностью могут быть расставлены по приоритетам, которые будут влиять на порядок, в котором рабочие места сняты.
IronMQ
Очереди FIFO (первым пришел, первым вышел). Рабочие места не могут быть приоритетными.
SQS
Задания не будут выходить в том же порядке, в котором они попали в очередь. Поскольку SQS является распределенной службой, задания будут доступны на каждом сервере в разное время. Это то, что нужно остро осознавать при проектировании для SQS.
Одноразовый пикап
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
гарантированный | гарантированный | Не гарантировано |
Однократный захват описывает ограничение, что, если рабочий не истек, два или более рабочих никогда не будут выполнять одно и то же задание параллельно.
Beanstalkd
Архитектура на основе сокетов Beanstalkd обеспечивает однократное срабатывание.
IronMQ
IronMQ гарантирует одноразовый пикап.
SQS
Поскольку SQS является распределенным сервисом, нет гарантии для одноразового получения (но это маловероятно).
Безотказный
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
Зомби розетка | Тайм-аут | Тайм-аут |
Beanstalkd
Задания автоматически возвращаются в очередь, если работник не отвечает на Beanstalkd в течение заданного промежутка времени или если сокет закрывается без ответа на задание.
Затем он готов к немедленному подбору следующим запрашивающим работником (его не нужно пинать).
IronMQ & SQS
Рабочие подключаются к очереди и резервируют работу. С этого момента у работника есть определенное количество времени, чтобы удалить задание из очереди, прежде чем оно будет освобождено, и оно станет доступным для резервирования работниками.
Создание новых очередей
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
автоматическая | Авто и руководство | Руководство |
Beanstalkd
Очереди (Beanstalkd: трубы) автоматически создаются, когда задания ставятся в очередь. Их не нужно создавать вручную.
IronMQ
Требует от вас создания проекта на панели инструментов. Один проект содержит много очередей. Очереди могут создаваться автоматически при постановке в очередь заданий или вручную с помощью конфигурации из панели мониторинга.
SQS
Очереди должны быть настроены вручную из консоли управления AWS для SQS. Каждая очередь генерирует уникальный URL-адрес, который действует как имя очереди.
Обратите внимание на регион (например, us-west-1, eu-west-1 и т. Д.), К которому принадлежит очередь, так как она требуется для подключения к SQS.
Фреймворк интеграции
Laravel
Платформа Laravel имеет превосходную встроенную оболочку, которая инкапсулирует очереди сообщений для Beanstalkd, IronMQ и Amazon SQS. Вы можете изменить серверы через конфигурацию, не изменяя ни одно из ваших приложений.
Примеры кода PHP
Эти примеры кода показывают, как вы можете подключиться к серверу, поставить в очередь, зарезервировать и удалить очередь из очереди. Если сгенерировано исключение, оно похоронит задание (если сервер его поддерживает).
Попробуйте остановить выполнение после того, как задание было поставлено в очередь, и используйте инструмент управления для отладки своей очереди.
Beanstalkd
composer.json
{
"require": {
"pda/pheanstalk": "dev-master"
}
}
beanstalkd.php
<?php
/* 1. Setup & connect */
// Include composer libraries
require 'vendor/autoload.php';
$queue_name = 'default';
$job_data = 'lorem ipsum';
$beanstalkd = new Pheanstalk_Pheanstalk('127.0.0.1:11300');
/* 2. Provider */
// Enqueue a job
$beanstalkd
->useTube($queue_name)
->put($job_data);
/* 3. Worker */
// Loop through all jobs
while ($job = $beanstalkd->watch($queue_name)->reserve(5)) {
try {
$job_data = $job->getData();
echo $job_data . PHP_EOL;
// Dequeue a job
$beanstalkd->delete($job);
} catch (Exception $e) {
// Bury a job
$beanstalkd->bury($job);
echo $e->getMessage();
}
}
IronMQ
composer.json
{
"require": {
"iron-io/iron_mq": "dev-master"
}
}
iron_mq.php
<?php
/* 1. Setup & connect */
// Include composer libraries
require 'vendor/autoload.php';
$queue_name = 'default';
$job_data = 'lorem ipsum';
$iron_mq = new IronMQ(array(
'token' => '{token}',
'project_id' => '{project_id}'
));
/* 2. Provider */
// Enqueue a job
$iron_mq->postMessage($queue_name, $job_data);
/* 3. Worker */
// Loop through all jobs
while ($job = $iron_mq->getMessage($queue_name)) {
try {
$job_data = $job->body;
echo $job_data . PHP_EOL;
// Dequeue a job
$iron_mq->deleteMessage($queue_name, $job->id);
} catch (Exception $e) {
// Bury a job
// There is no bury in IronMQ
echo $e->getMessage();
}
}
SQS
composer.json
{
"require": {
"aws/aws-sdk-php": "2.4.*@dev"
}
}
sqs.php
<?php
/* 1. Setup & connect */
// Include composer libraries
require 'vendor/autoload.php';
$queue_name = 'https://sqs.{region}.amazonaws.com/{id}/{queue_name}';
$job_data = 'lorem ipsum';
$aws = \Aws\Common\Aws::factory(array(
'key' => '{key}',
'secret' => '{secret}',
'region' => '{region}'
));
$sqs = $aws->get('sqs');
/* 2. Provider */
// Enqueue a job
$sqs->sendMessage(array(
'QueueUrl' => $queue_name,
'MessageBody' => $job_data
));
/* 3. Worker */
// Handle one job
$result = $sqs->receiveMessage(array(
'QueueUrl' => $queue_name
));
if (!$result) {
// No jobs
exit;
}
$messages = $result->getPath('Messages');
if (!$messages) {
// No jobs
exit;
}
foreach ($messages as $message) {
try {
$job_data = $message['Body'];
echo $job_data . PHP_EOL;
// Dequeue a job
$sqs->deleteMessage(array(
'QueueUrl' => $queue_name,
'ReceiptHandle' => $message['ReceiptHandle']
));
} catch (Exception $e) {
// Bury a job
// There is no bury in SQS
echo $e->getMessage();
}
}
Советы по очередям сообщений
Независимо от того, какой сервис вы выберете, вот несколько советов по поддержанию надежности ваших очередей:
Сериализация метаданных
Ваша работа может содержать любые данные, которые вам нравятся, при условии, что они находятся в пределах размера данных работы сервера. Используйте JSON в своем теле работы, чтобы метаданные легко передавались.
// Encode for enqueuing:
$raw_data = (object) array('id' => 100);
$job_data = json_encode($raw_data);
// Decode from dequeuing:
$raw_data = '{"id":100}';
$job_data = json_decode($raw_data);
Ограничьте размер данных вашей работы
Старайтесь не переполнять задания слишком большим количеством метаданных. Если вы можете хранить некоторую информацию в базе данных и ставить в очередь только идентификатор для последующей обработки, ваша очередь будет более надежной и более легкой для отладки.
// Good:
$raw_data = (object) array('id' => 100);
// Not as good ...
// But sometimes necessary when there is
// no database access on a worker:
$raw_data = (object) array(
'id' => 100,
'color' => 'black',
'background' => 'white'
);
Следите за состоянием работы
Если по какой-то причине уже обработанный элемент снова попадает в очередь, вы, вероятно, не хотите, чтобы он был повторно обработан. К сожалению, данные задания не обязательно должны быть уникальными, и важно следить за состоянием задания в базе данных.
Это может быть так же просто, как наличие столбца в таблице заданий, чтобы пометить элемент как обработанный. Вы можете удалить задание из очереди, если оно уже было обработано.
терминология
Некоторые слова по-разному используются в Beanstalkd и Amazon SQS. Есть быстрый список переводов:
Beanstalkd | Amazon SQS | IronMQ |
---|---|---|
туба | Очередь | Очередь |
работа | Сообщение | Сообщение |
Данные о работе | Тело сообщения | Тело сообщения |
Положил | Отправить сообщение | ПОЧТА |
резерв | Получить сообщение | ПОЛУЧИТЬ |
удалять | Удалить сообщение | УДАЛЯТЬ |
TTR (время запуска) | Тайм-аут видимости | Тайм-аут |
задержка | Задержка доставки | задержка |
— | Срок хранения | Истекает |
глоссарий
При работе с очередями вы можете встретить следующие условия:
Bury (a job)
Задание не может быть повторно обработано, пока оно не будет возвращено в очередь вручную. Не поддерживается IronMQ и SQS.
Consumer
Delay
Delete (a job)
Dequeue
Enqueue
FIFO
Это наиболее распространенный тип очереди сообщений.
FILO
Job
Сродни строкам базы данных.
Kick (a job)
Не поддерживается IronMQ и SQS.
Provider
Queue
Сродни таблицам базы данных.
Reserve (a job)
Worker
Они выполняют трудоемкую часть обработки.
Вывод
Для служб очереди сообщений нет серебряной пули. Beanstalkd, IronMQ и Amazon SQS имеют свои сильные и слабые стороны, которые могут быть использованы в ваших интересах. Эта статья должна предоставить вам достаточно информации, чтобы помочь вам принять обоснованное решение о том, какой сервис лучше всего подходит для вашего уровня квалификации и потребностей проекта.
Какой сервис очереди сообщений вы будете использовать? Если вы в настоящее время используете очереди, рассмотрите возможность переключения? Вы использовали нетрадиционные очереди сообщений, которые могли бы помочь другим? Оставьте комментарий и дайте знать всем.