《用户通知体系全流程实战》
第2章 通知体系架构设计
2、通知体系架构设计
通知体系作为用户触达的核心基础设施,其架构设计直接决定了系统的扩展性、稳定性与运维效率。本节将围绕整体架构图与四大核心模块(发送、路由、模板、日志)展开详细解析。
📐 通知体系整体架构图
▲ 通知体系分层架构,各模块职责清晰、解耦协作
📌 核心模块划分
通知体系由四大核心模块构成,各模块独立部署、通过消息队列异步通信,保障高可用与水平扩展能力。
📤 发送模块内部流程
▲ 发送模块通过适配器模式对接不同渠道,支持动态扩展
🧭 路由模块决策流程
▲ 路由模块根据规则引擎决策,将通知分发到不同策略队列
📋 模块间协作关系
- 🔹 发送模块 从消息队列消费任务,调用渠道适配器完成推送,并将结果写入日志模块
- 🔹 路由模块 根据用户画像与通知类型,将通知请求分发到对应的发送队列或延迟队列
- 🔹 模板模块 提供模板渲染服务,发送模块在推送前调用模板模块获取最终内容
- 🔹 日志模块 采集全链路数据,支持实时监控与事后分析
📦 核心模块代码示例(发送模块重试机制)
// 发送模块重试策略示例
public class SendRetryHandler {
private static final int MAX_RETRY = 3;
private static final long BASE_DELAY = 1000L; // 1秒
public SendResult sendWithRetry(NotificationTask task) {
SendResult result = null;
for (int attempt = 1; attempt <= MAX_RETRY; attempt++) {
try {
result = channelAdapter.send(task);
if (result.isSuccess()) {
log.info("发送成功, taskId={}, attempt={}", task.getId(), attempt);
return result;
}
} catch (ChannelException e) {
log.warn("发送失败, taskId={}, attempt={}, error={}",
task.getId(), attempt, e.getMessage());
if (attempt == MAX_RETRY) {
// 写入死信队列
deadLetterQueue.push(task);
return SendResult.fail("超过最大重试次数");
}
// 指数退避
Thread.sleep(BASE_DELAY * (1L << (attempt - 1)));
}
}
return result;
}
}
💡 架构要点:各模块通过消息队列解耦,发送模块采用适配器模式支持新渠道快速接入,路由模块使用规则引擎实现灵活分发策略,模板模块通过缓存提升渲染性能,日志模块全链路追踪保障可观测性。