предисловие
Что касается очередей сообщений, то автор смутно помнит, что когда я много лет назад только заканчивал стажировку, в связи с необходимостью бизнеса был период исследований, целью которых было внедрение более качественного промежуточного программного обеспечения очередей сообщений. для решения проблемы хранения данных компании и проблемы передачи данных в компьютерном зале в штаб-квартире, к сожалению, на тот момент автор был еще неопытен и не имел более глубокого понимания очередей сообщений.
Однако из-за потребностей разработки я недавно начал изучать очереди сообщений и организовал свои учебные заметки в эту статью для ознакомления.
что такое очередь
очередь(Queue
) — это обычная структура данных, главная особенность которой — принцип «первым поступил — первым обслужен» (Firist In First Out
), как самые основные структуры данных, очереди, которые широко используются, такие, какими мы их знаемRedis
Основные данные типаList
, базовой структурой данных которой является очередь.
Что такое очередь сообщений
очередь сообщений(Messaeg Queue
) — это распределенный контейнер сообщений, который использует очередь (Queue) в качестве базовой структуры данных хранилища и может использоваться для обеспечения связи между различными процессами и приложениями, также известного как промежуточное ПО сообщений.
В настоящее время чаще используются следующие очереди сообщений:ActiveMQ
,RabbitMQ
,Kafka
,RocketMQ
Ждать.
Что такое RabbitMQ
RabbitMQ
используетсяErlang
Реализация развития языкаAMQP协议
По сравнению с другими очередями сообщений того же типа, самая большая особенность заключается в том, что она гарантирует значительную пропускную способность для одной машины и в то же время очень хорошую задержку.
RabbitMQ
Поддерживаются различные клиенты, такие как:Python
,Ruby
,.NET
,Java
,JMS
,C
,PHP
,ActionScript
,XMPP
,STOMP
Ждать.
AMQP, Advanced Message Queuing Protocol, является открытым стандартом для протоколов прикладного уровня, разработанным для промежуточного программного обеспечения, ориентированного на сообщения.
Сценарии применения очереди сообщений
Очереди сообщений широко используются, и существует множество сценариев применения. Ниже мы перечислим пять наиболее распространенных сценариев.
Новостная рассылка
Основной функцией очереди сообщений является отправка и получение сообщений, и она имеет внутри эффективный механизм связи, поэтому она очень подходит для обмена сообщениями.
Мы можем разработать одноранговую систему чата на основе очередей сообщений
Системы вещания также могут быть разработаны для передачи сообщений большому количеству получателей.
Асинхронная обработка
Как правило, программы, которые мы пишем, выполняются последовательно (синхронное выполнение), например, функция регистрации пользователя, порядок выполнения которой следующий:
- 1. Запишите регистрационные данные пользователя.
- 2. Отправьте регистрационное письмо.
- 3. Отправьте SMS-уведомление об успешной регистрации.
- 4. Обновление статистики.
Согласно приведенной выше последовательности выполнения, только после того, как все выполнения завершены, возврат может быть успешным, но на самом деле, после успешного выполнения первого шага, остальные шаги могут выполняться асинхронно.Мы можем отправить следующую логику в сообщение поставить в очередь, а затем выполнить асинхронно другими программами. , следующим образом:
Использование очереди сообщений для асинхронной обработки может ускорить возврат результатов, повысить скорость ответа сервера и повысить производительность сервера.
Развязка услуг
В нашей системе связь между приложениями очень распространена. Обычно мы звоним напрямую между приложениями. Например, приложение A вызывает интерфейс приложения B. В настоящее время отношения между приложениями сильно связаны.
Если приложение B недоступно, это также повлияет на приложение A.
Очередь сообщений вводится между приложением A и приложением B для развязки службы. Если приложение B зависает, это не повлияет на использование приложения A.
Отсечение трафика
Для системы с высокой степенью параллелизма в часы пиковой нагрузки внезапный поток трафика в прикладную систему подобно наводнению, особенно для некоторых операций записи с высокой степенью параллелизма, что может привести к тому, что сервер базы данных будет парализован в любое время и не сможет продолжать предоставлять услуги. .
Внедрение очередей сообщений может снизить влияние всплесков трафика на систему приложений. Очередь сообщений похожа на «резервуар», который перехватывает наводнение вверх по течению и уменьшает пиковый поток паводка, попадающий в реку вниз по течению, чтобы достичь цели уменьшения паводков.
Наиболее распространенным примером этого является система seckill. Как правило, мгновенный трафик действий seckill очень высок. Если весь трафик направляется в систему seckill, он перегрузит систему seckill. эффективно буферизуется, и может быть достигнут эффект «пиковая обрезка и заполнение долины».
Установка и запуск RabbitMQ
RabbitMQ
служба поддержкиLinux
,Windows
,Unix
,MacOS
и другие операционные системы, мы можем установить соответствующую версию в соответствии с нашей собственной операционной системой.Cnetos7
установить и использоватьDocker
установить.
Более подробную информацию об установке можноПосмотреть официальный сайт
Установка на Cnetos7.
Демонстрация ниже
Erlang
иRabbitMQ
для установки используемrpm
Пакет установки в один клик более удобен и подходит для новичков.
Установка базовой зависимости
Если ваша операционная система является минимальным установочным пакетом для Linux, должно быть много основных зависимостей, которые не установлены.Перед установкой RabbitMQ вам необходимо установить эти основные зависимости.Вы можете запустить следующую команду:
$ sudo yum install openssql openssl-devel make gcc gcc-c++ kernel-devel
Установка Сокат
RabbitMQ
зависит отSocat
, поэтому при установкеRabbitMQ
установить передSocat
,следующее:
$ sudo yum install -y socat
Установить Эрланг
так какRabbitMQ
используетсяErlang
Разработка языка, поэтому установкаRabbitMQ
Перед установкойErlang
Среда выполнения, которую мы используемErlang
лингвистическийrpm
Инсталляционный пакет.
# 下载 $ wget https://github.com/rabbitmq/erlang-rpm/releases/download/v22.3/erlang-22.3-1.el7.x86_64.rpm
安装
$ rpm -ivh erlang-22.3-1.el7.x86_64.rpm
Установите RabbitMQ
После того, как вышеупомянутые зависимости установлены, наконец, мы можем запустить следующую команду для установки RabbitMQ:
# 下载 $ wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3-1.el7.noarch.rpm
安装
$ rpm -ivh rabbitmq-server-3.8.3-1.el7.noarch.rpm
запуск и выключение
После завершения установки вы можете использоватьrabbitmq-server
Команда для запуска сервера выглядит следующим образом:
# 直接启动 $ sudo rabbitmq-server
-detached为可选参数,表示后台开启
$ sudo rabbitmq-server -detached
Запуск прошел успешно, и вывод выглядит следующим образом:
Если вы хотите закрыть, вы можете использовать следующую команду:
#关闭RabbitMQ服务:
$ sudo rabbitmqctl stop
Управление плагинами
Выше мы используемrabbitmq-server
Запустите сервер, вы также можете использоватьrabbitmqctl
Сервер управления командами включает такие операции, как создание переключателей, очередей и управление пользователями.В дополнение к инструменту управления командами RabbitMQ также предоставляет инструмент веб-управления, а инструмент веб-управления является подключаемым модулем RabbitMQ.Если вы хотите открыть его, вы можете использовать следующую команду:
rabbitmq-plugins — это команда для подключаемых модулей управления RabbitMQ.
$ sudo rabbitmq-plugins enable rabbitmq_management
После запуска плагина мы запускаем сервер, и последняя строка показывает, что запущено 3 плагина, а именно:
После перезапуска сервера вы можете открыть браузер для доступа к веб-интерфейсу управления RabbitMQ.
Номер порта программы веб-управления — 15672, и вы можете получить к ней доступ, введя http://localhost:15672 в браузере.
Установка на Докер
Вышеуказанная демонстрация устанавливается непосредственно на операционной системе.RabbitMQ
Процесс, если вы установили локальноDocker
операционной среды, то вы можете загрузитьRabbitMQ
изDocker
Зеркальное изображение для установки, этот метод очень удобен, и вам не нужно устанавливать его самостоятельно.RabbitMQ
полагаться.
Вы можете запросить нужный нам пакет образа RabbitMQ в Docker Hub следующим образом:
мы выбираемtag
Изображение с суффиксом управления указывает на то, что эта версия имеет веб-интерфейс управления.
# 拉取镜像包 docker pull rabbitmq:3.8.3-management
启动镜像
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v
pwd
/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq3.8.3-management
основная концепция
RabbitMQ
Он имеет свой собственный набор основных понятий, и понимание этих понятий очень важно.RabbitMQ
всеобъемлющее понимание.
Broker
Broker
Концепция относительно проста, мы можем положитьBroker
понимается какRabitMQ Server
.
Производитель и потребитель
производитель против потребителяRabbitMQ
Для сервера этоRabbitMQ
Клиент сервера.
- Исполнитель: Подключиться
RabbitMQ
сервер, отправьте сообщение наRabbitMQ
Очередь сервера является отправителем сообщения. - Потребитель: подключиться к
RabbitMQ
Он потребляет сообщения в очереди и является получателем сообщения.
Производители и потребители обычно действуют через наше приложение.
Connection
Connection
даRabbitMQ
Один из внутренних объектов, используемых для управления каждымRabbitMQ
изTCP
Интернет-соединение.
Channel
Channel
И мыRabbitMQ
Самый важный интерфейс для работы, большая часть наших бизнес-операций находится вChannel
делается в этом интерфейсе, включая определениеQueue
,определениеExchange
, связыватьQueue
иExchange
, отправлять сообщения и т. д.
Exchnage
Обмен сообщениями, который получает сообщения от производителей и пересылает сообщения в связанные очереди в соответствии с ключами маршрутизации.
Сообщение, отправленное производителем, должно пройтиExchnage
По привязке (binding
) правила пересылаются в очередь.
тип переключателя (Exchange Type
) Есть четыре:fanout
,direct
,topic
,headers
,вheaders
Обычно не используется.
-
fanou
t: этот тип не обрабатывает ключи маршрутизации (RoutingKey
), как и при широковещании в подсети, каждый хост в подсети получает копию сообщения,опубликовать/подписать модельЭто относится к использованиюfanout
тип переключателя,fanout
Переключатели типов быстрее всего пересылают сообщения. -
direct
: Шаблон обрабатывает ключи маршрутизации и требует наличия очереди с точным ключом маршрутизации для получения сообщений.режим маршрутизациииспользуетdirect
тип переключателя. -
topic
: Ключи маршрутизации и шаблон совпадают.тематический режимиспользуетtopic
тип переключателя.
Режим маршрутизации, режим публикации-подписки, режим темы, об этих режимах работы мы поговорим ниже.
Queue
Queue
, очередь,RabbitMQ
Внутренний объект, используемый для хранения сообщений, представляет собой структуру, которая фактически хранит сообщения.На производственной стороне сообщение производителя, наконец, отправляется в указанную очередь, а потребитель также получает сообщение, подписавшись на определенную очередь.
Binding
Binding
Это операция, в которой устанавливается сообщение от действияExchange
вперед кQueue
правила находятся в разработкеExchange
иQueue
При привязке необходимо указатьBindingKey
, Операция привязки обычно используется дляRabbitMQ
Режим работы маршрута и режим работы темы.
BindingKey
концепции, мы обсудим нижеRabbitMQ
Режим работы будет объяснен подробно.
Virtual Host
Virutal host
Также называется виртуальным хостом,VirtualHost
Ниже представлен набор различныхExchnage
иQueue
,разныеVirtual host
изExchnage
иQueue
не влияют друг на друга.
Изоляция приложений и разделение разрешений,Virtual host
Это наименьшая детальная единица разрешения в RabbitMQ.
По аналогии мы можемVirtual host
по сравнению сMySQL
база данных в , обычно мы используемMySQL
Когда будут назначаться разные базы данных для разных проектов, Аналогично, при использованииRabbitMQ
Когда мы можем указать разные для разных приложенийVirtual host
.
Выше мы перечислили
RabbitMQ
Основные понятия , с помощью следующей схематической диаграммы, мы можем более четко понять взаимосвязь между ними.
Рабочий режим
RabbitMQ
Всего существует шесть режимов работы, а именно: простой режим, режим рабочей очереди, режим публикации/подписки, режим маршрутизации, режим темы иRPC
модель,RPC
Этот режим обычно не используется, поэтому ниже мы говорим только о первых пяти рабочих режимах.
Простой режим
simple
режим, даRabbitMQ
Самый простой режим среди нескольких режимов, его структура показана на следующем рисунке:
Из диаграммы выше мы видим, чтоsimple
Шаблон имеет следующие характеристики:
- Есть только один производитель, один потребитель и одна очередь.
- Производители и потребители для отправки и получения сообщений необходимо только указать имя очереди, не указав, к которой отправлять
Exchange
,RabbitMQ
Сервер будет автоматически использоватьVirtual host
по умолчаниюExchange
,дефолтExchange
изtype
заdirect
.
Режим работы
существуетsimple
В режиме есть только один производитель и потребитель.Когда скорость производителя, создающего сообщения, больше, чем скорость потребления потребителей, мы можем добавить одного или нескольких потребителей, чтобы ускорить потребление.simple
Режим, в котором потребители добавляются в режиме, называетсяwork
режиме, как показано на следующем рисунке:
work
Шаблоны имеют следующие две характеристики:
- Может быть несколько потребителей, но сообщение может быть получено только одним потребителем.
- Сообщения, отправленные в очередь, сервером усредненного потребителя назначены разным потребителям.
Шаблон публикации/подписки (pub/sub)
work
Режим может передавать сообщения нескольким потребителям, но каждое сообщение может быть получено только одним потребителем Что, если мы хотим, чтобы сообщение потреблялось несколькими потребителями одновременно?
В настоящее время требуется режим публикации/подписки, схема которого выглядит следующим образом:
Из схемы выше видно, что в режиме публикации/подписки необходимо указать, на что отправлятьExchange
, X на приведенном выше рисунке представляетExchange
.
- Опубликовать/подписаться на модель,
Echange
изtype
заfanout
. - Когда производитель отправляет сообщение, нет необходимости указывать конкретное имя очереди.
Exchange
Полученное сообщение будет перенаправлено в связанную очередь. - сообщение
Exchange
При переходе к нескольким очередям сообщение может быть получено несколькими потребителями.
режим маршрутизации
В предыдущих режимах целевая очередь сообщения не может быть указана производителем, но в режиме маршрутизации целевая очередь сообщения может быть указана производителем.Схема выглядит следующим образом:
Из приведенной выше диаграммы видно, что режим маршрутизации имеет следующие характеристики:
- в режиме маршрутизации
Exchange
Типdirect
. - За очередью назначения сообщения может следовать производитель
routingKey
Правила уточняют. - Потребители
BindingKey
Связать очереди, о которых вы заботитесь о. - Очередь сообщений может быть получена несколькими отправителями сообщений.
- Только
RoutingKey
иBidingKey
Соответствующая очередь получит сообщение.
RoutingKey
для обозначения производителяExchange
в какую очередь сообщение окончательно направляется,BindingKey
Используется для привязки потребителей к очереди.
тематический режим
Шаблон темы основан на шаблоне маршрутизации и сопоставляет ключ маршрутизации с шаблоном. в#
означает сопоставление нескольких слов,*
Указывает, что оно соответствует слову, и потребители могут подписаться на сообщение темы с помощью определенного шаблона BindKey, как показано на диаграмме ниже:
- Значением типа режима темы Exchange является тема.
- Сообщение может быть получено несколькими потребителями.
Сравнение нескольких распространенных очередей сообщений
КромеRabbitMQ
Кроме того, существует другое более распространенное промежуточное ПО очереди сообщений, такое какKafka
,RocketMQ
,ActiveMQ
Подождите, в следующей таблице перечислены различия между этими типами очередей сообщений:
очередь сообщений | RabbitMQ | ActiveMQ | RocketMQ | Kafka |
---|---|---|---|---|
Аффилированная компания/сообщество | Mozilla Public License | Apache | Ali | Apache |
зрелость | Зрелый | Зрелый | более зрелым | Зрелый |
Метод авторизации | открытый источник | открытый источник | открытый источник | открытый источник |
Язык разработки | Erlang | Java | Java | Scala & Java |
Языки, поддерживаемые клиентом | Официально поддерживает Erlang, java, Ruby и т. д. Сообщество создает API на нескольких языках, поддерживая почти все распространенные языки. | JAVA, C++, pyhton, php, perl, net и т. д. | java,c++ | Официальная поддержка Java, сообщества с открытым исходным кодом имеют несколько языков, таких как php, python, go, c/c++, ruby, node.js и другие языки. |
Поддержка протокола | Поддержка нескольких протоколов AMQP, XMPP, SMTP, STOMP | OpenWire,STOMP,REST,XMPP/AMOP | пользовательский набор | пользовательский протокол |
пакетные операции с сообщениями | не поддерживается | служба поддержки | служба поддержки | служба поддержки |
режим отправки сообщений | Мультипротокол, поддерживаются как pull/push | Поддержка нескольких протоколов pull/push | Мультипротокол, поддерживаются как pull/push | pull |
HA | режим ведущий/ведомый | Master-slave на базе zookeeper+LevelDB | Поддержка режима с несколькими ведущими, режим с несколькими ведущими и несколькими подчиненными, режим асинхронной репликации. | Поддержка механизма репликации, после выхода из строя лидера резервная копия автоматически заменит его, а лидер будет выбран повторно. |
достоверность данных | Это может гарантировать, что данные не будут потеряны, и есть резервная копия ведомого устройства. | master/slave | Поддержка асинхронной прошивки в реальном времени, синхронной прошивки, синхронной репликации и пошаговой репликации. | Надежные данные, механизм реплики, отказоустойчивость и толерантность к катастрофам |
Производительность одной машины | Второй (уровень 10 000) | Худший (уровень 10 000) | Самый высокий (уровень 100 000) | Далее (100 000) |
задержка сообщения | микросекунда | \ | Быстрее, чем кафка | миллисекунда |
Возможность сохранения | Память, файлы, поддержка накопления данных, но накопление данных, в свою очередь, влияет на производительность | Память, файл, файл сенсорного диска базы данных | файл на диске | Дисковые файлы, если места на диске достаточно, вы можете добиться неограниченного накопления сообщений. |
Заказаны | Если вы хотите заказать, вы можете использовать только одного клиента | может поддержать порядок | аккуратный | Несколько клиентов обеспечивают заказ |
дела | служба поддержки | служба поддержки | служба поддержки | не поддерживается |
кластер | служба поддержки | служба поддержки | служба поддержки | служба поддержки |
балансировки нагрузки | служба поддержки | служба поддержки | служба поддержки | служба поддержки |
интерфейс управления | лучше | в целом | Интерфейс командной строки | Официальный предоставляет только версию командной строки |
Метод развертывания | независимый | независимый | независимый | независимый |
резюме
Эта статья объясняет очередьRabbitMQ
концепция, как установитьRabbitMQ
,RabbitMQ
основные концепции и несколько режимов работы, благодаряRabbitMQ
Большинство точек знаний в статье, поэтому, ввиду ограниченного уровня автора, объяснение в статье неверно или недостаточно, прошу указать, буду очень признателен!
Если вы считаете, что статья хороша, отсканируйте код, чтобы следовать ему. Ваше внимание — самая большая мотивация для моего письма.