由于最近在对推送系统做设计,所以可能会持续更新哟~!
前言
群发系统其实和推送系统是很类似的,都是通过服务器这个中间载体向用户大规模的去推发消息,架构是类似的,但是又不是尽完全相同的,本篇文章会对推送和群发的对比,来说明推送框架设计的核心。
架构设计

推送框架
[此处图片暂时省略。。。]
Server服务 –> route –> cs –> client
功能与接口的设计
推送所需要的功能是保证在长连接连接上App以后,能及时推送消息到用户手机上,以及做好统计记录,所以这其中有几个点是我们在设计接口时需要考虑的。
- 在给app推送我们需要推送什么样的消息可以做到对业务方进行接耦合,可以让业务方推送各种类型的消息,而推送服务无感知
这个就是接口设计上面的问题了,在用户发送的时候我们要做到透传,那么接口的设计是只和我们需要推送的消息类型相关,而跟消息的内容无关。所以在设计上我们可以直接考虑简单的设计:
1 | struct PushMsg { |
- 查询需要通过哪几个维度维度发送与查询
我们只对带任务式标志的做记录,不重要的推送不会统计入数据库
发送时间、版本区间、业务号、userid、token
其中token是可以针对单条消息进行查询。
查询内容:
1 | 目标数(计划推送的目标个数) |
不同点 :
存储性质
- 对于群发:相当于是官方消息发送给每个用户,所以针对必须收到消息的每个用户,每条消息都要存入数据库中,那么就会有批量存入数据库的需求。
- 对于推送:同样是发送,并不具体关心,用户是否收到,而是关心发出去消息的情况。所以只需要存一条消息进入数据库,而对于这条消息的发送量则是它关注的,发送目标数、有效数、确认到达数等。
频控性质
- 对于群发:频率控制的核心在于对数据库的存储,为了不影响数据库的存储而对用户的发送做频控。
- 对于推送:频率控制的核心在于发送者对于业务的把控。
群发核心分析
对于统计的数据
对于推送来说,最重要的是每条消息的数据统计。
我们可以通过架构设计图看到,统计发送总量的部分在cs,那么我们需要从cs把统计到发送用户的数据给返回回来。
有效用户和游客
[分两条线,一条走老的route,一条走新的route]