04月09日
CODING 技术小馆 | 极光推送后台服务架构实践

本文为 极光推送开发部开发工程师 曾振波 在 CODING 技术小馆 · 广州站 的演讲内容整理。

大家好,我是来自极光推送开发部的曾振波。我在 2016年 加入极光,目前在极光从事推送架构设计和开发的工作。今天主要跟大家分享的内容有:极光推送服务的架构以及极光接入网关服务的架构。因为我们的接入量很大,所以在这一块会做着重的介绍。另一块是我们极光的推送运维以及监控。还有一块就是极光的推送服务安全,因为我们可能会遇到流量攻击以及其他各种问题。

极光从 2011年 开始做推送服务,目前已经服务了超过 25万 的开发者以及 60万 款 APP,覆盖了 110亿 移动终端,有 8亿 月独立活跃设备,达到 90% 的覆盖率。目前极光的量很大,也存在一些技术挑战。

我们目前的用户量有 110亿,这么大的用户量要连接我们的服务,因为 SDK 是用长连接去维护的,所以需要思考如何调度以及维持它的长连接。SDK 多版本并存,我们的开发者用的并不是最新版本的 SDK,即便他们想用最新的,这个过程当中也需要一个升级周期,因此需要向后兼容各个 SDK 版本。关于推送实时性以及触达率,能不能及时把消息推送到用户的目标设备,以及最终的触达率有多少,这是我们使用推送的基本诉求。因为我们的 SDK 大部分是使用的移动互联网,存在弱网以及网络抖动等等问题,网络环境的影响在这里表现得很明显,所以需要保证我们的消息能够送达。

极光的服务架构

图片

下面跟大家讲一下极光的服务架构。首先开发者从 API 发一个请求,API 收到开发者的请求后,会对开发者进行身份识别以及用户筛选。用户筛选就是根据推送的一个条件,从数据库里筛选出符合推送条件的目标用户,这一块我们用了很多存储集群保存相关信息。接下来是用户分发,我们会从用户信息里查询每个目标用户的 Rom 和地理位置信息,根据 Rom 选择对应的系统级通道以及极光通道,以及根据地理位置信息确认是否需要安卓的 FCM 去下发。极光通道是通过极光长连接维持的私有通道;共享通道是多条极光通道虚拟出来的通道,比如一台设备,上面有多个 SDK,每个 SDK 跟极光后台都有连接,这时这个设备和极光存在一条虚拟通道,如果应用 A 的连接断了,可以通过应用 B 的连接去下发消息,应用 A 重新上线后再切换回来使用自己的长连接进行消息通信。有一些特殊的情况可能不能及时下发到用户手机,推送的时候可以设定一个时间段,在这个时间段内没有送达用户的目标手机,我们就会通过短信的方式将消息推送到用户的手机上。

这是我们目前支持的系统级通道,Oppo 和 Vivo 还在计划当中。

目前极光推送服务架构有几种推送方式,用户筛选的环节主要是用这些条件去选择特定的目标用户。第一是点对点,我们可以选择一个目标用户进行消息推送,同时可以给某个 APP 下的所有用户进行广播,开发者还可以在推送的时候对某一个标签下的所有用户进行推送。另外我们还支持开发者根据地理位置信息以及系统版本等等建立用户群,推送时可以选择这些用户进行推送。另外极光利用人工智能以及大数据分析生成智能标签,开发者可以使用这些智能标签向目标用户进行推送,从传统的推送方式正在向大数据精准推送演进。

图片

最后讲一下极光通道。极光通道有一个在线下发,会查询当前的目标用户是否在线,以及目标用户接入网关服务器的 IP 地址和端口的信息,如果在线就直接发入到接入网关的服务器,然后再转发到 SDK;如果不在线,这时没有办法下发,就需要离线储存后进行再下发。同时在线下发有可能会因为网络问题,消息没有实际送达到 SDK,这个时候需要重新把消息发送到 SDK,所以当 SDK 有登陆或者是心跳上来时,我们会去离线消息库查询当前有哪些离线消息,如果有离线消息,就一一发送到 SDK,SDK 收到消息后,我们会把消息从离线消息库里删除,确保它不会重复下发。

接入网关服务架构

图片

这里着重讲一下接入网关服务架构。目前我们的接入量有 1亿 左右,峰值是 1.2亿,面对这么大的量,我们需要一个较大的系统去维持连接调度。首先 SDK 会去调度中心查询,向调度中心发送一个请求,然后调度中心会根据 SDK 附带上来的 IP 地址、运营商以及地理位置信息,通过调度算法计算出一个数据,然后从接入连接池筛选出来,选出几个接入网关的 IP 地址,返回给 SDK。调度算法充分考虑到三个方面,一是运营商网络,不同的机房对各个运营商的支持程度不一样,需要分配支持对应网络运营商的机房机器,二是地理位置,根据地理位置就近分配地址,最后是接入服务器本身的负载。SDK 拿到接入地址以后会向对应的网关服务器发起一个长连接。我们的健康检测服务会定期检查是否可用,如果不可用,就把这个节点上报到管理中心,管理中心把它从接入连接池去掉,表明不可用,调度中心就不会向 SDK 请求接入下发的 IP 地址;如果后面检测到可用,就重新加入到可用的连接池里面去。

极光经过几年的发展,以前的架构跟现在的架构相比有很大的变动。这几年我们做了几个事情,一是缓存化:极光现在的用户有一百多亿,量级很大,如果还是按照传统的方式通过 MySql 的直接访问硬盘,这么大量的数据访问是很大的挑战,所以现在所有的数据大部分都是用内存的方式去缓存的。其他磁盘上的内容基本上是用来做备份,就是为了保证我们每个数据环节都可以快速访问数据,减少数据访问时间,确保消息可以实时送达到用户的手机上。另一个就是异步化,为了快速开发和上线,我们有很多业务逻辑的串行,随着用户量慢慢增加,会有明显的性能问题,于是我们就逐步改造了异步化,提升了整体的性能和系统的吞吐量。但是异步化存在一个问题,就是代码的复杂性较大,会给开发者增加难度,所以后续我们将增加一个协程化,协程化就是在提高性能的同时降低用户代码的开发复杂性,目前我们是使用 Go 去做部分的服务。另外我们还做了一个微服务化,主要是把复杂的业务拆分成合理粒度的微服务,微服务带来的好处显而易见,但同时也引入了新的麻烦比如复杂的微服务调用链,因此需要根据自己的业务进行合理拆分,现在我们有 100 多个微服务。

图片

这是极光目前的推送服务部署架构,所有的服务都是异地双活,同一个机房内部服务每个模块的通讯方式为 MQ 和 RPC ,机房之间通过 MQ 进行通信,同时对通信数据进行压缩以降低带宽的消耗。MQ 和 RPC 的技术选型是根据业务和团队去选择的,需要考虑功能,性能,跨语言等等,极光使用的 RPC 框架是 ICE。目前使用率较高的还有有阿里 Dubbo 和 Facebook 的 Thrift,Dubbo 在跨语言方面的能力比较弱,目前只支持 Java,但是我们内部使用了很多语言进行开发,所以不符合我们的要求;Thrift 本身支持跨语言开发,但是没有服务治理,如果我们自行开发那么工作量较大,所以我们最后选择了 ICE。MQ 选型考量的因素也大致如此,RabbitMQ 在消息可靠性和灵活的路由策略方面表现优异,还有 Web 可视化的优点,因此成为我们的选择。

图片

这是我们实际部署的,我们每一个模块都是异地双活,比较特殊的情况是接入网关服务器,它是多个机房进行部署的,因为这个接入网关服务器是对外服务的,直接把它跟内部服务模块隔离开了,避免接入网关服务器受到攻击时对其他模块的影响。

我们目前接入网关的服务器部署有 100 多台,单台是 200 多万长连接,覆盖了华北、华东、华南、香港、北美,亚马逊那边也有几台,运营商覆盖了中国移动、联通、电信三大运营商。

运维及监控

在运维以及监控上,一方面是做机器级别指标监控,我们会监控它的带宽、内存、CPU 等等这些信息,包括每秒的收发包信息;还有进程级别指标监控,包括内存和 CPU,还有业务监控曲线,根据自己的业务需要,监控业务请求数量,例如 API 调用次数。另一方面就是通过多地多探测节点检测服务的可用性。我们有一个专门的告警系统,一旦有问题可以通过告警系统及时通知相关的工作人员去处理。

我们的系统不仅需要处理正常的业务需求,还需要在面对一些非正常业务需求时,能够确保不会影响整个系统,所以我们做了一些工作,包括安全校验、频率限制、过保护、异常行为识别以及冒泡、白名单黑名单还有服务降级等。有一些推送的广播量很大,每次广播有几千万的用户,甚至可能每秒钟就推送多次,对我们的系统会造成很大压力,这时就需要快速识别到这个行为,通过告警系统通知相关人员,对它做相关的处理。比如对它的频率进行限制,或者直接放到黑名单里,不让它影响到其他用户。通知开发者处理以后再从黑名单里放出来。

图片

通信安全方面,我们提供了两种方式,一个是 SSL 连接,第二是在我们的连接上做一个私有加密协议,另外用户可以对自己的数据进行加密。我们碰到的比较大的安全问题就是接入网关大流量的 DDOS 攻击,去年比较多一点,今年情况相对比较好一些。目前我们的应对策略是全国各地部署很多个节点,把流量分发到各个节点上;第二就是使用云主机,因为他们在应对攻击方面有更多的资源和比较好的应对策略。我们在自有机房购买了一些高防产品例如防火墙和高防 IP,一旦出现攻击可以对它进行流量清洗。同时充分利用网卡多队列,利用多 CPU 并发去处理网络消息,在流量攻击不是很大的情况下还是有一定帮助的。对于流量攻击还有需要快速发现攻击,比如受到攻击以后需要能够告警,然后采取一些相关的措施,下线还是通知机房进行流量清洗;同时我们在接入口设置了健康检测服务,定时检测节点是否正常,如果不正常的话我们就把它拿下来,然后还需要业务能够快速调度,一旦受到攻击,影响到我们业务的时候,我们就需要能够快速进行重新部署新机器和快速调度。

以上是本次分享的全部内容,谢谢。

扫码关注 扣钉CODING 微信号,获得 CODING 技术小馆和产品更新 第一手信息。
图片

coding2150