29 июля 2026 г.
Docker Compose файл
Создадим файл docker-compose.yml:
services:
# Основной брокер сообщений RabbitMQ
rabbitmq:
image: rabbitmq:3.13-management-alpine
container_name: rabbitmq
hostname: rabbitmq
ports:
# Стандартный порт для подключения приложений
- "5672:5672"
# Веб-интерфейс управления (Management UI)
- "15672:15672"
environment:
# Пользователь и пароль по умолчанию для входа в Management UI
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin
volumes:
# Сохраняем данные очередей между перезапусками
- ./rabbitmq-data:/var/lib/rabbitmq
# Небольшая задержка для гарантированного запуска
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
interval: 10s
timeout: 5s
retries: 5
# Веб-интерфейс для мониторинга очередей (альтернатива встроенному Management UI)
# Опционально, но удобно для визуализации
rabbitmq-mgmt:
image: rabbitmq:3.13-management-alpine
container_name: rabbitmq-mgmt
ports:
- "15673:15672"
depends_on:
rabbitmq:
condition: service_healthy
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin
# Этот контейнер только для UI, он подключается к основному брокеру
command: rabbitmq-server
Выполним команду в терминале из папки с docker-compose.yml. Флаг -d запускает контейнеры в фоновом режиме.
docker-compose up -d
Архитектура системы
RabbitMQ Broker
Это основной брокер сообщений. В нашем случае используется образ rabbitmq:3.13-management-alpine, который сразу включает веб-интерфейс управления.
- Порт 5672: используется приложениями (PHP, Python и др.) для отправки и получения сообщений.
- Порт 15672: предназначен для веб-интерфейса Management UI, где вы можете вручную создавать очереди, смотреть скорость обработки и управлять пользователями.
Management UI
Встроенный веб-интерфейс — мощный инструмент для администратора.
- Адрес: http://localhost:15672
- Логин/Пароль: admin/admin (заданы в переменных окружения)
- Функции:
- Просмотр всех очередей, обменников (exchanges) и связей (bindings).
- Отправка тестовых сообщений прямо из интерфейса.
- Мониторинг скорости потребления и накопления сообщений.
PHP скрипты
Для работы с RabbitMQ в PHP мы будем использовать официальную библиотеку php-amqplib. Установим её через Composer.
Создадим папку src и файл composer.json:
{
"require": {
"php-amqplib/php-amqplib": "^3.6"
}
}
Перейдём в папку src и установим зависимости:
composer install
Producer (отправитель)
Создадим файл src/producer.php. Этот скрипт генерирует тестовые сообщения в формате JSON, имитирующие действия пользователя.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Подключение к RabbitMQ
$connection = new AMQPStreamConnection(
'localhost',
5672,
'admin',
'admin',
'/'
);
$channel = $connection->channel();
// Объявляем очередь. durable=true означает, что очередь сохранится при перезапуске брокера
$channel->queue_declare('json-queue', durable: true, auto_delete: false);
// Функция обратного вызова для подтверждения публикации (необязательно)
$callback = function ($msg) {
echo " [x] Сообщение отправлено\n";
};
// Отправляем 10 тестовых сообщений
for ($i = 0; $i < 10; $i++) {
$now = date('Y-m-d H:i:s');
$guid = uniqid();
$data = [
'event_id' => $guid,
'event_type' => 'user_action_php',
'user_id' => $i + 1,
'timestamp' => $now,
'metadata' => [
'browser' => 'Firefox',
'os' => 'Linux'
]
];
$jsonData = json_encode($data);
$msg = new AMQPMessage($jsonData, [
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT, // сохранять на диск
]);
$channel->basic_publish($msg, '', 'json-queue');
echo " [x] Отправлено: ", $jsonData, "\n";
}
$channel->close();
$connection->close();
Consumer (получатель)
Создадим файл src/consumer.php. Он будет бесконечно слушать очередь и обрабатывать приходящие сообщения.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection(
'localhost',
5672,
'admin',
'admin',
'/'
);
$channel = $connection->channel();
// Убеждаемся, что очередь существует
$channel->queue_declare('json-queue', durable: true, auto_delete: false);
echo " [*] Ожидание сообщений. Для выхода нажмите CTRL+C\n";
// Функция обработки полученного сообщения
$callback = function ($msg) {
$data = json_decode($msg->body, true);
if (json_last_error() === JSON_ERROR_NONE) {
echo " [x] Получен JSON: ", print_r($data, true), "\n";
// Здесь можно сохранить данные в БД, отправить email и т.д.
} else {
echo " [x] Ошибка декодирования JSON: ", $msg->body, "\n";
}
// Подтверждение обработки (ack) — сообщение удаляется из очереди
$msg->ack();
};
// Настройка потребления: берем по 1 сообщению, подтверждаем вручную
$channel->basic_qos(null, 1, null);
$channel->basic_consume('json-queue', '', false, false, false, false, $callback);
// Бесконечный цикл ожидания
while ($channel->is_consuming()) {
$channel->wait();
}
$channel->close();
$connection->close();
Запуск и тестирование
Выполним команды в разных терминалах.
Запустим Consumer (в первом терминале)
php src/consumer.php
Он запустится и будет ждать сообщений. Вывод будет таким:
[*] Ожидание сообщений. Для выхода нажмите CTRL+C
Запустим Producer (во втором терминале)
php src/producer.php
Вы увидите вывод об отправке сообщений, а в терминале консюмера — полученные данные.
Проверка через веб-интерфейс
Откроем в браузере http://localhost:15672, войдём под admin/admin. Перейдём на вкладку "Queues" — вы увидите очередь json-queue и количество сообщений в ней (Ready/Unacked).
Остановка
Чтобы остановить консюмера, нажмите CTRL+C. Чтобы остановить все контейнеры:
docker-compose down -v
Флаг -v удалит volume с данными, если нужно полностью очистить состояние.
Итог
Конфигурация позволяет запустить полнофункциональное окружение RabbitMQ для разработки и тестирования одной командой docker-compose up -d.
Использование стандартных портов (5672 для приложений и 15672 для UI) делает работу привычной и простой. Примеры на PHP с использованием библиотеки php-amqplib демонстрируют базовые, но рабочие шаблоны для создания отправителя и получателя сообщений.
Веб-интерфейс Management UI дает наглядное представление о работе очередей, что особенно полезно при отладке.