RabbitMQ с нуля: настройка брокера, очередей и обменников (Exchange) | AdminWiki

RabbitMQ с нуля: настройка брокера, очередей и обменников (Exchange)

18 августа 2026 16 мин. чтения
Содержание статьи

Введение в RabbitMQ: что это и зачем нужно

RabbitMQ - это брокер сообщений с открытым исходным кодом, реализующий протокол AMQP 0-9-1. Он принимает сообщения от производителей (producers), хранит их в очередях и доставляет потребителям (consumers). В отличие от прямого вызова API между сервисами, брокер разрывает жёсткую синхронную связь: отправитель публикует сообщение и продолжает работу, не дожидаясь ответа получателя.

Типичные сценарии использования RabbitMQ: обмен событиями между микросервисами, распределение фоновых задач между воркерами, буферизация пиковых нагрузок, асинхронная интеграция legacy-систем. Брокер гарантирует доставку сообщений за счёт подтверждений (acknowledgements), поддерживает гибкую маршрутизацию через обменники и очереди, а также позволяет изолировать окружения с помощью virtual hosts.

Ключевые компоненты модели AMQP: producer публикует сообщение в exchange, exchange по правилам binding направляет его в одну или несколько queue, consumer подписывается на queue и обрабатывает сообщения. Routing key - строка, которую producer указывает при публикации и которую exchange использует для выбора очереди. Такая архитектура позволяет строить сложные топологии маршрутизации без изменения кода приложений.

Если RabbitMQ используется как транспорт фоновых задач в Python, полезно дополнительно изучить практическое руководство по очередям сообщений в Python.

Архитектура RabbitMQ: ключевые компоненты

Модель AMQP в RabbitMQ состоит из четырёх базовых элементов: сообщение, publisher (producer), consumer и сам брокер. Брокер внутри оперирует виртуальными хостами, обменниками, очередями и связями. Поток сообщения всегда одинаков: producer отправляет сообщение в exchange, exchange сравнивает routing key с правилами binding и кладёт копию сообщения в подходящие очереди, consumer забирает сообщение из очереди и подтверждает обработку.

Virtual Hosts: изоляция окружений

Virtual host (vhost) - это логическое пространство внутри одного экземпляра RabbitMQ. Каждый vhost содержит собственные обменники, очереди, связи и права пользователей. Объекты из разных vhost не видят друг друга. Это позволяет запускать на одном брокере несколько независимых сред: dev, test, prod или разные приложения.

Создать vhost через командную строку:

rabbitmqctl add_vhost /production

Через Management UI: раздел Admin → Virtual Hosts → Add a new virtual host. Имя vhost начинается с косой черты, например /production или /analytics. После создания vhost нужно назначить пользователю права на него: configure, write, read. Без прав пользователь не сможет объявлять очереди или публиковать сообщения в этом vhost.

Exchanges, Queues и Bindings: как маршрутизируются сообщения

Exchange - это точка входа для сообщений. Он не хранит сообщения, а только маршрутизирует их в очереди по заданным правилам. Queue - буфер, где сообщения хранятся до тех пор, пока consumer не заберёт их. Binding - правило, которое связывает exchange с queue через routing key или заголовки.

Простой пример маршрутизации: exchange типа direct с именем app_events связан с очередью error_queue через binding key error. Producer публикует сообщение с routing key error в app_events. Exchange видит точное совпадение и кладёт сообщение в error_queue. Сообщение с routing key info в эту очередь не попадёт, так как binding key не совпадает.

Установка и запуск RabbitMQ

RabbitMQ работает на Linux, Windows и macOS. Для production-окружений рекомендуются Debian/Ubuntu или CentOS/RHEL. Минимальные системные требования: 256 МБ RAM для базовой работы, 2 ГБ и больше для кластеров с высокой нагрузкой. Erlang/OTP устанавливается автоматически как зависимость при установке из официальных репозиториев.

Установка на Ubuntu/Debian

apt update
apt install rabbitmq-server -y
systemctl enable rabbitmq-server
systemctl start rabbitmq-server
systemctl status rabbitmq-server

Статус должен показывать active (running). Если сервис не стартует, проверьте логи: journalctl -u rabbitmq-server -n 50. Частая причина - нехватка памяти или конфликт портов 5672 и 25672.

Установка с помощью Docker

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

Порт 5672 - AMQP для приложений, 15672 - Management UI. Образ rabbitmq:3-management уже включает веб-интерфейс. Для production добавьте volume для данных и задайте hostname: -v rabbitmq_data:/var/lib/rabbitmq -h rabbit@node1. Без hostname контейнер теряет данные при пересоздании, так как имя узла меняется.

Включение Management UI

Если RabbitMQ установлен из пакетов, Management UI отключён по умолчанию. Включите плагин:

rabbitmq-plugins enable rabbitmq_management

После включения веб-интерфейс доступен по адресу http://localhost:15672. Дефолтный пользователь guest с паролем guest может входить только с localhost. Для удалённого доступа создайте отдельного пользователя с правами administrator.

Настройка RabbitMQ через Management UI

Management UI - основной инструмент для ручной настройки и диагностики. Вкладки: Overview (графики и сводка), Connections (активные соединения), Channels (каналы внутри соединений), Exchanges (обменники), Queues (очереди), Admin (пользователи, vhost, политики). Начните с создания изолированного окружения и пользователя.

Создание Virtual Host и пользователя

В разделе Admin → Virtual Hosts нажмите Add a new virtual host, введите имя /production и нажмите Add virtual host. Затем перейдите в Admin → Users → Add a user. Укажите имя, пароль и тег administrator. Тег даёт доступ к Management UI и всем API. После создания откройте пользователя, в блоке Permissions выберите vhost /production и установите все три права: configure, write, read. Нажмите Set permission.

Создание Exchange и Queue

Перейдите на вкладку Exchanges → Add a new exchange. Укажите имя app_events, тип direct, durability Durable. Durable означает, что обменник переживёт перезапуск брокера. На вкладке Queues → Add a new queue создайте очередь error_queue с durability Durable. Затем откройте созданный exchange, в блоке Bindings укажите очередь error_queue и routing key error, нажмите Bind.

Публикация и просмотр сообщений

Откройте вкладку Queues, выберите очередь error_queue. В блоке Publish message введите routing key error, в поле Payload напишите тестовое сообщение, например {"service": "auth", "level": "error"}. Нажмите Publish message. Очередь покажет 1 сообщение в состоянии Ready. Чтобы просмотреть сообщение, разверните блок Get messages и нажмите Get message. Сообщение отобразится в формате JSON с заголовками и свойствами.

Типы обменников (Exchange Types) в RabbitMQ: выбор для реальных задач

Тип обменника определяет алгоритм маршрутизации. RabbitMQ поддерживает четыре типа: direct, fanout, topic, headers. Выбор типа влияет на то, как routing key и заголовки сообщения сопоставляются с binding key очередей.

На практике direct выбирают для точной маршрутизации по небольшому числу известных ключей: например, для разделения error и info. Fanout подходит для событий, которые должны получить все подписчики, например для уведомлений или сброса кэша. Topic удобен для событий с иерархическими routing keys, когда сервисам нужны разные группы событий. Headers используют, когда условия маршрутизации естественно описываются набором атрибутов сообщения, а не одной строкой. При этом headers сложнее проверять и сопровождать, поэтому для большинства событийных схем достаточно topic.

Тип ExchangeRouting keyПрименениеПлюсыОграничения
directТочное совпадениеЗадачи и события по фиксированным категориямПростая схема, предсказуемая маршрутизацияМало гибкости при росте числа ключей
fanoutНе используетсяBroadcast-события для всех подписчиковПростая публикация/подписка, копия в каждой queueНельзя выбрать подписчика через routing key
topicШаблон с * и #Логи и доменные события с иерархиейГибкая фильтрация без изменения producerОшибки в шаблоне binding сложно заметить
headersНе используется для выбораМаршрутизация по нескольким атрибутамУсловия можно задавать через заголовкиСложнее отлаживать и поддерживать

Direct Exchange

Direct exchange маршрутизирует сообщение в очереди, у которых binding key точно совпадает с routing key сообщения. Это самый простой и быстрый тип. Пример: exchange app_events связан с очередью error_queue через ключ error и с очередью info_queue через ключ info. Сообщение с routing key error попадёт только в error_queue. Direct exchange подходит для точечной доставки задач конкретным обработчикам.

Fanout Exchange

Fanout exchange игнорирует routing key и отправляет копию сообщения во все очереди, привязанные к нему. Это широковещательная рассылка. Пример: exchange notifications связан с очередями email_queue, sms_queue, push_queue. Одно сообщение о новом заказе попадёт во все три очереди, и каждая система получит свою копию. Fanout подходит для публикации событий, когда несколько подписчиков должны получить одинаковые данные.

Topic Exchange

Topic exchange маршрутизирует по шаблону routing key. Routing key состоит из слов, разделённых точками, например logs.auth.error. Binding key может содержать символы * (заменяет ровно одно слово) и # (заменяет ноль или более слов). Примеры: binding key logs.*.error поймает logs.auth.error и logs.db.error, но не logs.auth.info. Binding key logs.# поймает любое сообщение, начинающееся с logs.. Topic exchange даёт гибкую маршрутизацию для событий с иерархической структурой.

Headers Exchange

Headers exchange маршрутизирует на основе заголовков сообщения, а не routing key. При создании binding указываются аргументы headers и параметр x-match. Значение all требует совпадения всех указанных заголовков, any - хотя бы одного. Пример: binding с x-match: all и заголовками format: pdf, type: report получит только сообщения, у которых оба заголовка совпадают. Headers exchange используется реже, так как topic exchange покрывает большинство сценариев, но он полезен, когда routing key недостаточно выразителен.

Управление RabbitMQ из командной строки

Для автоматизации и работы на серверах без графического интерфейса используются утилиты rabbitmqctl, rabbitmqadmin и rabbitmq-plugins. Они покрывают все операции, доступные в Management UI.

rabbitmqctl: основные команды

Утилита rabbitmqctl входит в состав сервера и работает локально. Шпаргалка по частым задачам:

# Просмотр vhost
rabbitmqctl list_vhosts

# Просмотр очередей с количеством сообщений
rabbitmqctl list_queues name messages consumers

# Просмотр обменников
rabbitmqctl list_exchanges name type durable

# Просмотр связей
rabbitmqctl list_bindings

# Создание и удаление vhost
rabbitmqctl add_vhost /staging
rabbitmqctl delete_vhost /staging

# Создание пользователя и назначение прав
rabbitmqctl add_user deploy_user strong_password
rabbitmqctl set_permissions -p /production deploy_user ".*" ".*" ".*"

# Очистка очереди
rabbitmqctl purge_queue error_queue -p /production

# Удаление очереди
rabbitmqctl delete_queue error_queue -p /production

Команды purge_queue и delete_queue требуют указания vhost через параметр -p, если очередь не находится в vhost по умолчанию /.

rabbitmqadmin: управление через HTTP API

Утилита rabbitmqadmin работает через Management API и подходит для удалённого управления. Установите её с работающего брокера:

wget http://localhost:15672/cli/rabbitmqadmin -O /usr/local/bin/rabbitmqadmin
chmod +x /usr/local/bin/rabbitmqadmin

Примеры использования:

# Объявить exchange
rabbitmqadmin -u deploy_user -p strong_password -V /production declare exchange name=app_events type=direct durable=true

# Объявить очередь
rabbitmqadmin -u deploy_user -p strong_password -V /production declare queue name=error_queue durable=true

# Создать binding
rabbitmqadmin -u deploy_user -p strong_password -V /production declare binding source=app_events destination=error_queue routing_key=error

# Опубликовать сообщение
rabbitmqadmin -u deploy_user -p strong_password -V /production publish exchange=app_events routing_key=error payload='{"service": "auth"}'

# Получить сообщения из очереди
rabbitmqadmin -u deploy_user -p strong_password -V /production get queue=error_queue count=5 ackmode=ack_requeue_false

Для частого использования задайте параметры подключения через переменные окружения или конфигурационный файл, чтобы не повторять логин и пароль в каждой команде. Пароль в командной строке также может попасть в историю shell, поэтому для production используйте защищённый способ хранения учётных данных.

Полный поток: vhost -> user -> exchange -> queue -> binding -> publish -> consume

Ниже приведён минимальный сквозной сценарий для тестового окружения. Команды выполняются последовательно на хосте с RabbitMQ; для rabbitmqadmin должен быть включён rabbitmq_management.

# 1. Создать vhost
rabbitmqctl add_vhost /production

# 2. Создать пользователя и выдать права на vhost
rabbitmqctl add_user app_user strong_password
rabbitmqctl set_permissions -p /production app_user ".*" ".*" ".*"

# 3. Создать exchange типа direct
rabbitmqadmin -u app_user -p strong_password -V /production declare exchange name=app_events type=direct durable=true

# 4. Создать durable queue
rabbitmqadmin -u app_user -p strong_password -V /production declare queue name=error_queue durable=true

# 5. Связать exchange и queue через binding
rabbitmqadmin -u app_user -p strong_password -V /production declare binding source=app_events destination=error_queue routing_key=error

# 6. Опубликовать сообщение
rabbitmqadmin -u app_user -p strong_password -V /production publish exchange=app_events routing_key=error payload='{"service":"auth","level":"error"}'

# 7. Получить сообщение для проверки маршрутизации
rabbitmqadmin -u app_user -p strong_password -V /production get queue=error_queue count=1 ackmode=ack_requeue_false

После публикации команда get должна вернуть сообщение из error_queue. В рабочем приложении роль consume выполняет постоянно работающий consumer, а не разовый вызов rabbitmqadmin get. Если на шаге получения очередь пуста, сначала проверьте vhost, имя exchange, binding и точное значение routing key.

Типовые ошибки при настройке RabbitMQ и как проверить

Нет прав на vhost

Ошибка доступа возникает, когда пользователь существует, но для нужного vhost не назначены права configure, write и read либо команда выполняется с другим значением -V или -p. Проверьте разрешения:

rabbitmqctl list_permissions -p /production

В результате должна быть строка с нужным пользователем и тремя регулярными выражениями прав. Для тестового пользователя права можно назначить так:

rabbitmqctl set_permissions -p /production app_user ".*" ".*" ".*"

Binding создан, но маршрутизация не работает

Проверьте, что binding находится в том же vhost и связывает именно нужные exchange и queue:

rabbitmqctl list_bindings -p /production

Для direct routing key producer должен точно совпадать с binding key, включая регистр и точки. Для topic проверьте шаблоны * и #. Для fanout routing key не влияет на результат, а для headers нужно проверить значения заголовков и параметр x-match.

Сообщение не попадает в queue

Сначала убедитесь, что producer публикует сообщение в правильный exchange и vhost. Затем сравните routing key публикации с binding key и проверьте счётчики очереди. Exchange может принять публикацию, но сообщение без подходящего binding не попадёт ни в одну queue, поэтому одна только успешная команда публикации не подтверждает доставку.

rabbitmqctl list_queues -p /production name messages_ready messages_unacknowledged consumers
rabbitmqadmin -u app_user -p strong_password -V /production get queue=error_queue count=1 ackmode=ack_requeue_true

Если routing key указан неверно, сообщение может быть направлено в другую queue или остаться без маршрута. Для критичных публикаций используйте publisher confirms на стороне приложения и отдельно проверяйте фактическое наличие сообщения в целевой queue.

guest не подключается удалённо

Пользователь guest по умолчанию ограничен подключениями с localhost. Это штатное ограничение RabbitMQ, а не ошибка пароля или порта. Для удалённого доступа создайте отдельного user, назначьте ему права на конкретный vhost и используйте его в приложении или Management UI. Не переносите guest в production без осознанной настройки политики доступа.

Подтверждение доставки сообщений (Acknowledgements): ack, nack и requeue

Подтверждения гарантируют, что сообщение не потеряется при сбое consumer. По умолчанию RabbitMQ считает сообщение доставленным сразу после отправки consumer (automatic ack). Если consumer упал во время обработки, сообщение потеряно. Ручное подтверждение решает эту проблему: consumer отправляет basic.ack только после успешной обработки.

Ручное подтверждение (Manual Ack)

Пример на Python с библиотекой pika:

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='error_queue', durable=True)

def callback(ch, method, properties, body):
    print(f"Получено: {body}")
    # Обработка сообщения
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_consume(queue='error_queue', on_message_callback=callback, auto_ack=False)
channel.start_consuming()

Параметр auto_ack=False включает ручное подтверждение. После обработки вызывается basic_ack с delivery_tag из метода доставки. Если обработка завершилась ошибкой, можно отправить basic.nack с параметром requeue=True, чтобы вернуть сообщение в очередь, или requeue=False, чтобы отправить его в Dead Letter Exchange.

ack удаляет сообщение из очереди после успешной обработки. nack сообщает брокеру о неуспешной обработке: при requeue=True сообщение возвращается в queue, а при requeue=False оно удаляется или направляется в Dead Letter Exchange, если он настроен. Если consumer отключился до отправки ack, RabbitMQ обычно возвращает неподтверждённое сообщение в очередь для повторной доставки.

Повторная доставка означает, что возможны дубли: consumer мог выполнить внешнее действие и завершиться до ack. Для защиты используйте идемпотентную обработку, идентификатор сообщения и проверку уже выполненных операций. Бесконечный requeue=True для неисправного сообщения создаёт цикл повторных доставок, поэтому для постоянных ошибок нужен лимит попыток или Dead Letter Exchange.

Долговечность очередей и сообщений

Durable очередь и durable exchange переживают перезапуск брокера, но сообщения в durable очереди могут потеряться, если не помечены как persistent. При публикации укажите delivery_mode=2:

channel.basic_publish(
    exchange='app_events',
    routing_key='error',
    body='critical failure',
    properties=pika.BasicProperties(delivery_mode=2)
)

Persistent сообщения записываются на диск, что снижает производительность. Для некритичных данных можно использовать transient сообщения в durable очередях: очередь сохранится, но сообщения пропадут при сбое. Выбор зависит от требований к надёжности. Параметры durable и persistent не заменяют резервное копирование и не устраняют backlog, а только влияют на сохранность топологии и сообщений при перезапуске.

Мониторинг состояния RabbitMQ

Контроль состояния брокера позволяет обнаружить переполнение очередей, утечки соединений и нехватку памяти до того, как они приведут к отказу. Основные инструменты: Management UI, команды rabbitmqctl и HTTP API.

Ключевые метрики для мониторинга

Отслеживайте следующие показатели:

  • Queue depth - количество сообщений в очереди. Рост без уменьшения указывает на медленный consumer или его остановку.
  • Message rates - скорость публикации и доставки. Резкое падение доставки при стабильной публикации сигнализирует о проблеме.
  • Consumer count - число активных потребителей на очередь. Ноль потребителей при растущей очереди - критическая ситуация.
  • Connection count - количество открытых соединений. Аномальный рост может указывать на утечку в приложении.
  • Memory usage - потребление памяти брокером. При достижении лимита RabbitMQ начинает блокировать публикацию.

Что проверить, если очередь растет

Сначала разделите сообщения на Ready и Unacked. Рост messages_ready означает, что сообщения ещё не выданы consumer; рост messages_unacknowledged указывает на медленную обработку, зависший consumer или слишком большой объём сообщений в работе.

  • Если consumers=0, проверьте запуск приложения, подключение к нужному vhost и права read.
  • Если consumer есть, сравните скорость публикации и обработки: медленный consumer может не успевать за producer.
  • Если сообщения не появляются в ожидаемой queue, проверьте exchange, binding и routing key. Неверный ключ часто отправляет сообщения в другую queue или оставляет их без маршрута.
  • Если сообщения исчезают после перезапуска, проверьте, что queue и exchange имеют durable, а сообщения публикуются с persistent. Эти параметры сохраняют данные, но не уменьшают уже накопившуюся очередь.
rabbitmqctl list_queues -p /production name messages_ready messages_unacknowledged consumers
rabbitmqctl list_consumers -p /production

В Management UI на вкладке Overview доступны графики по этим метрикам. Для автоматических алертов настройте сбор метрик через HTTP API /api/queues и передачу в Prometheus или другую систему мониторинга.

Быстрая диагностика соединений и каналов

Команды помогают понять, подключено ли приложение и создаёт ли оно каналы:

rabbitmqctl list_connections name peer_host peer_port state
rabbitmqctl list_channels connection number consumer_count messages_unacknowledged

В ожидаемом результате соединение имеет состояние running, а для consumer видны каналы и ненулевой consumer count. Если list_consumers недоступна в вашей версии RabbitMQ, используйте list_queues ... consumers или вкладки Connections, Channels и Queues в Management UI.

Мини-чеклист: проверка, что RabbitMQ настроен правильно

КомандаОжидаемый результат
rabbitmqctl statusУзел отвечает и показывает рабочее состояние RabbitMQ.
rabbitmqctl list_vhostsВ списке есть нужный vhost, например /production.
rabbitmqctl list_permissions -p /productionУ нужного user есть configure, write и read.
rabbitmqctl list_exchanges -p /production name type durableЕсть нужный exchange с ожидаемым type и durable.
rabbitmqctl list_queues -p /production name messages_ready messages_unacknowledged consumersЕсть нужная queue; счётчики соответствуют тестовой нагрузке.
rabbitmqctl list_bindings -p /productionВидна связь нужных exchange и queue с правильным routing key.
rabbitmqctl list_consumers -p /productionВидны ожидаемые consumer; при отсутствии команды проверьте поле consumers в list_queues.

После проверки топологии опубликуйте тестовое сообщение через rabbitmqadmin и получите его из queue. Такой тест подтверждает не только доступность брокера, но и полный маршрут от producer до consumer.

Типовые сценарии использования RabbitMQ

RabbitMQ применяется в нескольких проверенных паттернах. Микросервисная архитектура: сервисы обмениваются событиями через topic exchange, каждый сервис подписывается на нужные типы событий. Отложенные задачи: сообщение публикуется с TTL, после истечения срока попадает в Dead Letter Exchange и оттуда в очередь обработки. Распределение задач: несколько consumer подписаны на одну очередь, RabbitMQ отдаёт сообщения по round-robin, равномерно распределяя нагрузку между воркерами. Публикация/подписка: fanout exchange рассылает одно событие всем заинтересованным системам.

Для углубления в тему надёжности и кластеризации изучите руководство по настройке отказоустойчивости в RabbitMQ, где разобраны durable очереди, TTL и Dead Letter Exchange. Если нужно сравнить RabbitMQ с другими брокерами перед внедрением, используйте алгоритм выбора брокера сообщений в 2026. Для интеграции RabbitMQ с 1C и legacy-системами посмотрите практическое руководство по асинхронной интеграции систем. Для отдельного сравнения архитектур брокеров полезен материал об Apache Kafka и работе с кластером.

FAQ по RabbitMQ

Как создать очередь в RabbitMQ?

В Management UI откройте Queues → Add a new queue, укажите имя и durability. Через командную строку используйте rabbitmqadmin ... declare queue name=error_queue durable=true с правильным параметром -V для vhost.

Как проверить binding?

В Management UI откройте нужный exchange и блок Bindings. В CLI выполните rabbitmqctl list_bindings -p /production, затем сравните source, destination и routing key с параметрами публикации.

Как настроить RabbitMQ через командную строку?

Для локальных административных операций используйте rabbitmqctl, для операций через HTTP API - rabbitmqadmin, а для включения интерфейса - rabbitmq-plugins. Полный порядок действий приведён в сквозном примере выше.

Почему consumer получает одно сообщение несколько раз?

Обычно consumer завершился или потерял соединение до отправки ack, поэтому RabbitMQ вернул сообщение в queue. Проверьте логи consumer, обработку исключений и сделайте бизнес-операцию идемпотентной.

Какой Exchange выбрать для событий?

Используйте direct для точного ключа, fanout для всех подписчиков, topic для иерархических routing keys и headers для маршрутизации по набору заголовков. Для большинства событийных интеграций начните с direct или topic.

Заключение

RabbitMQ состоит из четырёх ключевых элементов: virtual hosts для изоляции, exchanges для маршрутизации, queues для хранения и bindings для связи. Тип exchange определяет алгоритм доставки: direct для точного совпадения, fanout для широковещательной рассылки, topic для шаблонов, headers для маршрутизации по заголовкам. Управление выполняется через Management UI или командную строку с помощью rabbitmqctl и rabbitmqadmin. Надёжность обеспечивается ручными подтверждениями и durable-настройками.

Для закрепления материала создайте тестовый vhost, объявите exchange каждого типа и проверьте маршрутизацию с разными routing key. Затем настройте ручное подтверждение в тестовом consumer и убедитесь, что сообщения не теряются при принудительном завершении процесса. Официальная документация RabbitMQ содержит детальные описания всех параметров и рекомендуется для дальнейшего изучения.

Поделиться: