117 lines
3.7 KiB
Markdown
117 lines
3.7 KiB
Markdown
|
|
# QuestionLibraryMQConsumer 项目搭建计划
|
||
|
|
|
||
|
|
## 项目概述
|
||
|
|
搭建一个基于 .NET 8 的 RabbitMQ 消费者服务,用于消费题库相关的消息队列消息。
|
||
|
|
|
||
|
|
## 技术选型
|
||
|
|
- **.NET 8** - 最新 LTS 版本
|
||
|
|
- **Worker Service** - 后台服务模板,适合 MQ 消费者场景
|
||
|
|
- **RabbitMQ.Client 7.x** - 官方 RabbitMQ .NET 客户端
|
||
|
|
- **Serilog** - 结构化日志
|
||
|
|
- **Microsoft.Extensions.Hosting** - 依赖注入和配置管理
|
||
|
|
- **System.Text.Json** - JSON 消息序列化
|
||
|
|
|
||
|
|
## 项目结构
|
||
|
|
```
|
||
|
|
QuestionLibraryMQConsumer/
|
||
|
|
├── QuestionLibraryMQConsumer.sln
|
||
|
|
├── src/
|
||
|
|
│ └── QuestionLibraryMQConsumer/
|
||
|
|
│ ├── QuestionLibraryMQConsumer.csproj
|
||
|
|
│ ├── Program.cs
|
||
|
|
│ ├── appsettings.json
|
||
|
|
│ ├── appsettings.Development.json
|
||
|
|
│ ├── Consumers/
|
||
|
|
│ │ └── QuestionMessageConsumer.cs
|
||
|
|
│ ├── Services/
|
||
|
|
│ │ └── IMessageProcessor.cs
|
||
|
|
│ │ └── QuestionMessageProcessor.cs
|
||
|
|
│ ├── Models/
|
||
|
|
│ │ └── QuestionMessage.cs
|
||
|
|
│ ├── Configuration/
|
||
|
|
│ │ └── RabbitMqOptions.cs
|
||
|
|
│ └── Extensions/
|
||
|
|
│ └── ServiceCollectionExtensions.cs
|
||
|
|
└── .gitignore
|
||
|
|
```
|
||
|
|
|
||
|
|
## 实施步骤
|
||
|
|
|
||
|
|
### 第一步: 创建 .NET 8 Worker Service 项目
|
||
|
|
1. 创建解决方案文件
|
||
|
|
2. 创建 Worker Service 项目
|
||
|
|
3. 添加必要的 NuGet 包:
|
||
|
|
- RabbitMQ.Client
|
||
|
|
- Serilog.AspNetCore
|
||
|
|
- Serilog.Sinks.Console
|
||
|
|
- Serilog.Sinks.File
|
||
|
|
- Microsoft.Extensions.Hosting
|
||
|
|
|
||
|
|
### 第二步: 创建配置模型
|
||
|
|
1. 创建 `RabbitMqOptions.cs` - MQ 连接配置
|
||
|
|
- Host: RabbitMQ 服务器地址
|
||
|
|
- Port: 端口号 (默认 5672)
|
||
|
|
- UserName: 用户名
|
||
|
|
- Password: 密码
|
||
|
|
- VirtualHost: 虚拟主机
|
||
|
|
- QueueName: 队列名称
|
||
|
|
- ExchangeName: 交换机名称
|
||
|
|
- RoutingKey: 路由键
|
||
|
|
- PrefetchCount: 预取数量
|
||
|
|
- ConsumerCount: 消费者数量
|
||
|
|
|
||
|
|
### 第三步: 创建消息模型
|
||
|
|
1. 创建 `QuestionMessage.cs` - 题库消息数据模型
|
||
|
|
- MessageId: 消息 ID
|
||
|
|
- QuestionId: 题目 ID
|
||
|
|
- Action: 操作类型 (Add/Update/Delete)
|
||
|
|
- Content: 消息内容
|
||
|
|
- Timestamp: 时间戳
|
||
|
|
- 其他题库相关字段
|
||
|
|
|
||
|
|
### 第三步: 创建消息处理器
|
||
|
|
1. 创建 `IMessageProcessor.cs` - 消息处理接口
|
||
|
|
2. 创建 `QuestionMessageProcessor.cs` - 具体实现
|
||
|
|
- 实现消息处理逻辑
|
||
|
|
- 支持重试机制
|
||
|
|
- 记录处理日志
|
||
|
|
|
||
|
|
### 第四步: 创建消费者服务
|
||
|
|
1. 创建 `QuestionMessageConsumer.cs` - 继承 BackgroundService
|
||
|
|
- 实现 RabbitMQ 连接和通道管理
|
||
|
|
- 注册消费者
|
||
|
|
- 处理消息投递
|
||
|
|
- 手动 ACK 确认
|
||
|
|
- 处理异常和死信
|
||
|
|
- 实现优雅关闭
|
||
|
|
|
||
|
|
### 第五步: 配置依赖注入
|
||
|
|
1. 创建 `ServiceCollectionExtensions.cs`
|
||
|
|
- 注册 RabbitMQ 配置
|
||
|
|
- 注册消息处理器
|
||
|
|
- 注册消费者服务
|
||
|
|
|
||
|
|
### 第六步: 创建主程序入口
|
||
|
|
1. 修改 `Program.cs`
|
||
|
|
- 配置主机
|
||
|
|
- 加载配置
|
||
|
|
- 注册服务
|
||
|
|
- 配置 Serilog 日志
|
||
|
|
|
||
|
|
### 第七步: 创建配置文件
|
||
|
|
1. 创建 `appsettings.json` - 默认配置
|
||
|
|
2. 创建 `appsettings.Development.json` - 开发环境配置
|
||
|
|
3. 创建 `.gitignore` - Git 忽略文件
|
||
|
|
|
||
|
|
### 第八步: 验证项目
|
||
|
|
1. 执行 `dotnet build` 确保编译通过
|
||
|
|
2. 验证项目结构完整性
|
||
|
|
|
||
|
|
## 关键设计决策
|
||
|
|
1. **手动 ACK** - 确保消息不丢失,处理成功后才确认
|
||
|
|
2. **Prefetch 限制** - 设置合理的预取数量,避免内存溢出
|
||
|
|
3. **连接恢复** - 使用 RabbitMQ.Client 的自动恢复机制
|
||
|
|
4. **优雅关闭** - 在应用停止时正确关闭消费者和连接
|
||
|
|
5. **结构化日志** - 使用 Serilog 记录详细日志,便于排查问题
|
||
|
|
6. **配置外部化** - 所有 MQ 配置通过配置文件管理
|