Начало работы Очередь сообщений Rabbitmq, см. Эту статью достаточно

RabbitMQ

предисловие

Что касается очередей сообщений, то автор смутно помнит, что когда я много лет назад только заканчивал стажировку, в связи с необходимостью бизнеса был период исследований, целью которых было внедрение более качественного промежуточного программного обеспечения очередей сообщений. для решения проблемы хранения данных компании и проблемы передачи данных в компьютерном зале в штаб-квартире, к сожалению, на тот момент автор был еще неопытен и не имел более глубокого понимания очередей сообщений.

Однако из-за потребностей разработки я недавно начал изучать очереди сообщений и организовал свои учебные заметки в эту статью для ознакомления.

что такое очередь

очередь(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,headersheadersОбычно не используется.

  • 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Большинство точек знаний в статье, поэтому, ввиду ограниченного уровня автора, объяснение в статье неверно или недостаточно, прошу указать, буду очень признателен!


Если вы считаете, что статья хороша, отсканируйте код, чтобы следовать ему. Ваше внимание — самая большая мотивация для моего письма.