26.app后端怎么架设推送服务
推送服务已经是app的标配了。架设推送服务,除了可以使用第三方服务商外,也有大量的开源技术可以选择。
现在推送主要分两块,android推送和ios推送,在下面分别论述:
1. Android推送
Android手机由于没有系统的限制,当app进入了后台后,也能运行服务,所以android的推送可以基于长连接,这就注定了android的推送服务器和一般的app后端是不一样,技术细节上,架构上也不一样,幸好,现在有大量的开源软件可以轻松地实现推送。
下面深入研究过的开源推送软件:gopush-cluster为例,说明android推送服务的一般架构。
gopush-cluster,这是由猎豹移动开源的推送软件,已经被广泛应用于下面的业务:
微看、猎豹浏览器热剧推荐,追剧提示;
游戏的游戏活动推送;
手机助手app推荐,广告;
电池医生实时推荐、求生手册的实时消息;
PC毒霸的指令下发(web换肤,升级提示),漏洞泡泡等;
PC手机助手实时游戏、广告推荐;
PC猎豹浏览器上WEB
和gopush-cluster架构师毛剑讨论技术,很感谢毛剑同学不厌其烦的解答,帮助我理清了很多gopush-cluster设计上不容易明白的地方,而且毛剑同学还是个美男架构师哦^-^
下面对gopush-cluster的讲解来源于毛剑同学的博客,决定真实可靠的资料:
gopush-cluster的架构图:
主要分为三个模块来开发,comet/web/message。
(1)comet
主要负责消息排队、消息推送以及和客户端的连接维护;整套系统依据是消息ID顺序原则获取消息(客户端本地获取最大的消息是1,那么之后获取的消息就是大于1的,获取离线消息的时候也要从上次最大消息ID来获取),因此消息推送以后需要在comet中排队然后发起RPC给message实现存储。
(2)message
主要负责消息的存储和读写;接受来自comet模块的消息进行持久化,或者接受web模块的读取消息请求获取离线消息。message是可以部署多个节点来负载来自大量comet的推送压力,比如不同的comet使用不同的message节点(节点无状态),之后在comet也会做多message节点的负载均衡RPC调用和故障转移(TODO)。
(3)web
主要负责节点询问,以及离线消息获取和后台节点管理等;节点询问主要依据客户端的订阅Key一致性hash计算出连接的comet节点地址,因此海量客户端连接的时候可以打散到多个comet来服务;另外离线消息也是通过web接口返回给客户端的,但是消息的读取是通过RPC发送给message模块的,尽量的职责单一。web节点因为无状态,可以部署多个web,来实现负载均衡和故障转移。
(4)thrid-part
消息存储现在主要依赖Redis进行消息读写(SortedSet),因为Sorted Set不支持int64类型的Score(我们也开发了一个支持int64 Score的分支但是因为时间原因没有大量测试上线),之后可能会使用HBase集群代替Redis的使用,已提供更安全的离线消息存储(TODO)。
另外使用了Zookeeper来实现的同一个comet的故障转移,例如comet节点1可以有一个备选节点节点2,当节点1注册到zookeeper之后,因为机器或者其他原因宕了,这时候会在web层触发zookeeper的选举选中节点2来服务。
2. ios推送
APNS 是Apple PushNotification Service(Apple Push服务器),由于ios系统的限制,大部分应用是不允许在后台运行并连接网络的。在应用没有被运行的时候,只能通过 Apple Push Notification Service (APNs) 把消息送到app。
Apns的推送原理如下图:
推送的过程经过如下步骤:
1. 首先,安装了具有推送功能的应用,我们的设备在有网络的情况下会连接苹果推送服务器,连接过程中,APNS会验证device_token,连接成功后维持一个长连接。
2. Provider(我们自己的服务器)收到需要被推送的消息并结合被推送设备的device_token一起打包发送给APNS服务器。
3. APNS服务器将推送信息推送给指定device_token的设备。
4. 设备收到推送消息后通知我们的应用程序并显示和提示用户(声音、弹出框)。
在接入apns服务过程中,有两个问题需要注意:
1. 服务端连接到apns服务器的连接,空闲了一段时间后,apns服务器会自动断开这个连接,这时服务器就需要做重连操作。
2. 发送了无效device_token后的处理 。
为啥会有无效的device_token呢?当用户卸载了app后,用户的device_token就失效了,这个失效的device_token已经被保存在数据库中。当向apns服务器推送消息时,如果推送了这个无效的token,就会error-response。
如果有error-response,那么这条之后的通知都需要重发。隔一段时间后,这个连接会断开,但是,在断开前的时间,发送的device_token都会失效。所以我们考虑重发的问题。error-response中返回的通知ID,可以帮助我们找出哪条出错了,这样就能知道哪些需要重发了.
另外,APNS的feedbackservice会返回那些已经卸载的设备的device_token。在数据库中删除这些device_token,下次就不用再给他们发了,可以节省点资源。
在网络上找到解决了上面两个apns推送问题的开源软件:
1. java方面:dbay-apns-for-java
2. python方面:apns-client
3. 结语
对于创业公司来说,我一直推崇的架构原则是“尽量使用成熟的第三方服务和软件,自己只负责业务逻辑”。
如果没达到百万级的规模,实在没必要架设自己的推送服务器。而且,现在所有的推送软件,都缺一个良好的管理后台。例如,我想知道某个用户为啥没收到推送,是因为推送不发送,还是发送了用户没收到啊?只能在海量的日志中寻找答案,每次遇到这种问题,都是一个杯具。
--------------------------------------------------------------------------------------------------------------------------
打开链接 app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。
【作者】曾健生
【QQ】190678908
【app后端qq群】254659220
【微信公众号】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi
如果您觉得文章对你有所帮助,欢迎打赏。
微信打赏:
支付宝打赏:
版权声明:本文为博主原创文章,未经博主允许不得转载。
26.app后端怎么架设推送服务的更多相关文章
- app后端设计(3)--短信,邮件,推送服务(2014.12.05更新)
在app的后端设计中,免不了消息的推送,短信,邮件等服务,下面就个人的开发经验谈谈这方面. (1)最重要的是,各种推送一定要放在队列系统中处理,不然会严重影响api的响应时间. (2)短信方面 以前我 ...
- 海外 App 的推送服务,试试 FCM 吧!!!
> **版权声明:** > > **本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有.** > > **每周会统一更新到这里,如果喜欢,可关注公 ...
- 手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客
http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. ...
- Android推送服务——百度云推送
一.推送服务简介 消息推送,顾名思义,是由一方主动发起,而另一方与发起方以某一种方式建立连接并接收消息.在Android开发中,这里的发起方我们把它叫做推送服务器(Push Server),接收方叫做 ...
- 基于netty-socketio的web推送服务
实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推 ...
- Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- Netty_Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- 【netty】Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- App之百度云推送
集成SDK 下载最新的Android SDK压缩包并解压,在新建工程或已有工程中增加百度云推送功能. 我下载的是 ,里面有一个同名的文件夹,文件夹中有 导入云推送jar包和so文件: 将解压后的lib ...
随机推荐
- Windows核心编程读书笔记1
今天特别困啊,这是为什么?!!刚刚把第一章看了一下,困到不行,所以写blog清醒一下. 第一章标题是“错误处理”,看了之后吓了一跳,难道第一章就讲这么高大上的东西?!不是不是,我现在的理解是,这章主要 ...
- 万水千山ABP - 系统发布后迁移 CodeFirst 数据库[原创]
在项目开发的过程中,常会遇到项目发布后还变更数据库的情况.这时如何方便地进行数据库迁移呢 ? 下面直接列出操作的步骤: 1. 发布修改后的应用: 将最新版本的应用更新到目标机器中.更新的文件当然不包括 ...
- eclipse中英文(等各国语言)版本转换发放
eclipse界面语言的切换方法 1.该方法只支持安装过中文包的eclipse(其实中文包中几乎包含了全世界所有的语言,只是调用了其中的中文简体而已) 2.在桌面的快捷方式中目标的地址后面加上参数-n ...
- javascript学习(三)——常用方法(2)
一.兼容性较高的浏览器页面关闭 //关闭网页,不支持火狐(火狐返回上次浏览页面) //FireFox非window.open()等弹出页面,需要在地址栏中输入about:config, 然后将do ...
- CSS3实现多种背景效果
灵活的背景定位 实现效果: 将背景图定位到距离容器底边 10px 且距离右边 20px 的位置. background-position 方案 实现代码: <div>海盗密码</di ...
- SystemJS to Webpack – Before You Begin
http://angularfirst.com/systemjs-to-webpack-before-you-begin/ This is a primer discussing why to mov ...
- Install OpenCV 3.0 and Python 2.7+ on Ubuntu
为了防止原文消失或者被墙,转载留个底,最好还是去看原贴,因为随着版本变化,原贴是有人维护升级的 http://www.pyimagesearch.com/2015/06/22/install-Open ...
- .net core2.0通过entityframework访问Sqlserver数据库
.net core经历2.0版本之后,已经非常稳定,完全可以进行企业级开发并跨平台部署到几乎任何服务器.个人测试效率是.net core是.net framework效率的3倍.其他语言没有测试,等测 ...
- Manacher算法解析
Manacher算法 Manachar算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符 ...
- vfd折腾(一)
从一开始驱动一块翻出来的液晶显示屏就想做一个电子时钟,偶然翻到了vfd(Vacuum Fluorescent Display的缩写,意为真空荧光显示屏). 此后就走上了不归路