SQS против RabbitMQ

88

Мне нужно создать очередь на обработку. Сама очередь имеет относительно небольшой объем. В него может быть записано около 1000 записей в час. Выполнение каждой задачи может занять около минуты каждая и обрабатываются почти сразу после добавления элемента в очередь.

Есть ли причина, по которой я могу захотеть реализовать RabbitMQ вместо чего-то готового, например Amazon SQS? По каким причинам приложению может потребоваться собственная система очередей вместо чего-то вроде SQS?

Давид542
источник
1000 записей в час - это нормально. Если у вас есть время и достаточно знаний, запустите инстанс RabbitMq самостоятельно, это тоже экономит деньги по сравнению с сервисом Amazon SQS. Для SQS это просто было. Это было удобно, просто и довольно быстро кодировать.
BMW
С SQS вы получаете расширяемость и масштабируемость лямбда-триггеров.
Donato

Ответы:

98

Во-первых, Amazon SQS - это псевдо-очередь, что означает, что доставка каждого сообщения (если оно попадает в очередь) гарантирована, но не в режиме FIFO, который обычно происходит в очереди.

Если для вас важен порядок сообщений и вы хотите, чтобы очередь работала в режиме FIFO, в документации Amazon SQS указано, что это необходимо для обработки в логике вашего приложения, поскольку сообщения из Amazon SQS будут поступать к вам не по порядку.

По сравнению с этим, насколько мне известно, вы можете реализовать рабочие очереди в RabbitMQ. Если это избавляет вас от реализации последовательности сообщений очереди на уровне приложения, то этот вариант будет более предпочтительным.

Вот несколько факторов, которые помогут вам решить, какой из них выбрать:

  1. Последовательность сообщений в очереди, как указано выше.

  2. Вы можете настроить свой собственный сервер с RabbitMQ, но не в случае с Amazon SQS, поэтому здесь будут задействованы затраты.

  3. Для настройки вашего собственного сервера потребуется хорошее знание предмета, чтобы вы не оставили ни один уголок нетронутым. Это не относится к Amazon SQS, поскольку с ним довольно быстро начать работу.

  4. Ваш собственный сервер RabbitMQ требует дополнительных затрат на обслуживание, чего нельзя сказать о Amazon SQS.

Обновления:

  1. Amazon SQS теперь поддерживает очереди FIFO.
Номан Ур Рехман
источник
5
Что вы имеете в виду под словами «Amazon SQS имеет широкую переносимость практически со всеми основными платформами, не уверен, что это относится к RabbitMQ». RabbitMQ работает на всех основных платформах (Windows, Linux и Mac), а также на всех основных языках (Java, .Net, PHP, Python, Ruby и т. Д.)
old_sound
6
@old_sound Разница в том, что при запуске SQS вы платите только за использование (отправка и получение сообщений), в то время как RabbitMQ имеет скрытые затраты (превышающие использование EC2) на обеспечение того, чтобы служба работала, отслеживалась и исправлялась, включая как приложение, так и лежащее в основе Операционная система. С SQS AWS позаботится обо всей этой «недифференцированной тяжелой работе», так что вы можете просто сосредоточиться на своем приложении.
Джаред Хэтфилд
27
Amazon SQS теперь поддерживает FIFO
rocketspacer
6
Пожалуйста, обновите верхнюю часть сообщения, чтобы показать, что теперь он поддерживает очереди FIFO, я почти перестал читать, когда прочитал это
Энди Маккалоу
11
-1 Этот ответ действительно требует внимания, чтобы быть полезным. Предложения: полностью удалить ограничение FIFO, сосредоточиться на IaaS - масштабировании, конфигурации и т. Д. - и различиях в доставке сообщений (например, опрос).
Бретт
69

Я бы предпочел SQS над RabbitMQ, и вот почему.

  1. SQS - это управляемая услуга. Таким образом, вам не нужно беспокоиться об операционных аспектах работы системы обмена сообщениями, включая администрирование, безопасность, мониторинг и т. Д. Amazon сделает это за вас и окажет поддержку, если что-то пойдет не так.
  2. SQS является эластичным и может масштабироваться до очень больших объемов / объемов (без ограничений в соответствии с AWS;))
  3. Доступность SQS имеет много девяток и поддерживается Amazon, что на одну проблему меньше, чем нужно беспокоиться в вашем приложении.

Однако RabbitMQ может обеспечить более быстрое время отклика для операций ввода и вывода, как правило, в десятки тысяч TPS по результатам моего тестирования. Чтобы SQS обеспечил такую ​​пропускную способность, вам придется масштабировать по горизонтали с несколькими экземплярами. Поэтому, если вы ищете путы менее 5 мс, RabbitMQ может быть вариантом для рассмотрения, потому что я видел время задержки около 20-30 мс при тестировании SQS при 1000 с TPS, что немного выше, чем у RabbitMQ.

Мы только что переместили нашу инфраструктуру обмена сообщениями с ActiveMQ на SQS, и мы не можем быть более счастливыми. Мы обнаружили, что это дешевле, чем поддерживать собственный кластер ActiveMQ в облаке.

Надеюсь это поможет! Сообщите нам, как это происходит ...

ссекхар
источник
@ssekhar Мы также планируем перенести activemq на SES. Насколько велики изменения на стороне клиента? Мы на java и последней версии activemq.
Дипак Сингхал
Я много лет запускал приложения на основе SQS со средней задержкой ввода около 7 мс на передачу - если вы получаете 20-30 мс, значит, что-то ужасно не так, либо в ваших измерениях, либо в вашем тесте. Вы работаете в том же регионе AWS / AZ? Как вы измеряете?
Krease
1
@DeepakSinghal - Я уверен, что вы, наверное, уже нашли ответ на свой вопрос. Извините за опоздание на несколько лет, чтобы уловить вопрос здесь :). Переход от ActiveMQ к SQS. Вот некоторые проблемы, с которыми нам пришлось столкнуться. 1) SQS предоставляет гарантию доставки хотя бы один раз, а не один раз и только один раз, как JMS, поэтому нам пришлось решить проблему дублирования доставки (наш подход, показанный здесь -> angularthinking.blogspot.com ) 2) SQS использует шаблон извлечения vs. проталкивать клиентов, как в JMS, что упрощает потребление. Мы внедрили собственный слушатель и процессор асинхронной доставки, чтобы упростить разработку.
ssekhar
27

Я фактически использовал оба в коммерческой среде с разумными.

Короткий ответ: если нет особых угловых случаев, лучше использовать AWS SQS. (Вы можете перейти к нижней части, чтобы получить простое резюме)

Кодирование (галстук): RabbitMQ и AWS SQS имеют установленные библиотеки и множество примеров.

Тайм-аут видимости (SQS): одна вещь, которую SQS предлагает поверх RabbitMQ, - это более широкое понятие тайм-аута видимости. В RabbitMQ, если потребитель умирает до того, как подтвердит, сообщения возвращаются в очередь. Но SQS имеет более широкое понятие тайм-аута видимости, которое не привязано к конкретному вызывающему абоненту. Таким образом, вы можете запустить единицу работы, установить видимость с большим таймаутом (до 12 часов), отключиться, закончить работу другого работника и подтвердить его. В моем дизайне мы широко использовали это и исключили дополнительное обслуживание / хранилище для управления потенциально большими «незавершенными» полезными нагрузками.

Обработка недоставленных писем (RabbitMQ - «зайцем») SQS обеспечивает базовую обработку недоставленных писем в том, что они называют «политикой перезагрузки», которая выгружает сообщения в очередь недоставленных писем (просто еще одну очередь). Он базовый и имеет только понятие количества сообщений. RabbitMQ имеет обмен мертвыми буквами, который обеспечивает отправку сообщений в DLE по истечении срока их действия. Но это своего рода спорный вопрос, поскольку идея «Если вы не наблюдаете за истечением срока действия ваших служб и сообщений, то они попадут в DLE». Для RabbitMQ это небольшая победа, поскольку я считаю этот аргумент интуитивно понятным. Почему вам нужно следить за своей очередью, а не за услугами? (Во всяком случае, это наоборот)

Администрирование (SQS): в SQS нет администрирования. Вы просто платите за вызовы API. Все обычные головные боли, такие как исправления безопасности ОС / приложений, масштабирование (добавление дополнительных узлов), диск, выполняются командами AWS. Он также совместим с FedRamp (для использования в правительстве). Это действительно система «установил и забыл». В то время как RabbitMQ требует обычных исправлений ОС / сервисов, AMI, кластеризации, усиления безопасности и т. Д. Хотя это крайне редко, AMI могут выйти из строя или иногда их нужно перемещать, поэтому кластеризация необходима из коробки. SQS устраняет все эти головные боли.

СТОИМОСТЬ (SQS): один вызов SQS API может включать «пакет до 10 сообщений / размер 256 КБ», а «длинный опрос» может значительно снизить стоимость. Кроме того, существуют стратегии, такие как сжатие сообщений для отправки десятков (некоторые утверждают, что сотни и более) сообщений могут быть отправлены в одной полезной нагрузке для дальнейшего снижения затрат. И это без учета времени, которое люди тратят на мониторинг / исправление / исправление проблем. SQS также отлично подходит для «poc-проектов», как будто он простаивает без каких-либо затрат.

FIFO (TIE): в 2016 году AWS представила поддержку FIFO за дополнительную плату в размере ~ 0,01 доллара США за миллион вызовов API (0,05 доллара США против 0,04 доллара США за миллион всех API - без учета скидок). Вы можете использовать FIFO или нет. Для не-FIFO мы редко видим повторяющиеся сообщения.

Хранилище (SQS): AWS не взимает плату за хранилище, но у вас есть ограничение в 14 дней. В RabbitMQ вам придется выделять, расширять и управлять дисковым пространством, для чего требуется пиковая емкость хранилища плюс дополнительные буферы. Просто больше головной боли.

Метрики (SQS): SQS предоставляет готовые метрики. И хотя вы можете добавить их в AWS, это просто больше работы.

Местный разработчик (галстук): Большинству современных магазинов нравится местная обстановка. Есть несколько опций, которые теперь позволяют докеры RabbitMQ и SQS.

Высокая пропускная способность / очень большое сообщение (RabbitMQ - вроде). Когда вы нажимаете SQS> 1000 запросов / сек, задержка SQS будет увеличиваться. Есть несколько способов обойти это. Но я считаю, что такие случаи крайне редки, поскольку большую часть работы можно разделить на несколько очередей. Но для таких случаев, когда требуется 100k / sec, я думаю, что Kafka лучше. (Мы также используем Kafka в моей работе) Редко есть одна единица работы, которая требует 1000+ запросов в секунду с низкой задержкой. * См. Это объяснение ниже

Резюме: если вы собираетесь работать в AWS и хотите выйти замуж за SQS, то SQS - это не проблема. Но вы должны читать дальше, поскольку есть важные вещи, которые следует учитывать.

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

Новая стратегия позволила моим командам лучше понять, как распределяется работа. Прошли те времена, когда «обновлял инстанс для большей нагрузки». В прошлом мы видели большой необъяснимый всплеск, который вызывал бы побочные эффекты для других сервисов, или просто предполагали, что совокупные числа выглядят примерно одинаково ». Теперь, когда трафик разделен, мы фактически обнаружили многие проблемы, которые раньше оставались незамеченными, и можем четко объяснить, сколько трафика куда идет. И хотя очень возможно реализовать метрики и инструменты, SQS предоставляет все это из коробки.

Есть еще отличные случаи, когда RabbitMQ следует серьезно рассмотреть

- Very large legacy code base that uses RabbitMQ with extensive tooling and knowledgeable support staff
- Messages that needs to be in the same work stream for > 14 days
- Very large messages that has very low latency requirements with it
- Cloud agnostic code base requirements. If you must run your code on other platforms (e.g. Azure/Google/bare metal), then SQS is not an option
- Large volume of data for a single pipeline that can't be broke up and other solutions (e.g. Kafka) are not viable. But at a super large volume, Kafka is a lot faster. While SQS will push large payloads to S3, you are now incurring additional cost.
Ли
источник
4

Если вы чувствительны к стоимости, Amazon SQS, вероятно, окажется более дорогим. Я говорю, вероятно, потому что вам все еще нужно где-то разместить свой сервер RabbitMQ. SQS дает вам первый миллион запросов бесплатно, а после этого взимает 0,4 доллара за миллион запросов. Есть уловка, позволяющая снизить ваши расходы с помощью SQS, хотя можно включить длинный опрос, то есть установить для параметра receive_message_wait_time значение 20 секунд. Это не означает, что ваши сообщения будут отправляться только каждые 20 секунд, это скорее означает, что SQS не будет взимать плату за «запрос», если ваша очередь пуста (каждые 20 секунд).

Если вы используете 1000 запросов в час, вы получаете 744000 в месяц. Бесплатно в рамках бесплатного уровня и около 0,74 * 0,4 доллара США = 0,2976 доллара вне уровня. Что вы, вероятно, могли бы еще больше уменьшить, включив время ожидания. Таким образом, в вашем случае SQS может работать дешевле, поскольку большинство хостингов начинается как минимум от 5 долларов США (если у вас нет уровня бесплатного пользования EC2 от AWS). Вы должны быть в порядке с самым маленьким вариантом, поскольку RMQ рекомендует запускать только 128 МБ оперативной памяти.

Я считаю, что SQS намного удобнее для пользователя, а RabbitMQ более техничен, если вы к этому склонны.

Обновить:

На самом деле я нашел AWS Simple Notification Service более подходящим для того, что мне было нужно https://stackoverflow.com/a/13692720/5403449 в первую очередь потому, что он основан на push, то есть не на опросе

Джош
источник