手机推送服务设计----原创

本文探讨了手机推送服务的设计,重点是长连接和MQTT协议的运用。通过建立链接管理模块、多服务器部署和使用NIO与Reactor模式,提高了系统吞吐能力和容错能力。同时,分析了长连接可能对移动网络产生的影响。
摘要由CSDN通过智能技术生成

背景

我的CSDN博客
我的GitHub
前几天看到一道百度的设计题,如下:

手机推送服务设计,在各个手机端应用都需要一定的云控制能力,可以在某些情况下云端发送各种数据或者命令到手机端,例如发送一个强制升级的命令或者手机app配置变换的数据包,以及发送一个信息给特定人群(某个地区)。
请设计一个以长连接为主的云端控制服务,为了聚焦主要问题,可以忽略掉手机网络(例如:2g网络),手机终端等因素,用户登录的要求。
服务需要承担定向,定量的推送需求,在设计中要尽量高的吞吐能力和容错能力。
需要完成:
a)基本的模块视图
b)链接管理主要设计思路,单台机器承担更多链接,但是链接多了后管理链接(链接中断,链接查找)都会出现性能瓶颈,请尝试给出思路。
c)尝试给出提高容错能力(避免因为某台物理机器或者某个机器上的程序挂掉,导致整个系统不可用)的思路。

分析

针对b,单台服务器承担更多链接后,管理这些链接会出现性能瓶颈,所以需要一个专门的链接管理模块来管理这些链接,使新加入和删除的链接可以进行相应的操作。
针对c,在某台服务器挂掉后,系统可以进行流量转移,将这台服务器上的流量转移到其他服务器上,进行分担,提高系统容错能力。

推送服务原理–长连接

目前主流的推送方案是长连接,长连接是一种被动的方式,而主动权在服务端。每个客户端都与服务器保持着一个连接,并且每隔一段时间发送一次心跳包,服务器收到心跳包数据后会回传一个ACK字段,当在一个keep-alive时间内没有收到心跳包数据,则会断开连接,以节省空间。当然,长连接方式也会有不足,例如,如果大量的客户端与服务器保持长连接时,会消耗服务器资源,而且在未推送消息时,这些长连接会造成空闲连接,对于运营商来说,可能会造成信令风暴,这一问题会在文章的结尾提到。

基于MQTT的推送实现

MQTT是IBM开发的一种即时通讯协议,采用MQTT协议实现ANdroid推送功能是一种基于持久连接的解决方案,客户端每隔一段时间向服务器发送心跳消息保持连接,服务器收到连接信息后,会反馈一个响应ACK字段给客户端,当服务器在keep-alive time的一倍半时间内没有收到客户端的任何消息,就会默认客户端断开了此连接,从而断开这次长连接,基于MQTT协议的推送服务器向客户端的推送流程如下:

  1. 客户端设备需要向推送服务器进行注册,服务器生成一个唯一设备id返回给客户端。
  2. 客户端每隔一段时间向Broker发送一次心跳连接,以保证与Broker之间的连接正常。
  3. 有消息需要推送时,应用服务器读取待推送设备列表,调用API通过MQTT协议将消息发送给BRoker。
  4. Broker通过MQTT协议再将消息转发给需要推送并且连接到Broker的客户端设备,所以能及时收到消息的只是现在和BRoker保持连接信息的设备。

推送服务器框图

推送服务设计框图
设备连接服务器:BRoker在整个服务器端是唯一直接与客户端进行通信的部分,他负责维护及更新客户端连接记录,当设备有离线变成在线状态,Broker还负责给推送队列发送设备连接时间告知消息推送服务器Worker。
消息推送服务器–worker:Worker主要负责从消息队列中读取设备的连接信息,该连接信息包含设备信息和设备所连接的Broker服务器信息。Worker根据设备信息到推送管理后台读取打牌该设备的未推送的消息列表,并把待推送的消息列表推送到设备所连接的Broker。在每次推送完成后,Worker还需要更新数据库中对应的消息的推送状态。
推送管理控制台:提高APP信息管理、消息推送管理、Broker状态管理等。

系统性能保障策略

为了满足题中所要求的链接管理需求和高容错需求及高吞吐量的要求,需要使用几种策略。

基于NIO和Reactor模式–保证高吞吐

吞吐量是衡量性能额关键因素,当大量手机需要与服务器维持长连接,会对服务器内存造成极大消耗,Broker与客户端通信是个socket操作,传统设计中服务器为每个连接分配一个线程,线程去进行socket的读写操作,当socket无数据可读时就会进入阻塞,所以当客户端的并发访问量达到一定数量级,服务器就会分配大量线程,而其中很多线程是处于阻塞空闲状态,这就会造成服务器资源的极大浪费。
而JAVA NIO可以解决这个问题,NIO是JAVA1.4引入的,NIO是非阻塞的,NIO 有一个Selector,Selector可以监控多个IO通道,当没有IO数据时,程序可以做其他事情,当Selector监控的IO通道有数据可操作时,就会发送一个通知,程序就会从IO通道中读取数据。

多服务器部署-保证容错

采用多服务器部署,平时流量均摊,当某个服务器发生故障,故障服务器的流量可切换打牌其他服务器,保证服务的稳定。

ANdroid广播-保证长连接

当移动设备网络发生改变,出发广播事件,推送SDK可监测广播事件来判断移动网络状况,从而有效的维护长连接。

推送服务的不良影响

最后简单谈下推送服务对移动网络的影响,由于本科我是学通信工程的,所以对电信网络有所小小了解,我们使用的移动网络实际上是在运营商的一个大的局域网内,每隔手机实际会有一个内网ip,当访问外部互联网时,需要在移动的网关处进行NAT网络地址转换,才能浏览外部世界,移动运营商会维护一个NAT映射表,每隔客户端对应映射表的一个表项,运营商为了减小维护NAT映射表的开销,会给表项一个超时时间,超过这个时间阈值连接一直空闲的话,就会删除表项。
但推送服务是通过维护一个长连接来完成的,这就需要不断的发送心跳数据包来维持连接,而在移动环境中,由于网络不稳定,就会以更高的频率来发送数据包,这就会使运营商的NAT映射表造成大量表项,从而使维护开销增大。

最后欢迎大家与我交流:
我的CSDN博客
我的GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值