208 lines
5.2 KiB
Markdown
208 lines
5.2 KiB
Markdown
# RabbitMQ 可靠消息传递模块
|
||
|
||
这是一个模块化的RabbitMQ可靠消息传递实现,提供了完整的消息可靠性保证机制。
|
||
|
||
## 功能特性
|
||
|
||
- ✅ **消息持久化**: 交换器、队列、消息都支持持久化
|
||
- ✅ **消息确认机制**: 自动和手动确认模式
|
||
- ✅ **消息幂等性**: 防止重复处理消息
|
||
- ✅ **重试机制**: 可配置的重试次数和策略
|
||
- ✅ **死信队列**: 处理失败消息的完整解决方案
|
||
- ✅ **批量处理**: 支持批量发送和处理消息
|
||
- ✅ **多消费者**: 支持多个消费者并发处理
|
||
- ✅ **异步上下文管理器**: 自动管理连接生命周期
|
||
- ✅ **详细日志**: 完整的日志记录和错误追踪
|
||
- ✅ **统计分析**: 死信消息的统计分析功能
|
||
|
||
## 模块结构
|
||
|
||
```
|
||
reliable_mq/
|
||
├── __init__.py # 模块初始化
|
||
├── config.py # 配置管理
|
||
├── producer.py # 消息生产者
|
||
├── consumer.py # 消息消费者
|
||
├── dead_letter.py # 死信队列处理
|
||
├── test_reliable_messaging.py # 测试模块
|
||
├── example.py # 使用示例
|
||
└── README.md # 说明文档
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### 1. 基本使用
|
||
|
||
```python
|
||
import asyncio
|
||
from reliable_mq import ReliableProducer, ReliableConsumer
|
||
|
||
async def basic_example():
|
||
# 创建生产者和消费者
|
||
producer = ReliableProducer()
|
||
consumer = ReliableConsumer()
|
||
|
||
# 连接
|
||
await producer.connect()
|
||
await consumer.connect()
|
||
|
||
# 启动消费者
|
||
consumer_task = asyncio.create_task(consumer.start_consuming())
|
||
|
||
# 发送消息
|
||
await producer.publish_reliable_message({
|
||
"content": "Hello, RabbitMQ!",
|
||
"type": "greeting"
|
||
})
|
||
|
||
# 清理资源
|
||
await producer.close()
|
||
await consumer.close()
|
||
consumer_task.cancel()
|
||
|
||
asyncio.run(basic_example())
|
||
```
|
||
|
||
### 2. 使用异步上下文管理器
|
||
|
||
```python
|
||
async def context_manager_example():
|
||
async with ReliableProducer() as producer:
|
||
async with ReliableConsumer() as consumer:
|
||
consumer_task = asyncio.create_task(consumer.start_consuming())
|
||
|
||
await producer.publish_reliable_message({
|
||
"content": "使用上下文管理器",
|
||
"type": "example"
|
||
})
|
||
|
||
await asyncio.sleep(2)
|
||
consumer_task.cancel()
|
||
# 连接会自动关闭
|
||
```
|
||
|
||
### 3. 自定义消息处理函数
|
||
|
||
```python
|
||
async def custom_message_handler(message_data):
|
||
content = message_data.get('content', '')
|
||
msg_type = message_data.get('type', '')
|
||
|
||
if msg_type == 'email':
|
||
print(f"发送邮件: {content}")
|
||
elif msg_type == 'sms':
|
||
print(f"发送短信: {content}")
|
||
else:
|
||
print(f"处理消息: {content}")
|
||
|
||
# 创建带自定义处理函数的消费者
|
||
consumer = ReliableConsumer(
|
||
consumer_name="custom_consumer",
|
||
message_handler=custom_message_handler
|
||
)
|
||
```
|
||
|
||
### 4. 死信队列处理
|
||
|
||
```python
|
||
from reliable_mq import DeadLetterConsumer
|
||
|
||
async def dead_letter_example():
|
||
# 创建死信队列消费者
|
||
dead_letter_consumer = DeadLetterConsumer()
|
||
|
||
await dead_letter_consumer.connect()
|
||
await dead_letter_consumer.start_consuming()
|
||
|
||
# 死信消息会自动打印并保存到数据库
|
||
```
|
||
|
||
## 配置选项
|
||
|
||
通过环境变量或直接修改 `config.py` 来配置:
|
||
|
||
```python
|
||
# 环境变量配置
|
||
RABBITMQ_URI=amqp://guest:guest@localhost:5673/
|
||
RABBITMQ_EXCHANGE=reliable.exchange
|
||
RABBITMQ_QUEUE=reliable.queue
|
||
RABBITMQ_MAX_RETRIES=3
|
||
RABBITMQ_MESSAGE_TTL=300000
|
||
RABBITMQ_PREFETCH_COUNT=1
|
||
RABBITMQ_LOG_LEVEL=INFO
|
||
```
|
||
|
||
## 运行测试
|
||
|
||
```bash
|
||
# 运行所有测试
|
||
python -m reliable_mq.test_reliable_messaging
|
||
|
||
# 运行示例
|
||
python -m reliable_mq.example
|
||
```
|
||
|
||
## 核心机制说明
|
||
|
||
### 1. 消息持久化
|
||
- 交换器持久化: `durable=True`
|
||
- 队列持久化: `durable=True`
|
||
- 消息持久化: `delivery_mode=PERSISTENT`
|
||
|
||
### 2. 消息确认机制
|
||
- 自动确认: `async with message.process()`
|
||
- 手动确认: `message.ack()` / `message.nack()`
|
||
|
||
### 3. 消息幂等性
|
||
- 使用消息ID去重
|
||
- 业务层幂等性检查
|
||
|
||
### 4. 重试机制
|
||
- 可配置最大重试次数
|
||
- 指数退避重试策略
|
||
- 死信队列处理失败消息
|
||
|
||
### 5. 死信队列
|
||
- 自动创建死信交换器和队列
|
||
- 详细的错误信息记录
|
||
- 统计分析功能
|
||
|
||
## 最佳实践
|
||
|
||
1. **使用异步上下文管理器**自动管理连接
|
||
2. **实现自定义消息处理函数**处理特定业务逻辑
|
||
3. **配置合适的重试次数**避免无限重试
|
||
4. **监控死信队列**及时发现和处理问题
|
||
5. **使用批量处理**提高性能
|
||
6. **设置合理的QoS**控制并发处理数量
|
||
|
||
## 错误处理
|
||
|
||
模块提供了完整的错误处理机制:
|
||
|
||
- 连接失败自动重连
|
||
- 消息处理失败自动重试
|
||
- 超过重试次数发送到死信队列
|
||
- 详细的错误日志记录
|
||
- 死信消息统计分析
|
||
|
||
## 性能优化
|
||
|
||
- 使用连接池复用连接
|
||
- 批量发送消息减少网络开销
|
||
- 设置合适的QoS控制并发
|
||
- 异步处理提高吞吐量
|
||
- 消息持久化保证可靠性
|
||
|
||
## 监控和调试
|
||
|
||
- 详细的日志记录
|
||
- 死信消息统计分析
|
||
- 消息处理时间监控
|
||
- 错误率统计
|
||
- 队列长度监控
|
||
|
||
## 许可证
|
||
|
||
MIT License
|