añadido los estados de reporte
This commit is contained in:
@@ -1,202 +1,202 @@
|
||||
# RabbitMQ Integration Guide
|
||||
|
||||
## Overview
|
||||
|
||||
This project now uses RabbitMQ for asynchronous message queue processing. The architecture follows the **producer-consumer pattern**:
|
||||
|
||||
- **Senders (Producers)**: API endpoints send messages to RabbitMQ queues
|
||||
- **Receivers (Consumers)**: Separate consumer processes listen to queues and save to databases
|
||||
|
||||
## Architecture
|
||||
|
||||
### Message Flow
|
||||
|
||||
```
|
||||
API Endpoint → Service → RabbitMQ Queue → Consumer → Database
|
||||
```
|
||||
|
||||
### Queues
|
||||
|
||||
- **users_queue**: Receives user events (create, update, delete)
|
||||
- **reports_queue**: Receives report events (create, update_visibility, delete)
|
||||
|
||||
## Setup and Configuration
|
||||
|
||||
### 1. Install Dependencies
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
This includes the `pika` package for RabbitMQ communication.
|
||||
|
||||
### 2. Start RabbitMQ
|
||||
|
||||
Ensure RabbitMQ is running on your system:
|
||||
|
||||
```bash
|
||||
# Using Docker
|
||||
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
|
||||
|
||||
# Or using local installation
|
||||
rabbitmq-server
|
||||
```
|
||||
|
||||
## Running the Application
|
||||
|
||||
### Start the API Server
|
||||
|
||||
```bash
|
||||
cd src
|
||||
python main.py
|
||||
```
|
||||
|
||||
The API will be available at `http://localhost:8000`
|
||||
|
||||
### Start Consumers
|
||||
|
||||
In separate terminal windows, run the consumers:
|
||||
|
||||
#### User Consumer
|
||||
```bash
|
||||
cd src
|
||||
python -m consumers.user_consumer
|
||||
```
|
||||
|
||||
#### Report Consumer
|
||||
```bash
|
||||
cd src
|
||||
python -m consumers.report_consumer
|
||||
```
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Creating a User
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/users/ \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"nombre": "John",
|
||||
"apellido": "Doe",
|
||||
"email": "john@example.com",
|
||||
"fecha_nacimiento": "1990-01-01T00:00:00",
|
||||
"url_foto_perfil": "http://example.com/photo.jpg",
|
||||
"biografia": "A test user"
|
||||
}'
|
||||
```
|
||||
|
||||
**Response** (Immediate):
|
||||
```json
|
||||
{
|
||||
"status": "queued",
|
||||
"message": "Usuario enviado a cola para procesamiento",
|
||||
"email": "john@example.com"
|
||||
}
|
||||
```
|
||||
|
||||
The user will be saved to the database by the User Consumer.
|
||||
|
||||
### Creating a Report
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/reports/ \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"id_usuario": 1,
|
||||
"tipo_reporte": 1,
|
||||
"descripcion": "Issue description",
|
||||
"ubicacion": "Location info"
|
||||
}'
|
||||
```
|
||||
|
||||
**Response** (Immediate):
|
||||
```json
|
||||
{
|
||||
"status": "queued",
|
||||
"message": "Reporte enviado a cola para procesamiento",
|
||||
"id_reporte": "uuid-string"
|
||||
}
|
||||
```
|
||||
|
||||
The report will be saved to the database by the Report Consumer.
|
||||
|
||||
## Message Formats
|
||||
|
||||
### User Event Messages
|
||||
|
||||
```python
|
||||
{
|
||||
"event_type": "user.create|user.update|user.delete",
|
||||
"user_id": Optional[int],
|
||||
"nombre": Optional[str],
|
||||
"apellido": Optional[str],
|
||||
"email": Optional[str],
|
||||
"fecha_nacimiento": Optional[str], # ISO format
|
||||
"fecha_creacion": Optional[str], # ISO format
|
||||
"calificacion": Optional[float],
|
||||
"numero_reportes": Optional[int],
|
||||
"url_foto_perfil": Optional[str],
|
||||
"biografia": Optional[str]
|
||||
}
|
||||
```
|
||||
|
||||
### Report Event Messages
|
||||
|
||||
```python
|
||||
{
|
||||
"event_type": "report.create|report.update_visibility|report.delete",
|
||||
"id_reporte": Optional[str],
|
||||
"id_usuario": Optional[int],
|
||||
"tipo_reporte": Optional[int],
|
||||
"descripcion": Optional[str],
|
||||
"ubicacion": Optional[str],
|
||||
"visibilidad": Optional[float],
|
||||
"fecha_creacion": Optional[str], # ISO format
|
||||
"penalize_author": Optional[bool]
|
||||
}
|
||||
```
|
||||
|
||||
## Consumer Implementation Details
|
||||
|
||||
### User Consumer (`src/consumers/user_consumer.py`)
|
||||
|
||||
Processes three types of user events:
|
||||
|
||||
1. **CREATE**: Saves a new user to the database
|
||||
2. **UPDATE**: Updates existing user fields
|
||||
3. **DELETE**: Removes a user from the database
|
||||
|
||||
### Report Consumer (`src/consumers/report_consumer.py`)
|
||||
|
||||
Processes three types of report events:
|
||||
|
||||
1. **CREATE**: Saves a new report to MongoDB and increments user's report counter
|
||||
2. **UPDATE_VISIBILITY**: Updates report visibility and optionally penalizes the author
|
||||
3. **DELETE**: Removes a report from the database
|
||||
|
||||
## Benefits of This Architecture
|
||||
|
||||
1. **Asynchronous Processing**: API responds immediately without waiting for database operations
|
||||
2. **Scalability**: Consumers can be scaled independently
|
||||
3. **Reliability**: Messages are persistent and won't be lost
|
||||
4. **Decoupling**: Services are decoupled from database operations
|
||||
5. **Message Ordering**: FIFO guarantee ensures operations are processed in order
|
||||
|
||||
## Error Handling
|
||||
|
||||
- Messages are acknowledged only after successful processing
|
||||
- Failed messages are automatically requeued for retry
|
||||
- All operations are logged for debugging and monitoring
|
||||
|
||||
## Database Compatibility
|
||||
|
||||
- **Users**: MySQL (via SQLAlchemy)
|
||||
- **Reports**: MongoDB
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
- Add retry policies with exponential backoff
|
||||
- Implement dead-letter queues for failed messages
|
||||
- Add message monitoring and analytics
|
||||
- Implement distributed transaction handling
|
||||
# RabbitMQ Integration Guide
|
||||
|
||||
## Overview
|
||||
|
||||
This project now uses RabbitMQ for asynchronous message queue processing. The architecture follows the **producer-consumer pattern**:
|
||||
|
||||
- **Senders (Producers)**: API endpoints send messages to RabbitMQ queues
|
||||
- **Receivers (Consumers)**: Separate consumer processes listen to queues and save to databases
|
||||
|
||||
## Architecture
|
||||
|
||||
### Message Flow
|
||||
|
||||
```
|
||||
API Endpoint → Service → RabbitMQ Queue → Consumer → Database
|
||||
```
|
||||
|
||||
### Queues
|
||||
|
||||
- **users_queue**: Receives user events (create, update, delete)
|
||||
- **reports_queue**: Receives report events (create, update_visibility, delete)
|
||||
|
||||
## Setup and Configuration
|
||||
|
||||
### 1. Install Dependencies
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
This includes the `pika` package for RabbitMQ communication.
|
||||
|
||||
### 2. Start RabbitMQ
|
||||
|
||||
Ensure RabbitMQ is running on your system:
|
||||
|
||||
```bash
|
||||
# Using Docker
|
||||
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
|
||||
|
||||
# Or using local installation
|
||||
rabbitmq-server
|
||||
```
|
||||
|
||||
## Running the Application
|
||||
|
||||
### Start the API Server
|
||||
|
||||
```bash
|
||||
cd src
|
||||
python main.py
|
||||
```
|
||||
|
||||
The API will be available at `http://localhost:8000`
|
||||
|
||||
### Start Consumers
|
||||
|
||||
In separate terminal windows, run the consumers:
|
||||
|
||||
#### User Consumer
|
||||
```bash
|
||||
cd src
|
||||
python -m consumers.user_consumer
|
||||
```
|
||||
|
||||
#### Report Consumer
|
||||
```bash
|
||||
cd src
|
||||
python -m consumers.report_consumer
|
||||
```
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Creating a User
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/users/ \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"nombre": "John",
|
||||
"apellido": "Doe",
|
||||
"email": "john@example.com",
|
||||
"fecha_nacimiento": "1990-01-01T00:00:00",
|
||||
"url_foto_perfil": "http://example.com/photo.jpg",
|
||||
"biografia": "A test user"
|
||||
}'
|
||||
```
|
||||
|
||||
**Response** (Immediate):
|
||||
```json
|
||||
{
|
||||
"status": "queued",
|
||||
"message": "Usuario enviado a cola para procesamiento",
|
||||
"email": "john@example.com"
|
||||
}
|
||||
```
|
||||
|
||||
The user will be saved to the database by the User Consumer.
|
||||
|
||||
### Creating a Report
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/reports/ \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"id_usuario": 1,
|
||||
"tipo_reporte": 1,
|
||||
"descripcion": "Issue description",
|
||||
"ubicacion": "Location info"
|
||||
}'
|
||||
```
|
||||
|
||||
**Response** (Immediate):
|
||||
```json
|
||||
{
|
||||
"status": "queued",
|
||||
"message": "Reporte enviado a cola para procesamiento",
|
||||
"id_reporte": "uuid-string"
|
||||
}
|
||||
```
|
||||
|
||||
The report will be saved to the database by the Report Consumer.
|
||||
|
||||
## Message Formats
|
||||
|
||||
### User Event Messages
|
||||
|
||||
```python
|
||||
{
|
||||
"event_type": "user.create|user.update|user.delete",
|
||||
"user_id": Optional[int],
|
||||
"nombre": Optional[str],
|
||||
"apellido": Optional[str],
|
||||
"email": Optional[str],
|
||||
"fecha_nacimiento": Optional[str], # ISO format
|
||||
"fecha_creacion": Optional[str], # ISO format
|
||||
"calificacion": Optional[float],
|
||||
"numero_reportes": Optional[int],
|
||||
"url_foto_perfil": Optional[str],
|
||||
"biografia": Optional[str]
|
||||
}
|
||||
```
|
||||
|
||||
### Report Event Messages
|
||||
|
||||
```python
|
||||
{
|
||||
"event_type": "report.create|report.update_visibility|report.delete",
|
||||
"id_reporte": Optional[str],
|
||||
"id_usuario": Optional[int],
|
||||
"tipo_reporte": Optional[int],
|
||||
"descripcion": Optional[str],
|
||||
"ubicacion": Optional[str],
|
||||
"visibilidad": Optional[float],
|
||||
"fecha_creacion": Optional[str], # ISO format
|
||||
"penalize_author": Optional[bool]
|
||||
}
|
||||
```
|
||||
|
||||
## Consumer Implementation Details
|
||||
|
||||
### User Consumer (`src/consumers/user_consumer.py`)
|
||||
|
||||
Processes three types of user events:
|
||||
|
||||
1. **CREATE**: Saves a new user to the database
|
||||
2. **UPDATE**: Updates existing user fields
|
||||
3. **DELETE**: Removes a user from the database
|
||||
|
||||
### Report Consumer (`src/consumers/report_consumer.py`)
|
||||
|
||||
Processes three types of report events:
|
||||
|
||||
1. **CREATE**: Saves a new report to MongoDB and increments user's report counter
|
||||
2. **UPDATE_VISIBILITY**: Updates report visibility and optionally penalizes the author
|
||||
3. **DELETE**: Removes a report from the database
|
||||
|
||||
## Benefits of This Architecture
|
||||
|
||||
1. **Asynchronous Processing**: API responds immediately without waiting for database operations
|
||||
2. **Scalability**: Consumers can be scaled independently
|
||||
3. **Reliability**: Messages are persistent and won't be lost
|
||||
4. **Decoupling**: Services are decoupled from database operations
|
||||
5. **Message Ordering**: FIFO guarantee ensures operations are processed in order
|
||||
|
||||
## Error Handling
|
||||
|
||||
- Messages are acknowledged only after successful processing
|
||||
- Failed messages are automatically requeued for retry
|
||||
- All operations are logged for debugging and monitoring
|
||||
|
||||
## Database Compatibility
|
||||
|
||||
- **Users**: MySQL (via SQLAlchemy)
|
||||
- **Reports**: MongoDB
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
- Add retry policies with exponential backoff
|
||||
- Implement dead-letter queues for failed messages
|
||||
- Add message monitoring and analytics
|
||||
- Implement distributed transaction handling
|
||||
|
||||
Reference in New Issue
Block a user