五分钟学会智能多通道推送(PUSH)技术

背景

目前手机APP都具有消息推送功能,比如电商类APP会推送活动宣传和促销信息,天气类APP会根据天气变化为你推送天气信息,新闻类APP会定期推送新闻资讯,聊天类APP会把离线消息做成实时推送消息,可以说推送功能已经在手机APP中扮演着越来越重的角色。从运营的角度看推送也是召回用户,提高用户活跃度和粘性的有效手段。

在iOS平台推送功能全部由APNs(ApplePush Notification service)接管,对开发者来说别无选择,当然效果也非常好。

图1 iOS 移动PUSH推送流程

在Android平台Google也提供了一个类似于APNs的功能,但是由于众所周知的原因Google的服务在国内经常不可用,所以国内很多手机厂商直接直接把GCM/C2DM(Cloudto DeviceMessaging)模块去掉了,所以Android推送在国内就出现了很多解决办法。安卓推送总体来说有三种模式:一、手机品牌厂商自建推送通道(小米推送,华为推送等),二、第三方推送比如(个推推送,极光推送等),三、手机应用自建推送通道。

图2 Google GCM/C2DM推送流程

目前Android上绝大部分推送都是基于长连接的Client-Server架构,需要客户端和服务器之间保持一个长连接,虽然Android是可以允许程序驻留在后台,但是由于手机厂商和各种清理程序查杀工具越发严格,所以这个长连接非常不稳定,除非具有庞大用户群和巨大话语权的APP,所以自建通道对普通APP效果不一定最优。手机厂商自建推送通道在自己手机品牌上使用的系统级长连接,所以在自有品牌上到达率是有保证的。第三方推送由于拥有许多手机应用可以做到各种应用直接相互唤醒,所以也能在一定程度上提高到达率。

表1 活跃用户(A通道)各个品牌手机到达率

表2 活跃用户(B通道)各个品牌手机到达率

对每种品牌手机我们希望选择到达率高的通道进行推送,所以多通道推送就成为我们迫切的需求,同时为了增加可靠性,确保服务有较强的容灾能力,我们也需要多通道推送作为保证。

安卓多通道推送整体流程图如下:

图3 智能多通道推送整体流程图

Token获取

为了实现多通道推送,客户端会集成多个推送通道的SDK,SDK会在初始化时将客户手机Token上报给服务端,但是每个SDK都会在一定时间间隔向服务端发送心跳,这样就会使客户端程序耗电量成倍增加,所以客户端要在开启SDK之前请求服务端,根据服务端下发的开启通道指令初始化对应的SDK。具体要开启哪个SDK是逻辑控制层根据取配置中心规则决定,只有在配置发生变化时才会重新通知SDK重新上报Token,这样就也减少了服务端存储重复Token的问题。

图4 客户端Token上报流程图

multiPush

多通道推送分为多种模式,一种是根据业务需求实时推送,另外则是根据某些特征进行的批量推送。我们既要减少数据库的查询压力又要保证数据有比较小的延迟。我们用两个线程分别对发送内存队列做扫描,当消息个数或时间满足条件才会聚合数据,到数据库批量查询结果,最后组装包体交给pushProvider程序。

图5 multiPush客户端原理图

pushProvider

该模块有两个主要功能:一是要尽快把数据推送到第三方推送平台,二是根据配置中心的配置选择出正确通道。

图6 服务端多通道推送流程图

配置中心

配置中心有两种数据,一种是根据各个通道,各个手机品牌,各个APP的推送到达率不同,推荐出的最优通道,二是需要我们人工干预的通道选择开关选项,用于容灾控制和品牌到达率对比。

监控统计

实时统计是作为推送服务提供方,提供给服务使用方必备的功能。上游推送使用方发送完推送功能之后,可以使用实时统计推送结果查询推送结果。同时我们也可以在实时统计中进行达率统计,并对其进行监控,这样就可以及时发现第三方推送中出现的问题,我们随时进行调整。同时我们也可以对批量到达率进行统计分析之后放到配置中心,作为通道选择统计的必备数据。

图7 实时统计监控

总结和展望

本文介绍了58智能多通道推送的推送方案和每个部分的设计框架。分享出来希望和大家交流讨论。接下来我们可能会选择自建通道,虽然自建通道对到达率提高不会有太大帮助,但是现在需要我们对推送目标状态进行更加详细的数据,在线状态,网络情况,长连接的强度,推送失败的具体原因,只有拥有这些数据才能把推送到达率再上一个台阶。

参考

  1. http://bbs.hiapk.com/thread-4652657-1-1.html
  2. http://www.jianshu.com/p/d77eaca4e52a
  3. https://zhuanlan.zhihu.com/p/22909985

原文发布于微信公众号 - 架构之美(beautyArch)

原文发表时间:2017-01-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java 成神之路

使用 NIO 实现 echo 服务器

4617
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2702
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

4708
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4848
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

6768
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2968
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2707
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3105
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4015

扫码关注云+社区