# Сравнение очередей Основные показатели, по которым можно оценивать очереди, это: 1. Кластеризуемость (суб-линейная масштабируемость) 2. Надёжность (durability) 3. Гарантия доставки (<1, >1), подтверждение доставки 4. Доступность или консистентность (как и БД) 5. Функциональность очередей (маршрутизация, приоритеты, отложенные задачи, балансировка, pub-sub) 6. Поддержка протоколов, удобство подключения, наличие SDK 7. Обслуживание и мониторинг 8. Потребление ресурсов На сегодняшний день рынок очередей можно вкратце разделить на следующие группы: 1. AMQP based. Подавляющее большинств решений написаны на Java и находятся под "зонтиком" Apache Foundation. Обладают обширной функциональностью одередей, pub/sub'а и диспетчеризации, но крайне плохо масштабируются горизонтально Основные игроки: * [ActiveMQ](https://activemq.apache.org/) + Java. Нет своего стораджа. Нет HA. (Обеспечивается стораджем). + посредственная производительность (~ 5krps) + посредственное поведение при переполнении (деградация) + Высокое потребление ресурсов CPU/RAM + Система для средней нагрузки, с RDBMS хранилищами может использоваться для высокой транзакционной целостности * [RabbitMQ](https://www.rabbitmq.com/) + Erlang. В Single режиме работает хорошо. Кластерных режимов много, но работают плохо. Может терять сообщения, может "не взлетать" + хорошая производительность single (~ 20krps) + плохое поведение при переполнении и развале кластера (отказ в обслуживании, ресинк переполненного кластера может занимать часы) + Высокое потребление ресурсов CPU/RAM + Система для средней нагрузки, "поставил и работает", без требований к HA 24/7 2. [Kafka](https://kafka.apache.org). Изначально создаваемая, как распределённый лог транзакций, обросла обширной функциональностью очередей. С одной стороны базовая инсталляция довольно не самая простая (требует дополнительно Zookeeper), но обладает отличными эксплуатационными характеристиками за счёт удачной архитектуры. Обладает дополнительной возможностью в сравнении с классическими очередями в виде множественных потребителей на один поток данных (позволяет организовывать reactive flow) + Java. + Почти линейно масштабируется. + Встроенный HA за счёт использования Zookeeper, высокодоступная + Высокая гарантия доставки с ≈1 + высокая производительность (100krps+, ограничена скоростью записи на диск) + Capacity ограничена только дисковым хранилищем + хорошее поведение при переполнении и развале кластера (понятное, легко управляемое и устраняемое). ресинк кластера выполняется за секунды + Умеренное потребление ресурсов CPU/RAM + Система для высоконагруженного надёжного процессинга потоков данных с возможностью использовать множественных потребителей 3. Распределённые, децентрализованные системы. Обладают крайне высоким уровнем доступности и почти линейным масштабированием при достаточных гарантиях на надёжность доставки. Хороший пример: * [NSQ](https://nsq.io) + Golang. + Почти линейно масштабируется. + Высокодоступная. + Высочайшая производительность (800krps+ / 3 node cluster) + Умеренная гарантия доставки + Сложнореализуемая durability + Система для высоконагруженного онлайна 24/7, когда сообщение из потока можно потерять 4. [Tarantool (Queue)](https://github.com/tarantool/queue). Не является брокером очередей в классическом понимании. Это библиотека на lua, написанная поверх базы данных. Может использоваться как noHA в режиме single-instance. Может использоваться как элемент кластера. Выбор топологии кластера и сборка первоначально осуществляется вручную. Возможны многие режимы работы в зависимости от задачи (можно собрать High HA, Scalable, Durable, Non-durable, >1, <1). При использовании дополнительных модулей (или их самостоятельной реализации) можно реализовать произвольную логику по работе с задачами. Основные недостатки: отсутствие готовых механизмов переключения мастера (может быть решено при помощи etcd/zookeeper), отсутствие синхронной репликации (не позволяет реализовать одновременно автофейловер и ≈1). Имеются [альтернативные](https://github.com/moonlibs/xqueue) реализации + C/Lua. + Почти линейно масштабируется. + Хорошая производительность single node (20krps) + Конфигурируемые топологией durability и HA + Низкое потребление CPU, высокое потребление ресурсов RAM + хорошее поведение при переполнении (переход в RO) + хорошее поведение при развале кластера (легко управляемое и устраняемое). ресинк кластера выполняется за секунды + Система для построения производительного решения с заданными характеристиками по надёжности и доступности и произвольной дополнительной логикой 5. Brokerless. Единственный более менее популярный пример — [ZeroMQ](https://zeromq.org/). Представляет из себя инструмент в виде набора библиотек и подходов для построения собственного data-flow. Её иногда называют сокетами на стероидах. Разработка с использованием ZMQ требует высоких компетенций. Не может выступать в роли очереди "взял, поставил — работает". 6. Cloud based. Пример: Amazon SQS. Для потребителя является наиболее удобным вариантом, т.к. является масштабируемым и надёжным, cloud-native вариантом с гарантией доставки ≈1 (>1). * https://dzone.com/articles/exploring-message-brokers * https://medium.com/linagora-engineering/how-to-choose-a-message-queue-247dde46e66c * https://stackshare.io/message-queue