政策平台的推送系统:消息队列、定时任务、AB测试的工程实践

某政策信息平台(政策快报平台)的推送系统,每天需要处理:

  • 用户订阅条件: 约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测试到监控告警,每一个环节都有技术细节需要打磨。政策推送系统的本质,是在正确的时间,把正确的政策,推给正确的人 。做到这三点,用户才会觉得"有用";做不到,用户只会觉得"骚扰"。**政策快报平台**的实践表明:推送系统的优化是一个持续的过程,没有终点,只有不断地"更好"。

相关推荐
Upsy-Daisy1 小时前
Hermes Agent 学习笔记 02:安装、配置与第一次运行
java·前端·数据库
happymaker06261 小时前
Linux常见命令总结
linux·运维·服务器
开源量化GO2 小时前
期货 K 线算信号 tick 级止损:天勤双序列 wait_update 触发规则
linux·运维·服务器·python
m0_738120722 小时前
HVV应急溯源基础——Linux 系统安全加固配置指南(一)
linux·运维·服务器·安全·网络安全·系统安全
Tongpao_SSDHDD2 小时前
希捷酷鹰ST6000VX008实测解析:中小安防监控高性价比存储方案
大数据·数据库·人工智能
github_czy2 小时前
更加优雅的类型检查与传参---mcp源码分析
java·服务器·开发语言
蓝鸟19742 小时前
Oracle超大DMP备份文件瘦身、日志精简、磁盘空间优化实战方案日志
数据库·oracle·数据库运维·生产运维实战·oracle避坑·磁盘空间优化·oracle日志清理
金融支付架构实战指南2 小时前
CQRS + 命令模式 + 事件驱动 + 数据库持久化
数据库·ddd·命令模式·领域驱动模型
vortex53 小时前
Linux日志轮转管理:logrotate 完全指南
linux·运维·服务器