← 返回生产场景
🔔 消息通知
短信 / 邮件 / 推送 / 站内信 / 模板 / 到达率
📨通知系统架构核心
通知类型多(短信/邮件/APP推送/站内信),渠道多(阿里云/腾讯云/极光),不能每种写一套逻辑。
| 通知渠道 | 场景 | 成本 | 延迟 |
| 短信 | 验证码、订单通知、告警 | 高(3~5分/条) | 秒级 |
| 邮件 | 报表、账单、注册激活 | 低 | 分钟级 |
| APP推送 | 订单状态变更、活动通知 | 低 | 秒级 |
| 站内信 | 系统公告、互动消息 | 免费 | 实时 |
// 统一通知服务(策略模式)
public interface NotifyChannel {
boolean send(String to, String content);
}
public class SmsChannel implements NotifyChannel { ... } // 阿里云短信
public class EmailChannel implements NotifyChannel { ... } // JavaMailSender
public class PushChannel implements NotifyChannel { ... } // 极光/个推
public class NotifyService {
private Map<String, NotifyChannel> channels; // 渠道注册
public void notify(NotifyRequest req) {
for (String channelType : req.getChannels()) {
channels.get(channelType).send(req.getTo(), req.getContent());
}
}
}
⚡异步发送 + 重试生产
通知不能阻塞主流程(下单时发短信不能让用户等短信发完)。异步 + 失败重试。
// 异步:通过 MQ 解耦
// 下单时只发一条消息到MQ,消费者慢慢发通知
rabbitTemplate.convertAndSend("notify.queue", req);
// 消费者:发通知 + 失败重试
@RabbitListener(queues = "notify.queue")
public void handle(NotifyRequest req) {
try {
notifyService.notify(req);
} catch (Exception e) {
log.error("通知发送失败,将重试", e);
throw e; // 抛出 → MQ重试3次 → 仍失败进死信队列
}
}
到达率优化:① 短信用多渠道切换(阿里云发不了切腾讯云)② 限频防刷(60秒内只发1次)③ 敏感词过滤 ④ 降级(短信挂了转站内信)。
生产场景 · 消息通知 · 全栈资料库