在数字化转型浪潮中,企业面临着一个共性痛点:消息通知渠道碎片化。市场部用短信发促销、运维团队靠邮件报故障、客服部门依赖微信模板消息,这种割裂状态导致三个典型问题:
我们设计的统一推送平台,本质上是一个消息路由中枢。就像快递行业的区域分拣中心,不管收件地址是北京四合院还是上海写字楼,所有包裹都先集中到分拣中心,再通过最优路径派送。这个架构的价值在于:
提示:该平台特别适合中大型企业,当消息日发送量超过10万条时,统一管理的收益会明显超过改造成本
采用经典的四层架构设计,自下而上分别是:
code复制[ 基础设施层 ] ← [ 通道适配层 ] ← [ 业务逻辑层 ] ← [ 接入层 ]
基础设施层:消息发送的物理支撑
通道适配层:各渠道的对接实现
业务逻辑层:核心业务处理
接入层:对外暴露的服务形式
消息队列对比选型
| 方案 | 吞吐量 | 延迟 | 可靠性 | 运维复杂度 | 选型理由 |
|---|---|---|---|---|---|
| RabbitMQ | 中 | 低 | 高 | 中 | 社区支持好 |
| Kafka | 高 | 中 | 高 | 高 | 适合日志场景 |
| RocketMQ | 高 | 低 | 高 | 中 | 阿里云生态 |
最终选择RabbitMQ的原因:
数据库分库策略
按消息类型水平分库:
每个库再按时间分表(每月一张表),避免单表数据量过大影响查询性能。
java复制// 伪代码展示核心发送逻辑
public void sendMessage(MessageRequest request) {
// 1. 参数校验
validateParams(request);
// 2. 模板渲染
String content = renderTemplate(request);
// 3. 频控检查
if (rateLimitExceeded(request.getReceiver())) {
throw new RateLimitException();
}
// 4. 持久化记录
MessageRecord record = saveToDatabase(request, content);
// 5. 投递到MQ
rabbitTemplate.convertAndSend(
getRoutingKey(request.getMsgType()),
buildMQMessage(record)
);
}
关键点说明:
当某个通道出现故障时(如短信到达率骤降),系统自动执行降级流程:
降级规则配置示例(YAML格式):
yaml复制sms:
primary: aliyun
backups: [tencent, yunpian]
downgrade:
threshold: 30%
duration: 5m
actions:
- type: switch_channel
params:
target: tencent
- type: notify
params:
receivers: [ops-team]
对于营销类群发消息,采用"小批量并行"策略:
优化前后对比:
| 指标 | 原始方案 | 分片方案 | 提升幅度 |
|---|---|---|---|
| 10万条耗时 | 68分钟 | 9分钟 | 87% |
| CPU峰值利用率 | 85% | 63% | -22% |
| 数据库QPS | 3500 | 1200 | -66% |
三级缓存体系:
特别针对短信验证码场景的优化:
redis复制SETNX {mobile}_code 123456 EX 300
lua复制local code = redis.call('GET', KEYS[1])
if code == ARGV[1] then
redis.call('DEL', KEYS[1])
return 1
end
return 0
问题1:某云短信接口返回成功但实际未送达
问题2:微信模板消息突然大面积失败
连接池配置:
JVM参数:
bash复制-XX:+UseG1GC
-Xmx4g
-XX:MaxGCPauseMillis=200
特别提醒:避免过度优化,先通过压测找到真实瓶颈
监控指标:
当前系统已支持日均300万消息的稳定发送,后续重点优化方向:
智能化路由:
全链路追踪:
边缘计算:
这套架构经过3次618大促验证,最高承受过每秒5000+消息的峰值流量。核心经验是:消息系统要像城市的交通管理系统,既要有统一调度中心,也要给每个通道足够的自治能力。