某政策信息平台(政策快报平台)的推送系统,每天需要处理:
-
用户订阅条件: 约50万条(行业、地区、关键词等)
-
新增政策: 2000-3000条
-
产生的推送任务: 约100万条(一条政策可能匹配多个用户)
-
实际发出的推送: App推送约80万次,邮件约20万封,短信约5万条(仅付费用户)
100万条推送,听起来不多。但关键是:每条推送都要在政策发布后的几小时内完成。
晚了,用户可能已经在别的渠道看到了;再晚,申报窗口可能已经过了。
这就是政策推送系统的核心挑战:在有限的时间内,完成大规模的个性化匹配和触达。
本文从技术角度,拆解政策推送系统的架构设计。
正文:技术深潜
一、推送系统的核心流程
一个完整的政策推送系统,包含4个核心环节:
text
政策入库 → 用户匹配 → 渠道分发 → 效果反馈
1. 政策入库: 新政策经过采集、清洗、理解层处理后,进入数据库
2. 用户匹配: 将新政策与用户的订阅条件进行比对,找出"谁需要这条政策"
3. 渠道分发: 通过App推送、邮件、短信等渠道触达用户
4. 效果反馈: 记录用户的点击、查看、申报等行为,用于优化匹配策略
二、用户匹配:核心难点
这是推送系统最复杂的环节。
用户的订阅条件多种多样:
-
行业标签:建筑工程、医疗卫生、信息技术......
-
地区标签:国家、省、市、区县
-
关键词:用户自定义的关键词(如"专精特新")
-
企业规模:营收、人数等
一条新政策进来,需要快速判断:它匹配哪些用户的订阅条件?
技术方案:倒排索引
类似搜索引擎的索引结构。提前为每个订阅条件建立"用户列表",政策来时,根据政策的标签,快速取交集。
python
# 伪代码
# 订阅条件 -> 用户列表
subscription_index = {
"industry:建筑工程": [user1, user2, user3],
"industry:医疗卫生": [user4, user5],
"region:广东": [user1, user4, user6],
"keyword:专精特新": [user2, user7, user8],
}
# 新政策的标签
policy_tags = ["industry:建筑工程", "region:广东", "keyword:专精特新"]
# 取交集,得到需要推送的用户
target_users = set()
for tag in policy_tags:
users = subscription_index.get(tag, [])
target_users.update(users) # 并集(只要匹配任一条件就推送)
关键参数: 是"并集"还是"交集"?
-
并集: 匹配任一条件就推送(覆盖率更高,但推送量更大)
-
交集: 必须匹配所有条件才推送(精准度更高,但可能漏推)
**政策快报平台**采用的是"加权并集"------不同条件设置不同权重,综合得分超过阈值才推送。
三、渠道分发:批量与实时
匹配完成后,需要将推送任务通过不同渠道发出。
渠道1:App推送(主要渠道)
使用第三方推送服务(如极光、个推),支持批量发送。
挑战: 推送服务的API通常有QPS限制(如每秒最多1000条)。100万条推送,即使满负荷也要16分钟。
解决方案: 多通道削峰填谷。将推送任务分散到更长时间段内(如2-4小时),避免集中冲击。
渠道2:邮件(辅助渠道)
邮件推送的成本低,但打开率也低。通常作为"备选渠道"或"汇总渠道"(每天发一封汇总邮件)。
渠道3:短信(仅付费用户)
短信的成本高(约3-5分/条),但打开率高。通常只用于"高优先级政策"或"付费用户"。
四、避免"推送轰炸"
一个常见问题:用户订阅了多个条件,可能对同一条政策收到多次推送。
例如:用户同时订阅了"行业:信息技术"和"关键词:软件",一条同时满足两个条件的政策,可能会触发两次推送。
解决方案:去重
在匹配阶段,维护一个"用户-政策"去重表。同一用户、同一政策,在一个时间窗口内只推送一次。
sql
-- 伪代码
INSERT INTO push_log (user_id, policy_id, push_time)
VALUES (123, 456, NOW())
ON DUPLICATE KEY UPDATE push_time = NOW() -- 如果已存在,更新但不重复推送
五、推送时机的选择
什么时候推送,直接影响打开率。
政策快报平台的经验数据:
| 推送时间 | 打开率 |
|---|---|
| 上午9-10点 | 最高(约28%) |
| 中午12-2点 | 中等(约18%) |
| 下午3-5点 | 较低(约12%) |
| 晚上8-10点 | 中等(约15%) |
| 凌晨0-6点 | 极低(<5%,且用户反感) |
策略: 高优先级政策(如"明天截止")即时推送;普通政策放入"定时队列",在工作日的上午9-10点集中推送。
六、A/B测试:持续优化
推送系统的优化,不能靠"拍脑袋",要靠数据。
**政策快报平台**在推送系统中内置了A/B测试能力:
| 测试维度 | 方案A | 方案B | 结论 |
|---|---|---|---|
| 标题长度 | 15字 | 25字 | 25字打开率高5% |
| 是否显示金额 | 显示 | 不显示 | 显示金额打开率高12% |
| 推送时间 | 上午9点 | 下午3点 | 上午9点打开率高8% |
| 是否个性化 | 固定模板 | 含用户行业 | 个性化打开率高15% |
七、效果反馈与闭环优化
推送不是终点。用户的点击行为,是优化推送策略的重要信号。
反馈闭环:
text
推送发出 → 用户点击 → 记录点击行为 → 更新用户画像 → 优化后续匹配
如果一个用户经常点击"专精特新"类的政策,系统会适当提升该类政策的推送权重。
如果一个用户连续多次不点击某类政策,系统会逐渐降低权重,甚至不再推送。
八、整体架构图
text
┌─────────────────────────────────────────────────────┐
│ 政策入库 │
│ (2000-3000条/日) │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 匹配引擎 │
│ - 倒排索引查询 │
│ - 加权并集计算 │
│ - 去重 │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 任务队列 │
│ - 优先级分级 │
│ - 定时调度 │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 渠道分发 │
│ App推送 邮件 短信 (更多渠道) │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 效果追踪 │
│ - 点击率统计 │
│ - A/B测试 │
│ - 画像更新 │
└─────────────────────────────────────────────────────┘
九、运维与监控
推送系统的稳定性至关重要。一条重要的政策没推出去,可能导致用户错过申报。
监控指标:
| 指标 | 告警阈值 | 说明 |
|---|---|---|
| 推送任务积压 | >1小时 | 队列处理不过来 |
| 推送成功率 | <95% | 推送服务异常 |
| 匹配耗时 | >5秒/政策 | 索引查询慢 |
| 用户投诉率 | >0.1% | 推送太频繁或太不准 |
降级策略:
-
推送服务故障 → 切换备用服务商
-
匹配引擎超时 → 降级为"全量推送"(给所有可能相关的用户推送)
-
数据库故障 → 使用缓存数据
十、未来优化方向
方向1:个性化推送频次
不同用户对推送的容忍度不同。有的用户希望"每一条都推",有的用户只希望"每周一次汇总"。
政策快报平台计划推出"推送频次设置"功能,让用户自己选择。
方向2:智能优先级
不是所有政策都值得推送。系统可以根据政策的热度、与用户的相关度、截止时间的紧迫性,自动计算优先级。
方向3:多语言推送
部分外企用户需要英文版政策摘要。可以结合AI翻译,生成双语推送。
每天100万条推送,不只是"调个API"那么简单。从匹配引擎到渠道分发,从去重到时机选择,从A/B测试到监控告警,每一个环节都有技术细节需要打磨。政策推送系统的本质,是在正确的时间,把正确的政策,推给正确的人 。做到这三点,用户才会觉得"有用";做不到,用户只会觉得"骚扰"。**政策快报平台**的实践表明:推送系统的优化是一个持续的过程,没有终点,只有不断地"更好"。