Files
peptide-parcer/RABBITMQ_SETUP.md

237 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
- Следите за размером очередей
- Мониторьте время обработки сообщений