# 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 配置通过配置文件管理