個推技術實現原理介紹

weixin_33766168發表於2015-04-07

概述
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系統上最穩定可靠的推送服務,並在相關技術引數上做到了極致。

相關文章