一、Android Push功能现状
Push能够有效地激活用户更多地使用 App,目前大多数应用都有Push功能。
Push功能依赖于Push服务,现在主流的智能手机操作系统都集成了免费的Push服务,如IPhone的APNS(Apple Push Notification service)、windowsphone的MPNS(Microsoft Push Notification service,Android的GCM (GoogleCloud Messaging)。
但是由于Android操作系统是开源的,很多手机厂商都没有预装Google服务,并且Google服务在国内不稳定,所以国内无法使用GCM实现Push功能,这种情况下我们只能使用第三方的Push服务或自己开发Push服务。
开发及时的Push服务首先要考虑到性能、并发量、安全性等因素,它是一个很复杂的系统,当然如果App活跃用户数很少,也可以降低复杂性。
国内应用开发商大多自己部署一个简单的Http服务,客户端每隔一段时间到服务器查询,这种方式的缺点也是显而易见的
Ø HTTP请求的数据包较大,会增加数据流量
Ø 不够及时,如果轮询的时间间隔太短就会很耗电、耗流量
二、第三方Push服务介绍
由于上述一些原因,很多的第三方Push服务应运而生,服务提供商大多数是国外的
1、 Urban Airship
Urban Airship是业界最知名的一个提供推送服务的平台,每月的推送数量达到5.2亿次,平均每分钟的信息发送量约为1.3万次。
除了基本推送服务外,UrbanAirship还提供Rich Push:让Push信息可以带HTML、视频、音频等多媒体信息。此外,UrbanAirship还为iOS和Android提供In-App Purchase(IAP)服务,帮助开发者处理内容存放和安全支付等问题。Urban Airship提供了一个管理后台。开发者在这里不仅能用信息编辑界面来发送Push,还可以监测Push消息的传达情况,观察用户是否产生了交互等统计信息。
推送服务支持以下三个平台:
Ø IOS
Ø Android
Ø BlackBerry
收费标准(按月活跃用户数计费):
0 to10,000users $199
10,001to 25,000 users $499
25,001to 50,000 users $999
50,001to 75,000 users $1,499
75,001to 100,000 users $1,999
活跃用户数超过100,000,按0.24$计费
详细的收费标准请参考:http://urbanairship.com/pricing/
有网友说只要每月推送量小于一百万条就免费,在官网没有找到,估计这是以前的政策
技术支持:
官方提供客户端和Server的SDK,很方便调用,并且有完善的文档
官方网站:http://urbanairship.com/
2、 push.io
push.io也是一个很出名的推送服务平台,已经成功推送了60亿次通知,当然和Urban Airship比还差一大截。
支持以下平台:
Ø iOS
Ø Android
Ø Windows Phone
Ø Nokia Ovi and S40
收费标准:
0.01$/活跃用户/月
250k users享受12.5%的优惠
500k users 享受25%的优惠
超过1百万users享受50%的优惠
具体收费标准请参考:http://push.io/pricing/
技术支持:
提供SDK和文档
不足:
Android SDK使用GCM服务实现的,所以不适合我们使用
官方网站:http://push.io
3、 Pubnub
pubnub是一个云端即时消息服务,通过它我们可以很方便地创建自己的即时应用。
支持的平台:
由于是跨平台的,所以支持所有平台
收费标准:
25 $/月包含每天2500活跃用户
然后每发送1百万条消息需要额外支付1$,每增加1000个活跃用户需额外支付10$
不足:
支持http和websocket(长连接,但是数据是通过http协议传输的)协议,由于java没有Websocket协议,所以是使用Http协议轮询,当然也可以用Socket模拟Websocket。
官方提供的androidSDK是使用Http协议,javascript SDK使用WebSocket协议。
另外,pubnub的每条消息限制在1800字节
官方网站:http://www.pubnub.com/
4、 极光推送
极光推送是国产的一个免费的推送服务,架构非常类似Urban Airship,很多后台网页和操作也基本上和Urban Airship一样。
支持的平台:
Ø Android
Ø IOS
收费标准:
免费
技术支持:
提供sdk和开发文档
不足:
由于刚上线,性能、并发量、安全性等方面还未知,而且没有承诺永久免费,所以还是有风险的
官方网站:http://jpush.cn/index.jsp
三、自主开发push服务
Push服务是一个很复杂的系统,要考虑到性能、并发量、安全性等因素,这些都是技术上的难题,我们需要慢慢摸索、积累。
我们可以参考上述几个服务平台,看看他们是怎么做的
设计角度:
Ø 支持多应用,每个应用分配唯一appKey
Ø 支持多平台
Ø 支持发送到所有设备
Ø 支持发送到指定设备
Ø 支持按时间段发送
Ø 及时推送
Ø 统计推送规律
技术角度:
Ø 使用socket长连接,消息能够及时达到
Ø 优化协议,减少数据包大小
Ø 一般使用json数据格式
流程:
Ø 生成设备唯一ID
Ø 注册到pushserver
Ø 等待消息
Ø 收到消息
Ø 弹出通知
个人对服务器架构的想法:
首先服务器应该是分布式的、可扩展的,其中一个服务作为总服务,然后架设多个子服务器,终端设备需要先连接到总服务拿到需要连接的子服务器地址,然后再连接到具体的子服务器,总服务用于接收各app运营后台提交的push请求,然后通过子服务器分发到每个终端设备。
流程:
服务器之间的交互:
》架设总服务
》架设子服务
》子服务连接并登录到总服务
》定时向总服务报告连接情况
客户端登录过程:
》连接到总服务并获取子服务器地址
》连接并登录到子服务
》到数据库查询有没有发往此客户端的push
》如果有就发送,发送成功后删除
运营后台发送push过程:
》运营后台向总服务发送push数据
》总服务把数据保存到数据库
》然后把此push下发到子服务
》子服务在连接池里查找有没有发送对象
》发送到对应的客户端并删除数据库里对应的数据
附件是我用node.js写的一个demo,完全按照上面的架构写的,一个有四个模块,server:总服务,nodeServer:子服务,client:客户端,app:运营后台
使用方法:
需要先安装node.js环境(http://nodejs.org),安装完成后在cmd里输入命令:nodepath\fileName.js
》打开server,自动开始监听nodeServer的连接
》然后自动开启一个httpServer,用于监听app的push请求
》打开nodeServer,自动连接并登录到server,然后自动监听client连接
》打开client,自动创建10000个到nodeServer的连接
》打开app,自动向server发送多条push,然后push下发到nodeServer,最后分发到各client
四、总结
Urban Airship和极光推送这两个第三方推送服务平台是各方面相对比较好的,以我们目前的活跃用户量来看,如果使用Urban Airship,每月大概需要支付199$,我觉得也可以承受,如果使用极光推送,则需要承担风险。
或者我们也可以尝试自主开发一个Push服务,现在我们的活跃用户量较少,性能和并发量方面可以降低一些标准,这样既可以解决我们面临的问题,也可以锻炼我们的能力。
发件人: Jin ZhengBao(金正宝)
发送时间: 2012年10月30日 14:08
收件人: Zhao LeiYong(赵雷勇)
抄送: Chen Meng(陈孟); Shan PengFei(单鹏飞); Ning Chao(宁超)
主题: 第三方推送服务调研
雷勇
参考以下文章。调研下第三方推送服务(国内外的)。仔细看看文档。写个demo试试,给出个可行性报告。
http://news.eoe.cn/industry/2012/1026/5913.html