6.8 KiB
6.8 KiB
ANCHOR: RabbitMQ_Setup_Guide
Семантика: Руководство по настройке и использованию RabbitMQ в проекте price_parser
Обзор
Проект price_parser теперь поддерживает экспорт данных в очередь сообщений RabbitMQ. Это позволяет:
- Асинхронно обрабатывать данные о продуктах
- Интегрироваться с другими системами через очереди
- Масштабировать обработку данных
- Обеспечивать надежную доставку сообщений
Архитектура RabbitMQ
Очереди
price_parser.products- очередь для данных о продуктахprice_parser.logs- очередь для логов парсера
Exchange
price_parser.exchange- прямой exchange для маршрутизации сообщений
Routing Keys
products- для данных о продуктахlogs- для логов
Установка RabbitMQ
Windows
- Скачайте RabbitMQ с официального сайта: https://www.rabbitmq.com/download.html
- Установите Erlang (требуется для RabbitMQ)
- Запустите RabbitMQ как службу Windows
Docker (рекомендуется)
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
Linux (Ubuntu/Debian)
# Установка Erlang
sudo apt-get install erlang
# Установка RabbitMQ
sudo apt-get install rabbitmq-server
# Запуск службы
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
Настройка проекта
1. Установка зависимостей
pip install -r requirements.txt
2. Конфигурация
Скопируйте env.example в .env и настройте параметры:
# RabbitMQ настройки
RABBITMQ_HOST=localhost
RABBITMQ_PORT=5672
RABBITMQ_USERNAME=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_VIRTUAL_HOST=/
# Очереди
RABBITMQ_PRODUCTS_QUEUE=price_parser.products
RABBITMQ_LOGS_QUEUE=price_parser.logs
RABBITMQ_EXCHANGE=price_parser.exchange
# Включение экспорта в RabbitMQ
ENABLE_RABBITMQ_EXPORT=true
3. Проверка подключения
python -c "from utils.exporters import validate_rabbitmq_connection; print('RabbitMQ доступен' if validate_rabbitmq_connection() else 'RabbitMQ недоступен')"
Использование
Запуск парсера с экспортом в RabbitMQ
python src/main.py
Структура сообщений
Сообщение с данными о продуктах
{
"message_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2023-10-27T12:34:56.789Z",
"source": "price_parser",
"products": [
{
"name": "Peptide X",
"volume": "30ml",
"price": 1500,
"url": "https://elixirpeptide.ru/catalog/peptide-x/?product=variant1"
}
],
"run_id": "20231027-123456",
"total_count": 1
}
Сообщение с логами
{
"message_id": "550e8400-e29b-41d4-a716-446655440001",
"timestamp": "2023-10-27T12:34:56.789Z",
"source": "price_parser",
"log_records": [
{
"run_id": "20231027-123456",
"timestamp": "2023-10-27T12:34:56.789Z",
"level": "INFO",
"message": "Парсинг начат."
}
],
"run_id": "20231027-123456"
}
Мониторинг
RabbitMQ Management UI
Если используется Docker с management plugin:
- URL: http://localhost:15672
- Логин: guest
- Пароль: guest
Проверка очередей
# Установка rabbitmqadmin
wget http://localhost:15672/cli/rabbitmqadmin
chmod +x rabbitmqadmin
# Просмотр очередей
./rabbitmqadmin list queues
# Просмотр сообщений
./rabbitmqadmin get queue=price_parser.products
Обработка сообщений
Python Consumer Example
import pika
import json
from core.models import ProductDataMessage
def callback(ch, method, properties, body):
"""Обработчик сообщений из очереди продуктов"""
try:
data = json.loads(body)
message = ProductDataMessage(**data)
print(f"Получено {message.total_count} продуктов")
for product in message.products:
print(f"- {product.name}: {product.price} руб.")
ch.basic_ack(delivery_tag=method.delivery_tag)
except Exception as e:
print(f"Ошибка обработки сообщения: {e}")
ch.basic_nack(delivery_tag=method.delivery_tag)
# Подключение к RabbitMQ
connection = pika.BlockingConnection(
pika.ConnectionParameters('localhost')
)
channel = connection.channel()
# Подписка на очередь
channel.basic_consume(
queue='price_parser.products',
on_message_callback=callback
)
print("Ожидание сообщений...")
channel.start_consuming()
Troubleshooting
Проблемы подключения
- Проверьте, что RabbitMQ запущен
- Убедитесь в правильности настроек в
.env - Проверьте доступность порта 5672
Проблемы с правами доступа
# Создание пользователя (если нужно)
sudo rabbitmqctl add_user myuser mypassword
sudo rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"
Проблемы с очередями
# Очистка очереди (осторожно!)
sudo rabbitmqctl purge_queue price_parser.products
Безопасность
Рекомендации по безопасности
- Измените стандартные учетные данные (guest/guest)
- Используйте SSL/TLS для продакшена
- Ограничьте права доступа пользователей
- Регулярно обновляйте RabbitMQ
SSL настройка
# В .env добавьте:
RABBITMQ_SSL=True
RABBITMQ_SSL_CERT_FILE=/path/to/cert.pem
RABBITMQ_SSL_KEY_FILE=/path/to/key.pem
Производительность
Настройки для высокой нагрузки
# В .env:
RABBITMQ_HEARTBEAT=60
RABBITMQ_CONNECTION_TIMEOUT=10
RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=60
Мониторинг производительности
- Используйте RabbitMQ Management UI
- Следите за размером очередей
- Мониторьте время обработки сообщений