предисловие
Что касается очередей сообщений, то автор смутно помнит, что когда я много лет назад только заканчивал стажировку, в связи с необходимостью бизнеса был период исследований, целью которых было внедрение более качественного промежуточного программного обеспечения очередей сообщений. для решения проблемы хранения данных компании и проблемы передачи данных в компьютерном зале в штаб-квартире, к сожалению, на тот момент автор был еще неопытен и не имел более глубокого понимания очередей сообщений.
Однако из-за потребностей разработки я недавно начал изучать очереди сообщений и организовал свои учебные заметки в эту статью для ознакомления.
что такое очередь
очередь(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 -vpwd/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Обычно не используется.
-
fanout: этот тип не обрабатывает ключи маршрутизации (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Большинство точек знаний в статье, поэтому, ввиду ограниченного уровня автора, объяснение в статье неверно или недостаточно, прошу указать, буду очень признателен!
Если вы считаете, что статья хороша, отсканируйте код, чтобы следовать ему. Ваше внимание — самая большая мотивация для моего письма.