# 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 1. Скачайте RabbitMQ с официального сайта: https://www.rabbitmq.com/download.html 2. Установите Erlang (требуется для RabbitMQ) 3. Запустите RabbitMQ как службу Windows ### Docker (рекомендуется) ```bash docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management ``` ### Linux (Ubuntu/Debian) ```bash # Установка Erlang sudo apt-get install erlang # Установка RabbitMQ sudo apt-get install rabbitmq-server # Запуск службы sudo systemctl start rabbitmq-server sudo systemctl enable rabbitmq-server ``` ## Настройка проекта ### 1. Установка зависимостей ```bash pip install -r requirements.txt ``` ### 2. Конфигурация Скопируйте `env.example` в `.env` и настройте параметры: ```bash # 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. Проверка подключения ```bash python -c "from utils.exporters import validate_rabbitmq_connection; print('RabbitMQ доступен' if validate_rabbitmq_connection() else 'RabbitMQ недоступен')" ``` ## Использование ### Запуск парсера с экспортом в RabbitMQ ```bash python src/main.py ``` ### Структура сообщений #### Сообщение с данными о продуктах ```json { "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 } ``` #### Сообщение с логами ```json { "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 ### Проверка очередей ```bash # Установка rabbitmqadmin wget http://localhost:15672/cli/rabbitmqadmin chmod +x rabbitmqadmin # Просмотр очередей ./rabbitmqadmin list queues # Просмотр сообщений ./rabbitmqadmin get queue=price_parser.products ``` ## Обработка сообщений ### Python Consumer Example ```python 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 ### Проблемы подключения 1. Проверьте, что RabbitMQ запущен 2. Убедитесь в правильности настроек в `.env` 3. Проверьте доступность порта 5672 ### Проблемы с правами доступа ```bash # Создание пользователя (если нужно) sudo rabbitmqctl add_user myuser mypassword sudo rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*" ``` ### Проблемы с очередями ```bash # Очистка очереди (осторожно!) sudo rabbitmqctl purge_queue price_parser.products ``` ## Безопасность ### Рекомендации по безопасности 1. Измените стандартные учетные данные (guest/guest) 2. Используйте SSL/TLS для продакшена 3. Ограничьте права доступа пользователей 4. Регулярно обновляйте RabbitMQ ### SSL настройка ```bash # В .env добавьте: RABBITMQ_SSL=True RABBITMQ_SSL_CERT_FILE=/path/to/cert.pem RABBITMQ_SSL_KEY_FILE=/path/to/key.pem ``` ## Производительность ### Настройки для высокой нагрузки ```bash # В .env: RABBITMQ_HEARTBEAT=60 RABBITMQ_CONNECTION_TIMEOUT=10 RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=60 ``` ### Мониторинг производительности - Используйте RabbitMQ Management UI - Следите за размером очередей - Мониторьте время обработки сообщений