一、📌 为什么需要过滤规则?
群发短信不能盲发:
-
避免发送给非目标用户,提高命中率和用户体验;
-
符合业务策略(如:只发给活跃用户 / VIP 用户);
-
降低成本(短信单价高);
-
合规性要求(不可群发骚扰短信)。
二、🧠 常见的过滤维度(用户画像)
维度 | 示例 |
---|---|
用户身份 | 是否是 VIP 用户、是否是注册用户 |
活跃度 | 最近 7 天登录、近 30 天购买 |
行为特征 | 收藏数、加购数、最近浏览时间 |
地理位置 | 城市、省份、是否境外 |
触达历史 | 最近是否已接收短信、是否退订 |
业务状态 | 是否已下单、是否完成认证、是否有投诉记录 |
三、🧱 实现方式对比:过滤规则 DSL vs SQL
方式 | 描述 | 优点 | 缺点 |
---|---|---|---|
SQL筛选 | 直接拼接 SQL + 分页查数据库 | 高效、灵活 | 安全性需控制(防注入) |
DSL方式 | 使用类似 JSON/DSL 表达规则(转换成 SQL) | 前端可视化,安全性高 | 实现稍复杂 |
人群圈选 | 提前做用户画像打标签(如通过离线数仓生成人群标签) | 快速、复用性强 | 依赖数据标签体系 |
四、🧩 示例:过滤规则 DSL 配置
{
"logic": "AND",
"rules": [
{ "field": "lastLoginTime", "operator": ">", "value": "2024-06-01" },
{ "field": "userLevel", "operator": "IN", "value": ["VIP", "SVIP"] },
{ "field": "city", "operator": "=", "value": "上海" }
]
}
👉 可视化界面通过 DSL 构建规则 → 后端转换为 SQL。
SELECT user_id, phone
FROM user_profile
WHERE last_login_time > '2024-06-01'
AND user_level IN ('VIP', 'SVIP')
AND city = '上海'
LIMIT 1000 OFFSET 0
五、⚙️ 过滤规则处理流程(结合系统架构)
1. 前端运营配置过滤规则(可视化 DSL 构建器)
↓
2. 后端转换规则 → SQL 语句或执行过滤引擎
↓
3. 批量分页查询用户(每批1000)→ 放入异步投递队列
↓
4. 消费端发送短信,失败自动重试 / 限流
六、📦 技术栈实现建议
功能 | 技术实现 | 补充说明 |
---|---|---|
DSL 解析 | 自定义规则引擎 / Aviator | 把 JSON 表达式转为 SQL 语句 |
查询执行 | MyBatis / JPA + 分页插件 | MySQL / ClickHouse 作为底表 |
人群缓存 | 查询结果缓存 Redis / ES | 避免重复查询,提升效率 |
大人群处理 | 数据分片 + 多线程 / 任务拆分 | 减少单次查询压力 |
七、🧪 示例:完整过滤 + 群发投递流程(项目中常用)
活动主题:618大促VIP提前通知
-
规则 DSL:
{ "logic": "AND", "rules": [ { "field": "userLevel", "operator": "=", "value": "VIP" }, { "field": "lastOrderTime", "operator": "<", "value": "2025-06-01" }, { "field": "receiveSms", "operator": "=", "value": true } ] }
-
SQL 转换后:
SELECT phone FROM user_profile WHERE user_level = 'VIP' AND last_order_time < '2025-06-01' AND receive_sms = true
-
投递流程:
-
运营后台创建任务,配置规则
-
后端分页查询符合规则用户(分页拉取+放入MQ)
-
消费端调用短信网关发送短信
-
限流、失败重试机制保障发送质量
-
八、🎯 面试高频问答总结
面试问题 | 推荐答题要点 |
---|---|
如何实现短信用户筛选? | 配置 DSL/SQL 规则 → 转 SQL 查询用户画像库 → 分页处理 |
如何避免发送给不符合要求的用户? | 通过过滤规则系统,过滤行为特征/活跃度/黑名单用户 |
群发短信中如何应对超大人群? | 查询分页 + 分片处理 + MQ异步投递 |
如何让运营配置筛选更灵活? | 提供 DSL 可视化规则引擎,支持逻辑表达式组合 |
数据量大时查询性能如何优化? | 建立标签库 / 人群缓存 / 索引优化 / 异步处理 |