1. 项目背景与需求分析若依RuoYi作为国内广泛使用的开源后台管理系统其消息通知模块SysNotice在长期使用中暴露出几个典型问题首先是功能单一仅支持站内信形式的简单通知其次是扩展性差无法对接多种消息渠道最后是缺乏统一管理界面导致消息追踪和统计困难。在实际企业应用中消息中心需要承担更复杂的职责多渠道集成邮件、短信、企业微信、钉钉等消息模板管理发送记录审计失败重试机制用户订阅配置2. 架构设计方案2.1 核心模块划分消息中心 ├── 消息网关Message Gateway ├── 模板管理Template Manager ├── 发送引擎Delivery Engine ├── 记录存储Record Storage └── 管理界面Admin Console2.2 技术选型考量Spring Cloud Stream解决不同消息中间件的适配问题Redis Stream实现消息发送的削峰填谷MyBatis-Plus增强原有ORM层的灵活性Vue3 TypeScript重构管理前端关键决策保留SysNotice表结构但修改用途仅作为站内信专用存储避免影响历史数据3. 核心实现细节3.1 消息协议标准化public class UnifiedMessage { private String messageId; // 雪花算法生成 private MessageType type; // 枚举NOTICE/ALERT/REMINDER private String templateCode; private MapString, Object params; private ListReceiver receivers; private SendConfig config; // 包含重试策略等 }3.2 发送流程优化接收请求时先持久化到MySQL保证不丢失通过Redis Stream异步处理采用责任链模式处理不同渠道发送graph TD A[接收请求] -- B[参数校验] B -- C[持久化记录] C -- D[推送到Redis Stream] D -- E[消费者处理] E -- F{渠道判断} F --|邮件| G[SMTP发送] F --|短信| H[对接云厂商API]3.3 失败处理机制实现要点自动重试3次可配置失败消息进入死信队列提供手动重试接口记录详细错误日志4. 关键问题解决方案4.1 性能优化二级缓存设计本地缓存Caffeine存储模板内容Redis缓存存储用户订阅配置批量发送支持单次API调用支持最多1000个接收人4.2 权限控制改造方案PreAuthorize(ss.hasMsgPerm(send:email)) public Result sendEmailMessage(...) { // 方法实现 }4.3 历史数据迁移编写Flyway迁移脚本-- V2__convert_notice.sql ALTER TABLE sys_notice ADD COLUMN msg_type VARCHAR(20); UPDATE sys_notice SET msg_type LEGACY;5. 前端改造要点5.1 管理界面增强新增消息看板展示实时发送统计模板编辑器支持变量插值语法发送记录查询支持多条件筛选5.2 用户端改进消息分类展示重要/普通多终端已读状态同步订阅偏好设置6. 部署注意事项Redis配置要求spring: redis: stream: poll-timeout: 5000 consumer-group: msg-center-groupNacos新增配置# 邮件发送线程池配置 msg.email.pool.core-size5 msg.email.pool.max-size20健康检查端点GetMapping(/health) public MessageCenterHealth checkHealth() { // 检查各渠道连接状态 }7. 实测性能对比测试环境4C8G服务器MySQL 8.0Redis 6.2场景原SysNotice新消息中心提升单条发送延迟120ms80ms33%批量发送(100条)2.1s0.8s62%高并发(1000QPS)失败率12%失败率0.3%-8. 扩展设计建议插件化架构通过SPI机制支持第三方渠道接入public interface MessageChannel { String getChannelType(); SendResult send(UnifiedMessage message); }流量控制基于Sentinel实现按照消息类型限流按照发送方限流消息追踪集成SkyWalking实现全链路追踪9. 典型问题排查记录消息重复消费问题现象相同消息ID被处理多次原因消费者组配置错误解决确保每个服务实例有独立consumerGroup模板渲染性能差现象高并发下模板解析耗时增加优化引入预编译机制Template template TemplateCache.get(templateCode); if(template null) { template compileTemplate(templateText); TemplateCache.put(templateCode, template); }企业微信回调失败现象回调URL返回403排查网关白名单未配置解决在网关模块添加路径放行规则改造过程中发现原有消息表的create_time字段精度只到秒级建议统一修改为DATETIME(3)存储毫秒时间戳方便后续问题排查时精确追踪消息流转过程。