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