Enhance application with new features, improved error handling, and performance optimizations. Key updates include: added data validation, retry strategies for HTTP requests, detailed logging, and support for RabbitMQ exports. Updated dependencies and enhanced README documentation for better setup instructions.

This commit is contained in:
2025-07-05 19:53:03 +03:00
parent 0ddd9f0683
commit 97e6438e9b
16 changed files with 1795 additions and 403 deletions

237
RABBITMQ_SETUP.md Normal file
View File

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