专栏首页原创个推技术实现原理介绍

个推技术实现原理介绍

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

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

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

技术原理 首先我们来看一下组成一个推送系统的几个要素 1. 个推SDK: 以jar的方式出现,集成于第三方客户端,解析第三方下行的数据,并把结果透传给第三方客户端;也可以上行第三方定制的客户端信息。 2. 个推服务器: 一侧负责维护与成千上万的个推SDK的长时连接,另一侧与第三方服务器对接,将第三方定制数据下行推送至个推SDK。 3. 第三方服务器: 数据推送的发起者,通过对接个推服务器,将数据发送至第三方客户端。 4. 第三方客户端: 第三方集成个推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左右,对用户日常手机使用几乎没有影响。
  2. 网络稳定性 在国内移动运营商网络条件下,地区差异、时间段差异、运营商差异都比较明显,使得手机上实现稳定的联网困难重重。为了在各种网络条件下,都能实现稳定联网和流量消耗的兼顾平衡,个推研发了能够根据网络状况动态调整心跳间隔的自适应算法,以最小的网络代价实现最稳定的联网质量。目前个推SDK空载流量消耗每月仅有0.8M-1.2M,不会对用户的钱袋造成损失。
  3. 性能问题 为了实现千万SDK同时连接到服务端,同时又能控制系统运营成本,推送平台需要具备平行可扩展能力,以及较高的接入服务器性能。目前个推系统通过内核调优、代码优化、层级架构设计等技术手段,已经实现单击200w稳定在线,理论上支持无限平行扩展,并且经得起实践考验,正在在线上为超过千万的用户提供稳定的推送服务。

总结 本文简要介绍了个推系统的结构和消息推送流程,并对实践中必须解决的技术问题做了探讨。个推致力于实现Android系统上最稳定可靠的推送服务,并在相关技术参数上做到了极致。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 打造亿级日活SDK的十大常见问题及解决方案 顶

    一个好的SDK应该具备易用性、稳定性、轻量、灵活的特点,而个推作为国内第三方推送市场的早期进入者,一直致力于为开发者提供高效稳定的推送SDK。

    个推君
  • 如何通过个推SDK实现IM功能

    产品上线4年多以来,个推已经服务了逾19万app开发者和35万app,助推了无数拥有亿级用户量的合作伙伴应用精细化运营。 但是,大多数开发者都不了解,用个推的推...

    个推君
  • 个推数据统计产品(个数)iOS集成实践

         最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据。这次我们尝试使用的是个推(之前专门做消息推送的)旗下新推出的产品“个数·应用...

    个推君
  • 如何通过个推SDK实现IM功能

    产品上线4年多以来,个推已经服务了逾19万app开发者和35万app,助推了无数拥有亿级用户量的合作伙伴应用精细化运营。 但是,大多数开发者都不了解,用个推的推...

    个推君
  • MNIST重生,测试集增加至60000张!

    尽管MNIST是源于NIST数据库的基准数据集,但是导出MNIST的精确处理过程已经随着时间的推移被人们多遗忘。因此,作者提出了一种足以替代MNIST数据集的重...

    AI科技大本营
  • vscode 远程连接服务器:remote-ssh使用配置

    Python编程越来越普遍,在我的应用中,已经完全替代了Perl,正在替换R语言。

    邓飞
  • Python3.6学习笔记(六)

    由于Python的灵活性,提供了多种方式可以作为服务端语言,包括Python编写的服务器(Medusa)、Python处理模块(mod_python),或者使用...

    大江小浪
  • 交易所纷纷支持挖矿,谁主沉浮?

    随着六月初,FCoin开创了交易挖矿的新纪元之后,挖矿正式进入了交易所和普通用户的视野。所有人都不觉眼前一亮,原来交易所还可以这么玩?而随着以FCoin为首的挖...

    区块链领域
  • 【NLP】T5 模型:Text-to-Text 预训练模型超大规模探索

    相信大多 NLP 相关者,在时隔 BERT 发布近一年的现在,又被谷歌刚发布的 T5 模型震撼到了。又是一轮屠榜,压过前不久才上榜自家的ALBERT,登上 GL...

    yuquanle
  • T5 模型:NLP Text-to-Text 预训练模型超大规模探索

    本文来自微信公众号 @安迪的写作间 ,AI开发者获授权转载,如需转载,请联系原作者。

    AI研习社

扫码关注云+社区

领取腾讯云代金券