推送技术——个推技术实现原理介绍

概述

PUSH是互联网上内容提供者和内容定制方之间的一种通信机制,利用在服务器端的程序把数据源源不断地推向客户端,大大提高客户机和服务器之间的交互性能。

传统互联网上数据交互一般有poll和push两种方式。poll典型使用场景是浏览网页,是用户主动发起请求,向服务器获取数据;push刚好相反,通过服务器直接发送数据给客户端,用户被动接受消息,类似于更加及时的短信。Push的使用场景有以下两特点:时间不确定性、时效性,如发送团购信息,发送电子消费账单等。

个推为第三方应用提供了跨手机平台一致的、稳定可靠的消息推送服务,实现服务端到客户端的消息主动推送。第三方应用可以实现针对单一目标地址的推送,也可以实现群发消息推送,还可以通过指定tag进行定向群组推送。个推除了为第三方提供基本的透明消息传输,还提供了一些消息展示方式,实现在客户端的通知提示、弹框操作等,帮助客户快速实现更为定制化的消息推送服务。

个推目前支持Android、iOS手机平台。

技术原理


首先我们来看一下组成一个推送系统的几个要素

  1. 个推SDK:

以jar的方式出现,集成于第三方客户端,解析第三方下行的数据,并把结果透传给第三方客户端;也可以上行第三方定制的客户端信息。

  1. 个推服务器:

一侧负责维护与成千上万的个推SDK的长时连接,另一侧与第三方服务器对接,将第三方定制数据下行推送至个推SDK。

  1. 第三方服务器:

数据推送的发起者,通过对接个推服务器,将数据发送至第三方客户端。

  1. 第三方客户端:

第三方集成个推SDK的客户端,推送数据正真的接收者和展现者。

以上是个推推送系统中的四个不同角色,看起来比较抽象,可以通过以下图片来加强理解:

说明:

AppID:应用ID,第三方在个推系统注册帐号并创建生成的唯一的应用标识。

ClientID:用于标识客户端身份,由第三方客户端获取并保存到第三方服务端。

UID:一般为第三方系统帐号体系中的用户标识。第三方服务端一般需要保存UID和ClientID的映射关系,进行消息推送时,通过UID查找到相应的ClientID,便可进行定向推送了。

我们用一个更加形象的方式来描述一下这个系统:淘宝购物相信很多人都体验过,就拿它举个例子。

淘宝卖家——第三方服务器

淘宝买家——第三方客户端

快递公司(比如顺风)——个推服务器

集淘宝买家中的地址管理、快递查收、包裹检验等一系列工作的集合——个推SDK(这个有点不形象,但是大概理解意思就好)。

假设淘宝买家下了一单,首先需要填写寄件地址(假设不用默认的),这个相当于个推SDK根据客户端的信息,建立了一条通道(快递配送地址)。

当买家付款成功后,卖家需要发货(第三方服务端要推送数据),当然先叫快递公司拿件(把推送数据发送给个推服务器),快递公司根据包裹上的地址(第三方客户端的身份信息,就是上面所说的ClientID)将包裹(数据)寄送到买家(第三方客户端),买家收货后,先验收一下货物是否有损坏(数据是否符合定制要求),获取到包裹内容(获得服务端推送的数据),并签单验收(个推SDK反馈数据发送成功)。

与上面的例子相对应,我们再描述一遍整个推送过程的技术流程:

  1. 第三方客户端集成个推SDK。

  2. 第三方客户端启动的时候,调用SDK接口,启动推送服务,SDK后台运行并维护和个推服务端的长连接,实现SDK注册和登录。

  3. 第三方服务端调用个推服务器的接口,将要发送的数据通过个推服务器发送到指定身份的个推SDK当中。

  4. 个推SDK解析定制数据,并且把第三方服务器透传的数据发送给第三方客户端,第三方客户端根据服务器的数据做出相应的动作或者展现。

陷阱


初步看来,实现一个推送系统并不是特别复杂,然后实际上,尤其是针对Android移动终端来说,仍然有相当多的技术问题需要克服。

  1. 电源管理

Android系统为了最大程度降低手机功耗、延长待机时间,在电源管理方面做了非常大量的底层工作,对电池的使用到了精打细算的地步。然而Android系统在电源管理方面做出的这些努力,很轻易地就能被不守规矩的应用程序消耗殆尽。个推SDK服务作为需要长期后台稳定运行的程序,在电源管理方面能够做到取之有度,日均耗电量能够控制在40mAh左右,对用户日常手机使用几乎没有影响。

  1. 网络稳定性

在国内移动运营商网络条件下,地区差异、时间段差异、运营商差异都比较明显,使得手机上实现稳定的联网困难重重。为了在各种网络条件下,都能实现稳定联网和流量消耗的兼顾平衡,个推研发了能够根据网络状况动态调整心跳间隔的自适应算法,以最小的网络代价实现最稳定的联网质量。目前个推SDK空载流量消耗每月仅有0.8M-1.2M,不会对用户的钱袋造成损失。

  1. 性能问题

为了实现千万SDK同时连接到服务端,同时又能控制系统运营成本,推送平台需要具备平行可扩展能力,以及较高的接入服务器性能。目前个推系统通过内核调优、代码优化、层级架构设计等技术手段,已经实现单击200w稳定在线,理论上支持无限平行扩展,并且经得起实践考验,正在在线上为超过千万的用户提供稳定的推送服务。

总结


推送服务是伴随着移动互联网的发展,逐渐显露出来的商业化诉求。越来越多的移动应用、电商、游戏意识到推送服务对于自身业务的重要性,然后国内的现状,导致Android系统上并没有稳定可靠的推送服务可供使用,于是个推应运而生。本文概要介绍了个推系统的结构和消息推送流程,并对实践中必须解决的技术问题做了探讨。个推致力于实现Android系统上最稳定可靠的推送服务,并在相关技术参数上做到了极致。

时间: 2024-10-14 00:26:42

推送技术——个推技术实现原理介绍的相关文章

iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解(转载自薛银亮 [email protected])

原文地址:http://www.cnblogs.com/66it/p/4784224.html iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解 什么是消息推送 举一个常见的例子,我们的手机上经常会有弹出一些信息,例如QQ信息.微信信息等等,这就是常见的消息推送. 例如: 消息推送的类型: 在屏幕顶部显示一块横幅(显示具体内容) 在屏幕中间弹出一个UIAlertView(显示具体内容) 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容) 更新app图标的数字(说明新

iOS推送之远程推送

最近公司项目升级重构(重写),除了本来我所负责的模块,最后临危受命接了推送(远程和本地)相关的模块,顺便把推送的相关知识复习了一遍.后期连续工作十几天加上最后一天的通(瞎)宵(熬)达(一)旦(夜),也算是不辱使命.此文除了讲解远程推送相关的基本知识外,也会涉及一些推送相关的奇淫技巧.另外本文主要讲解远程推送,后续会出一篇iOS推送之本地推送(iOS Notification Of Local Notification)的姊妹篇. 此篇文章的逻辑如下图所示: 图0-0 此篇文章的逻辑图 远程推送原

C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送

前言 本文将使用一个NuGet公开的组件技术来实现数据订阅推送功能,由服务器进行推送数据,客户端订阅指定的数据后,即可以接收服务器推送过来的数据,包含了自动重连功能,使用非常方便 nuget地址:https://www.nuget.org/packages/HslCommunication/            github地址:https://github.com/dathlin/HslCommunication                                 如果喜欢可以s

Android推送 百度云推送 入门篇

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27231237 现在app基本都有推送的功能,于是看了下百度云的推送,官方文档和Demo都很到位,记录下使用过程,目标是利用百度云推送最为服务器写个及时通讯的例子~当然了,这是第一篇入门~ 1.第一步就是在百度开发者服务管理中创建项目,然后拿到API key , Secret Key ;这个过程就不多说了,上官网直接申请就行,不复杂. 2.下载云推送的客户端SDK,SDK的压缩文

iOS推送之本地推送

写此文的原因可见此文章的姊妹篇iOS推送之远程推送(iOS Notification Of Remote Notification),如果你看过了它的姊妹篇,了解过了远程推送,那么再来看此本地推送,真真是易如反掌啊! 此篇文章的逻辑如下图所示: 图0-0 此篇文章的逻辑图 本地推送介绍 本地推送和远程推送的功能是一样的,都是要提醒用户去做某些事情.但是和远程推送不同的就是本地推送是不需要设备联网的,而远程推送是必需要设备联网的,因为只有联网状态下,才能和苹果的APNs服务器建立长连接,从而推送消

Qt通过极光推送向app推送消息

简介 最近在做个项目,当客服端收到防盗的消息通知时向手机app推送一个消息,告知有防盗报警.这么小的功能没必要自己写个推送端,极光推送免费而且推送的成功率高,已经能满足我们的需求了. 极光推送的文档大家可以到极光推送的官网查看(http://docs.jiguang.cn/),由于我们这是是使用Qt C++开发的极光推送并没有提供c++的封装,这里我们选择rest API的方式推送,rest API的推送方式的demo以及json格式在http://docs.jiguang.cn/server/

远程推送(个推)

大家所说的推送一般都是指远程推送.远程推送是指我们需要通过苹果的服务器向我们的应用程序发送消息,即使用户将应用程序关闭用户也会收到消息横幅.极光推送大家估计是大家都在使用的,今天我们主要来看一下个推推送.他们的流程其实是一样的,在此之前,还是先说一下整个远程推送的流程吧. 1)首先作为应用程序,我们先要获取用户的授权,如果用户不允许,那么我们是无法进行推送的.在iOS8.0推出之后,苹果的授权做了一些调整,废话不多说,请看代码. if ([[[UIDevice currentDevice] sy

ios (推送)之本地推送

iOS上有两种消息通知,一种是本地消息(Local Notification),一种是远程消息(Push Notification,也叫Remote Notification),设计这两种通知的目的都是为了提醒用户,现在有些什么新鲜的事情发生了,吸引用户重新打开应用.本地推送也可以通过服务器控制,比如说如果有新消息了,推送消息,但是,前提是程序必须是打开的,而远程推送,是通过苹果APNS服务器,推送给手机,手机在推送给具体的哪个程序,一般远程推送用到的比较多,先介绍下本地推送,下节在介绍远程推送

Android推送之极光推送

[1].[代码] Android推送之极光推送 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 include('jpush.php');             $n_title   =  '123ios';             $n_content =  '123ios123ios123ios123ios123ios123ios';               $appkeys='48dabb0655de51355ff7536c';    

.net平台借助第三方推送服务在推送Android消息(极光推送)

.net平台借助第三方推送服务在推送Android消息(极光推送) 最近做的.net项目(Windows Service)需要向Android手机发送推送消息,真是有点困难,没有搞过就不停的搜文档,最后看到了一个开源项目PushSharp,可以在.net平台推送IOS,Android,Windows Phone等设备消息,大喜,然后先做了IOS的,成功了,但是做Android的时候遇到了问题,一直推送不成功,程序执行了,但是推送一直出不来,后来费劲的在网上搜,没有找到,最后放弃使用这种推送And