Files
peptide-parcer/RABBITMQ_SETUP.md

6.8 KiB
Raw Permalink Blame History

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 (рекомендуется)

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:

Проверка очередей

# Установка 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

Проблемы подключения

  1. Проверьте, что RabbitMQ запущен
  2. Убедитесь в правильности настроек в .env
  3. Проверьте доступность порта 5672

Проблемы с правами доступа

# Создание пользователя (если нужно)
sudo rabbitmqctl add_user myuser mypassword
sudo rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"

Проблемы с очередями

# Очистка очереди (осторожно!)
sudo rabbitmqctl purge_queue price_parser.products

Безопасность

Рекомендации по безопасности

  1. Измените стандартные учетные данные (guest/guest)
  2. Используйте SSL/TLS для продакшена
  3. Ограничьте права доступа пользователей
  4. Регулярно обновляйте 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
  • Следите за размером очередей
  • Мониторьте время обработки сообщений