目录
更多技术交流:https://github.com/singgel
推送框架
推送三种方式:
轮询方式:流量、耗电量
短信推送方式:Android可以拦截短信的内容,缺点是费用昂贵
长连接方式:目前来说靠心跳包维持,难点在于随着客户端数量和消息并发量上升,对于消息服务器的性能和稳定性有很高的要求
自建和使用第三方推送存在的问题:
-
- 应用端与推送端服务强耦合:业务推送一死,整个业务推送不可用
- 缺乏ACK机制:推送是异步的无法得知是否送达,第三方受其他推送方的影响,可能造成延迟和丢失
- 服务会被杀死:后台推送service会被各种主动或被动原因kill
- 缺乏消息的持久化:消息来一条推一条无法追溯历史和状态
- 缺乏重传机制:推送环节过多,任何环节出问题会造成消息丢失,再无法收到
- 客户端接入逻辑复杂:没接入一个新的APP都要进行重复工作,代码无法复用
- 客户端与推送服务的SDK强耦合:但是推送端提供的接口不统一,如果需要替换Client就要重写
- 缺乏数据监控和统计:每天推送了多少,成功到达了多少,失败了多少
解决方法:
(摘自:https://www.infoq.cn/article/HA-mobile-message-push-platform)
分为三层:
接入层:异步方式,提高业务发送速度,具备消息缓冲,保护推送系统
传输层:消息解析----合法性校验----消息转发
应用层:统一SDK
-
- 屏蔽推送接口:实现解耦
- 实现多点接入:同事接入多套推送服务,根据成功率选择最佳的
- 引入消息持久化机制:方便溯源和统计
- 引入消息ACK和重传机制:提供消息到达率
- 实现数据监控和统计机制:提供数据分析统计和报警
- 提供web管理后台:便于APP设备、推送设置、查看数据报表、提高系统维护工作
推送流程:
1.第三方数据进来:此时消息状态为发送失败,留待重发
2.调用第三方接口:客户端无法收到为发送成功,客户端未收到,需要重发
3.客户端收到,回传ACK:服务端没收到ACK为发送成功,客户端未收到,需要重发
4.消息重发了N次:还是没有收到,告警,手动处理
重发机制:
系统启动时:查询所有发送失败或客户端未收到的消息
系统运行时:后台线程定时查询需要重发的消息
手动触发:直接将消息加入推送队列
由于消息推送中间件服务要求高可用,为分布式部署消息重发必须保证在单一节点执行,且重发一次:
1.zookeeper:通过竞争创建临时节点方式获取锁
2.redis:redlock基于redis实现
3.数据库:MySQL的GET_LOCK函数
APNs这种就不要重发,对于APP在前台长连接的使用重发
APP可以对消息进行去重,对于重复的消息客户端收到则不响应
消息内容框架
(摘自:https://www.jianshu.com/p/194819dfc76e)
这里讲非IM类,也是为了:
打开率:
内容:AIDMA模型、强营销类、强关联性、强热点、强话题
时机:早餐(9~10)、午休(12~14)、下班(6~7)、睡前(21~22)
测试:测试中选择出最优文案
个性化:数据分析、自动化或半自动化PUSH
多类PUSH优先级:雪球目前就是每个部分的消息一个劲的都发送,主动的发送消息频次是一周3次左右,在PUSH上减少用户骚扰(个人用户体验感觉贼差)
到达率
技术通道原因
用户主动关闭
转化率
Push消息引导至指定页面
提高打开率之后,检测转化率
卸载率
每一条PUSH都有对应的卸载率= 推送1h后卸载人数 / 达到人数
非IM类消息推送:
新闻资讯类
活动推送类
产品推荐类
系统功能类
好处:
提高用户活跃度和用户粘性
提高用户留存率
提高产品功能和营销活动的用户参与度
坏处:
形成骚扰,卸载率提高
信任度降低
渠道扩展
PUSH、短信、微信组合推送,提高效率
高可用、高性能、高稳定性
消息推送平台通过无状态设计、统一存储、冗余部署方式保证了高可用,对应的状态数据统一存储到 MySQL、Redis 中保证各个无状态实例共享数据。
对于消息的接收处理我们通过纯异步、动态多线程的方式提供了推送平台的高性能。同时对于异步接收的消息我们通过 log append 的方式保证消息先落地然后再进行处理,进一步确保系统在异常过程中我们可以随时恢复消息,保证不丢失。
通过质量保障、全方位多维度监控体系(基础监控、错误日志监控、发送数据波动监控、进程监控等监控指标)保障系统在出现问题时实现秒级报警、及时处理保证了消息推送平台的高稳定性。
推送平台所采用的都是http的rest请求,没有使用厂商提供的SDK,为了减少pom问题出现,以及SDK中的处理细节问题,便于统一把控风险和压力瓶颈,有利于技术栈的统一
苹果:
https://liuyan731.github.io/2017/12/05/How-To-Use-APNs-Pushy/
小米:
https://dev.mi.com/console/doc/detail?pId=40
华为:
https://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush_agent.html?page=hmssdk_huaweipush_api_reference_agent_s2
OPPO:
https://storepic.oppomobile.com/openplat/resource/201908/23/OPPO%E6%8E%A8%E9%80%81%E5%B9%B3%E5%8F%B0%E6%9C%8D%E5%8A%A1%E7%AB%AFAPI-V1.7.pdf
VIVO:
https://dev.vivo.com.cn/documentCenter/doc/155
魅族:
http://open.res.flyme.cn/fileserver/upload/file/201803/be1f71eac562497f92b42c750196a062.pdf