概述算法
PUSH是互聯網上內容提供者和內容定製方之間的一種通訊機制,利用在服務器端的程序把數據源源不斷地推向客戶端,大大提升客戶機和服務器之間的交互性能。服務器
傳統互聯網上數據交互通常有pull和push兩種方式。pull典型使用場景是瀏覽網頁,是用戶主動發起請求,向服務器獲取數據;push恰好相反,經過服務器直接發送數據給客戶端,用戶被動接受消息,相似於更加及時的短信。Push的使用場景有如下兩特色:時間不肯定性、時效性,如發送團購信息,發送電子消費帳單等。網絡
個推爲第三方應用提供了跨手機平臺一致的、穩定可靠的消息推送服務,實現服務端到客戶端的消息主動推送。第三方應用能夠實現針對單一目標地址的推送,也能夠實現羣發消息推送,還能夠經過指定tag進行定向羣組推送。個推除了爲第三方提供基本的透明消息傳輸,還提供了一些消息展現方式,實如今客戶端的通知提示、彈框操做等,幫助客戶快速實現更爲定製化的消息推送服務。
個推目前支持Android、iOS手機平臺。架構
技術原理性能
首先咱們來看一下組成一個推送系統的幾個要素
1. 個推SDK:
以jar的方式出現,集成於第三方客戶端,解析第三方下行的數據,並把結果透傳給第三方客戶端;也能夠上行第三方定製的客戶端信息。
2. 個推服務器:
一側負責維護與成千上萬的個推SDK的長時鏈接,另外一側與第三方服務器對接,將第三方定製數據下行推送至個推SDK。
3. 第三方服務器:
數據推送的發起者,經過對接個推服務器,將數據發送至第三方客戶端。
4. 第三方客戶端:
第三方集成個推SDK的客戶端,推送數據正真的接收者和展示者。優化
以上是個推推送系統中的四個不一樣角色,看起來比較抽象,能夠經過如下圖片來增強理解:spa
說明:架構設計
AppID:應用ID,第三方在個推系統註冊賬號並建立生成的惟一的應用標識。
ClientID:用於標識客戶端身份,由第三方客戶端獲取並保存到第三方服務端。
UID:通常爲第三方系統賬號體系中的用戶標識。第三方服務端通常須要保存UID和ClientID的映射關係,進行消息推送時,經過UID查找到相應的ClientID,即可進行定向推送了。設計
咱們用一個更加形象的方式來描述一下這個系統:淘寶購物相信不少人都體驗過,就拿它舉個例子。接口
淘寶賣家——第三方服務器
淘寶買家——第三方客戶端
快遞公司(好比順風)——個推服務器
集淘寶買家中的地址管理、快遞查收、包裹檢驗等一系列工做的集合——個推SDK(這個有點不形象,可是大概理解意思就好)。
假設淘寶買家下了一單,首先須要填寫寄件地址(假設不用默認的),這個至關於個推SDK根據客戶端的信息,創建了一條通道(快遞配送地址)。
當買家付款成功後,賣家須要發貨(第三方服務端要推送數據),固然先叫快遞公司拿件(把推送數據發送給個推服務器),快遞公司根據包裹上的地址(第三方客戶端的身份信息,就是上面所說的ClientID)將包裹(數據)寄送到買家(第三方客戶端),買家收貨後,先驗收一下貨物是否有損壞(數據是否符合定製要求),獲取到包裹內容(得到服務端推送的數據),並簽單驗收(個推SDK反饋數據發送成功)。
與上面的例子相對應,咱們再描述一遍整個推送過程的技術流程:
1. 第三方客戶端集成個推SDK。
2. 第三方客戶端啓動的時候,調用SDK接口,啓動推送服務,SDK後臺運行並維護和個推服務端的長鏈接,實現SDK註冊和登陸。
3. 第三方服務端調用個推服務器的接口,將要發送的數據經過個推服務器發送到指定身份的個推SDK當中。
4. 個推SDK解析定製數據,而且把第三方服務器透傳的數據發送給第三方客戶端,第三方客戶端根據服務器的數據作出相應的動做或者展示。
陷阱
初步看來,實現一個推送系統並非特別複雜,而後實際上,尤爲是針對Android移動終端來講,仍然有至關多的技術問題須要克服。
· 電源管理
Android系統爲了最大程度下降手機功耗、延長待機時間,在電源管理方面作了很是大量的底層工做,對電池的使用到了精打細算的地步。然而Android系統在電源管理方面作出的這些努力,很輕易地就能被不守規矩的應用程序消耗殆盡。個推SDK服務做爲須要長期後臺穩定運行的程序,在電源管理方面可以作到取之有度,日均耗電量可以控制在40mAh左右,對用戶平常手機使用幾乎沒有影響。
· 網絡穩定性
在國內移動運營商網絡條件下,地區差別、時間段差別、運營商差別都比較明顯,使得手機上實現穩定的聯網困難重重。爲了在各類網絡條件下,都能實現穩定聯網和流量消耗的兼顧平衡,個推研發了可以根據網絡情況動態調整心跳間隔的自適應算法,以最小的網絡代價實現最穩定的聯網質量。目前個推SDK空載流量消耗每個月僅有0.8M-1.2M,不會對用戶的錢袋形成損失。
· 性能問題
爲了實現千萬SDK同時鏈接到服務端,同時又能控制系統運營成本,推送平臺須要具有平行可擴展能力,以及較高的接入服務器性能。目前個推系統經過內核調優、代碼優化、層級架構設計等技術手段,已經實現單擊200w穩定在線,理論上支持無限平行擴展,而且經得起實踐考驗,正在在線上爲超過千萬的用戶提供穩定的推送服務。
總結
本文簡要介紹了個推系統的結構和消息推送流程,並對實踐中必須解決的技術問題作了探討。個推致力於實現Android系統上最穩定可靠的推送服務,並在相關技術參數上作到了極致。