# msg 消息通知服务 > 版本:0.1(骨架) > 日期:2026-07-07 > 状态:P5 待交付 > 关联文档:[架构影响地图](../../architecture/004_architecture_impact_map.md) --- ## 1. 模块职责 msg 是消息通知限界上下文,管理 Message、Notification、Announcement 聚合。 消费各服务领域事件,触发多渠道通知投递(站内信、邮件、短信、App 推送)。 与 push-gateway 协作建立 WebSocket/SSE 长连接,实现实时消息推送。 --- ## 2. 技术栈 | 类别 | 技术 | 版本 | 用途 | |------|------|------|------| | 语言 | TypeScript | 5.5+ | 类型安全 | | 框架 | NestJS | 10.x | 依赖注入、模块化 | | ORM | Drizzle ORM | 0.31+ | 数据访问 | | 数据库 | MySQL | 8.x | 消息持久化 | | 缓存 | Redis | 7.x | 未读计数、会话 | | 队列 | Kafka | - | 事件消费 | | 模板 | Handlebars | - | 通知模板渲染 | | 校验 | Zod | 3.23+ | 运行时校验 | --- ## 3. 架构图 ```mermaid graph TB K[(Kafka)] -->|消费事件| MSG[msg 服务] MSG --> DISP[Dispatcher
渠道分发] MSG -->[(MySQL
消息持久化)] MSG -->[(Redis
未读计数)] DISP --> INAPP[站内信] DISP --> EMAIL[邮件] DISP --> SMS[短信] DISP --> PUSH[push-gateway
实时推送] MSG -.事件.-> K2[(Kafka
edu.msg.*)] ``` > 待 P5 交付时补充完整的分层架构图与多渠道分发图。 --- ## 4. 核心流程图 ```mermaid sequenceDiagram participant K as Kafka participant MSG as msg participant PG as push-gateway participant U as 用户 K->>MSG: edu.teaching.exam.published MSG->>MSG: 创建 Notification 记录 MSG->>MSG: Dispatcher 渠道分发 MSG->>PG: gRPC Push(userId, payload) PG->>U: WebSocket 实时推送 MSG->>MSG: 更新未读计数(Redis) ``` > 待 P5 交付时补充:广播通知流程、通知模板渲染流程、未读计数同步流程。 --- ## 5. 对外契约 - **gRPC 服务**:MessageService、NotificationService、AnnouncementService(待 P5 定义 protobuf) - **消费事件**:`edu.identity.user.*`、`edu.teaching.*`、`edu.insight.*` - **发布事件**:`edu.msg.notification.sent`、`edu.msg.announcement.published` - **数据库表**:messages、notifications、announcements、notification_templates、outbox > 待 P5 交付时补充完整 protobuf 定义与表结构。 --- ## 6. 依赖关系 - **上游**:teacher-bff、student-bff、parent-bff、push-gateway(gRPC 推送调用) - **下游**:MySQL、Redis、Kafka、外部邮件/短信网关 - **跨服务**:消费所有业务事件触发通知;与 push-gateway 协作实时推送 --- ## 7. 架构约束 1. 通知投递必须至少一次语义,失败重试 3 次 2. 通知模板必须使用 Handlebars 渲染,禁止字符串拼接 3. 未读计数必须 Redis 实时维护,异步同步 MySQL 4. 广播通知必须分批投递,避免瞬时流量冲击 > 待 P5 交付时补充完整约束清单。 --- ## 8. 架构决策 > 待 P5 交付时补充 ADR 记录,预计包括:多渠道分发策略、模板引擎选型、推送可靠性保证、广播限流策略。