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