Статьи

Очереди сообщений: сравнение Beanstalkd, IronMQ и Amazon SQS

Вступление

Эта статья знакомит с концепцией очередей сообщений и обсуждает сильные и слабые стороны трех конкретных служб очереди сообщений: 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 имеют свои сильные и слабые стороны, которые могут быть использованы в ваших интересах. Эта статья должна предоставить вам достаточно информации, чтобы помочь вам принять обоснованное решение о том, какой сервис лучше всего подходит для вашего уровня квалификации и потребностей проекта.

Какой сервис очереди сообщений вы будете использовать? Если вы в настоящее время используете очереди, рассмотрите возможность переключения? Вы использовали нетрадиционные очереди сообщений, которые могли бы помочь другим? Оставьте комментарий и дайте знать всем.