`

小米海量数据推送服务技术讲解

阅读更多

11.11大促,随着移动端业务量的急剧提升,像小米推送这样的基础服务也经受了巨大的考验。11月12日,小米的项目总监汪轩然在微博上宣布,“小米推送服务共发出9.65亿条消息,平均每分钟发送67万条。更值得一提的是,后台监控显示,推送服务后台系统在全天运作非常平稳,没有任何卡顿拥堵现象,让各种促销、返利、订单更新消息第一时间触达用户。”

汪轩然,2007年毕业于清华大学计算机系,后加入微软亚洲工程院,曾参与WP7上的浏览器的开发。2010年7月加入小米,曾担任米聊安卓团队的团队主管,现在在小米任项目总监,负责小米的开发者服务,掌管推送服务、统计服务和移动广告联盟三大业务,旨在为小米搭建一个移动App业务的互联网生态圈。

我们联系了汪轩然,就小米推送服务的架构、特点、性能等问题对他进行了采访,以下内容根据本次采访整理而成。

基础技术架构

协议是推送服务的核心。小米推送服务所采用的协议是由之前的米聊演变过来的,而米聊从一开始就选择使用XMPP协议,之后开发团队对XMPP协议做过几轮精简和重构。现在XMPP部分只是作为一个数据的传输层,之上跑着各种独立的业务,每个业务称为一个“channel”;每个channel上跑的数据格式可以是不一样的。消息推送服务是其中一个channel,这个channel上传输的数据是通过Thrift进行二进制化的协议格式。

再来看一下小米推送服务的服务端架构。下图是后台服务端的一个基本架构图。整个服务端包含如下几层:

  1. XMPP前端:用于维护跟客户端之间的长连接,使用EJabberd项目来处理来自客户端的XMPP请求,同时通过XMQ模块来处理推送服务特有的XMPP消息协议。
  2. 中间层:业务逻辑层,主要用于将消息请求异步化、创建和维护消息队列、以及处理客户端的一些命令请求(注册、设置别名、设置topic等)。
  3. HTTP前端:这一层负责对接来自第三方App的服务器的发消息的HTTPS请求,以及来自客户端生成账号的HTTPS请求。

再就是数据存储,这里采用了小米的统一HBase存储,同时还使用MySQL来保存一些量不大,但需要复杂过滤条件的数据(topic等),并且为了降低对HBase的压力,中间还加了一层Redis作为缓存。

最后看一下客户端架构。客户端SDK主要包含两个层次:SDK层和PushService层。前者提供了面向App接入的接口、回调方法以及对Thrift的数据进行反序列化的处理逻辑;后者用于维护XMPP长连接和收发消息。两层之间使用Intent方式来传输数据。值得一提的是,在MIUI系统上,PushService层是系统共用的,即MIUI系统提供了一个统一的PushService管理模块,不需要每个应用单独启动自己的PushService。

功能实现

小米推送服务支持单发和群发消息两种推送方式。单发消息支持针对regID和别名两种方式,regID是小米推送服务后台根据设备标识+appID+时间戳生成,为了减少设备碰撞概率,设备标识我们采用的依据是imei+AndroidID+build序列号。别名是App在客户端设置上报的,便于应用将自己的设备/用户标识符同我们的regID作关联,这样App就不需要在后台维护regID跟设备/用户的对应关系了。群发消息采用打标签的方式来区分,客户端和服务端都可以给指定设备设置标签,发消息的时候,只需选取指定标签发送即可,小米推送后台会将标签所对应的设备展开。一个标签支持的设备数无上限。

那小米推送服务的稳定性是如何保证的呢?小米推送服务采用多机房方案,平时流量均摊,一旦某个机房出现故障,流量无缝切换到其它机房,并且单个机房的容量能保证提供无损服务。目前是双机房部署,预计明年会扩展第三个机房。

安全性也是小米推送服务重点考虑的一个因素。数据传输过程中,得益于推送服务采用的双层协议方案,消息会采取双重加密,第一重是XMPP传输层,保证数据在网络传输的过程中不会被篡改、监听。第二重是在Thrift二进制层,用以保证消息到达Service之后,通过broadcast发送给App进程的过程中不会被截获和伪造。第二重加密往往会被其它第三方推送服务忽略,但其风险同样很大。

性能指标

11.11大促,所面对的请求量是在小米推送服务的设计容量之内的,目前设计和机器规模可以支持峰值每分钟1000万条消息;平时业务量至少每分钟40万,峰值每分钟600万条消息。

推送消息量平时波动很大,所以开发团队准备着流量随时可能忽增200%的情况,并在线下做好压力测试和优化;如果流量特别大,还有以下应对措施:

  1. 异步排队处理,此时消息送达时间可能会比平时稍慢,但不会对整个系统有太大冲击;
  2. 消息有优先级,广播消息会以低优先级处理;
  3. 限流,控制开发者发送消息的频率;
  4. 扩容,如果机器负载过高或者某个服务有瓶颈,可以很快速地增加机器,部署服务,增强系统处理能力。

小米推送服务所经历的重构

软件系统在开发和演进过程中,经常会经历较大规模的重构。小米推送服务有两次比较大的重构。

一是开发语言从Erlang 转为Java。 小米原来的消息系统是使用Erlang开发的,所以推送系统的第一版也是基于Erlang;但是Erlang的社区不够活跃,开发人员很难找,学习曲线陡,支持工具和类库少,所以后来开发团队选择了使用Java重新开发;迁移到Java后,对开发人员的要求降低,各种工具和类库较多,大大提高了开发效率。

二是无处不在的Cache。客户端使用小米推送服务的SDK,开发者使用API的情况千变万化,很多场景是意料之外的;需要对调用频繁的业务添加Cache,尽可能在本地进程内处理;例如,对于客户端调用API设置别名和订阅topic,先检查Cache是否已经设置过,只有没有设置才往后端服务发送;优化后,后台服务的业务压力大大减少。

在开发小米推送过程中的一些感悟

  1. 服务要支持水平扩展,尽可能实现为无状态,或者使用一致性哈希进行划分;方便扩容,可以保证即使系统暂时有性能瓶颈也能通过加机器解决。
  2. 监控先行,能够很方便地采集、分析服务器的负载和业务的请求量、percentile、slow log,能够清楚了解到系统的瓶颈,有针对性地改进。
  3. 不要过早优化,先实现功能并尽快上线,根据监控数据对关键地方进行优化。
  4. 敏捷开发,快速迭代,日拱一卒,每天都有简短的站立会议,能够迅速响应变化,持续改进系统。

 

from  http://www.techug.com/xiaomi-1111-pushservice

分享到:
评论

相关推荐

    小米推送之消息推送的Demo

    小米推送是一种针对Android应用开发者的消息推送服务,它可以帮助开发者实现向用户设备实时发送消息的功能,提高用户活跃度和应用粘性。小米推送提供了一系列API和SDK,方便开发者集成到自己的应用中。在这个"小米推...

    Android-Push一个推送的模块集成了华为小米和极光推送

    推送服务通过与设备上的消息推送服务器(如GCM/FCM、华为Push Kit、小米Push、极光Push等)进行交互,当服务器有新消息时,会通过网络将消息推送到设备上,然后由系统通知栏展示给用户。这种机制使得应用即使在后台...

    Android代码-小米系统级推送

    从图1可以看出,PushDemo(使用小米推送的应用)并未启动后台推送服务,也成功收到了推送。 什么是小米系统级推送,为什么会有这个项目 小米推送是小米公司提供的推送服务。就我个人看来非常喜欢这个服务,而且许多...

    C#.net版小米推送SDK.rar

    小米推送SDK是一款专门为Android应用程序设计的服务,用于向用户设备发送通知和消息,无论用户是否在应用内。这个压缩包“C#.net版小米推送SDK.rar”包含了一个.NET版本的实现,使得开发者能够在C#环境中利用小米推...

    小米推送demo

    小米推送(MiPush)是小米公司推出的一种高效、稳定、智能的云消息推送服务,旨在帮助开发者提升用户活跃度、提高应用黏性。通过这个"小米推送demo",开发者可以快速了解并掌握如何在自己的Android应用中集成小米推...

    Android手机端小米推送Demo解析和实现方法

    首先,使用小米推送服务前,开发者需要在小米开发者平台上注册并申请成为开发者,经过审核后,可以获得AppID和AppKey。这两个关键参数是实现小米推送的基础,它们用于识别应用并确保推送消息的安全性。 小米推送...

    Go-小米推送支持201706版本ios推送标题自定义铃声等功能

    小米推送服务是一个强大的工具,允许开发者向小米设备发送消息,增强用户交互体验。在Go语言环境中集成小米推送API,我们可以构建高效、稳定的应用程序后台。 1. **Go语言基础** Go,又称Golang,是Google开发的一...

    在任何非 MIUI 设备上体验小米系统级推送.zip

    "在任何非 MIUI 设备上体验小米系统级推送" 这个标题揭示了我们讨论的主题是关于让小米的系统级推送服务在非小米(MIUI)系统的Android设备上运行。这意味着该项目可能是一个解决方案,使得用户可以在非MIUI的...

    小米推送jar

    小米推送jar 3.4

    小米推送服务端SDK-C#/.Net版

    小米推送服务端SDK官方只提供了PHP与JAVA版本,C#、.Net小米官方是没有的,这个是通过JAVA版本转换成C#、.Net的版本,可以直接集成至现在C#、.Net的服务端项目,满足移动项目消息推送需求

    Android-在任何非MIUI设备上体验小米系统级推送。

    在Android平台上,小米的MiPush框架提供了一种高效、稳定且智能的消息推送服务,使得开发者能够在非MIUI设备上也能实现类似小米系统级推送的体验。MiPush是小米云服务的重要组成部分,它允许应用程序在后台运行时...

    小米推送Java代码

    小米推送Java代码是小米公司推出的消息推送服务,允许开发者在自己的应用程序中实现消息推送功能。本文将详细介绍小米推送Java代码的使用和实现细节。 一、小米推送Java代码概述 小米推送Java代码是一款基于Java...

    Android 仿小米系统级推送.zip

    在Android平台上,实现类似小米系统级推送的功能是一项技术挑战,因为这涉及到消息的实时性、电池效率以及用户隐私的平衡。小米的系统级推送服务,是通过深度集成到MIUI操作系统中来提供高效、可靠的通知服务,即使...

    安卓消息推送通知栏相关-小米推送之消息推送官方Demo有Eclipse和androidstudio两种版本.rar

    在Android应用开发中,消息推送是一项重要的功能,它能让应用在后台时也能向用户...不过需要注意,由于技术更新快速,这些Demo可能与最新的Android API或小米推送服务有差异,实际使用时可能需要根据最新文档进行调整。

    手机推送(百度,华为,魅族,小米,腾讯)

    本文将详细讲解如何在Java服务端实现百度推送、华为推送、魅族推送和小米推送的整合,为新手提供一个手机端通知推送的参考。 首先,我们来看百度推送(Baidu Push)。百度推送是百度云提供的一项服务,它能够帮助...

    小米推送sdk(服务器端)

    小米推送SDK(Mi Push SDK)是小米公司提供的高效、可靠的推送服务解决方案。它旨在帮助开发者将消息和通知快速、准确地推送到小米设备上的应用程序,提升用户体验和应用的互动性。 主要特点: 高效稳定: 小米推...

    高可用的移动消息推送平台方案.docx

    然而,国内多家手机厂商如小米、华为等提供了自己的推送服务。 - **应用级方案**: - **第三方推送服务**:如个推、极光推送等服务商提供的解决方案。这类服务具有开发成本低、消息到达率高的特点,成为大多数应用...

    支持 Python3 的小米 push 服务端

    小米Push服务端是小米公司为开发者提供的一种即时通讯服务,用于向安卓设备推送消息。由于原始的小米推送SDK仅支持Python2,对于Python3开发者来说,可能会遇到兼容性问题。这个"支持Python3的小米push服务端"项目,...

    小米、华为、个推、阿里云三方推送服务api-java服务

    我在此博客中详细的书面表达了关于小米,华为,个推,阿里云推送的应用操作,可能有很多人还是不太理解,我将我包里的四个java类也传了上来仅供参考,不要全篇复制,这份代码较老,而且jar包的版本也有更新,请到...

Global site tag (gtag.js) - Google Analytics