個(gè)推技術(shù)實(shí)現(xiàn)原理介紹
概述
PUSH是互聯(lián)網(wǎng)上內(nèi)容提供者和內(nèi)容定制方之間的一種通信機(jī)制,利用在服務(wù)器端的程序把數(shù)據(jù)源源不斷地推向客戶端,大大提高客戶機(jī)和服務(wù)器之間的交互性能。
傳統(tǒng)互聯(lián)網(wǎng)上數(shù)據(jù)交互一般有poll和push兩種方式。poll典型使用場(chǎng)景是瀏覽網(wǎng)頁,是用戶主動(dòng)發(fā)起請(qǐng)求,向服務(wù)器獲取數(shù)據(jù);push剛好相反,通過服務(wù)器直接發(fā)送數(shù)據(jù)給客戶端,用戶被動(dòng)接受消息,類似于更加及時(shí)的短信。Push的使用場(chǎng)景有以下兩特點(diǎn):時(shí)間不確定性、時(shí)效性,如發(fā)送團(tuán)購信息,發(fā)送電子消費(fèi)賬單等。
個(gè)推為第三方應(yīng)用提供了跨手機(jī)平臺(tái)一致的、穩(wěn)定可靠的消息推送服務(wù),實(shí)現(xiàn)服務(wù)端到客戶端的消息主動(dòng)推送。第三方應(yīng)用可以實(shí)現(xiàn)針對(duì)單一目標(biāo)地址的推送,也可以實(shí)現(xiàn)群發(fā)消息推送,還可以通過指定tag進(jìn)行定向群組推送。個(gè)推除了為第三方提供基本的透明消息傳輸,還提供了一些消息展示方式,實(shí)現(xiàn)在客戶端的通知提示、彈框操作等,幫助客戶快速實(shí)現(xiàn)更為定制化的消息推送服務(wù)。
個(gè)推目前支持Android、iOS手機(jī)平臺(tái)。
技術(shù)原理
首先我們來看一下組成一個(gè)推送系統(tǒng)的幾個(gè)要素
1. 個(gè)推SDK:
以jar的方式出現(xiàn),集成于第三方客戶端,解析第三方下行的數(shù)據(jù),并把結(jié)果透?jìng)鹘o第三方客戶端;也可以上行第三方定制的客戶端信息。
2. 個(gè)推服務(wù)器:
一側(cè)負(fù)責(zé)維護(hù)與成千上萬的個(gè)推SDK的長(zhǎng)時(shí)連接,另一側(cè)與第三方服務(wù)器對(duì)接,將第三方定制數(shù)據(jù)下行推送至個(gè)推SDK。
3. 第三方服務(wù)器:
數(shù)據(jù)推送的發(fā)起者,通過對(duì)接個(gè)推服務(wù)器,將數(shù)據(jù)發(fā)送至第三方客戶端。
4. 第三方客戶端:
第三方集成個(gè)推SDK的客戶端,推送數(shù)據(jù)正真的接收者和展現(xiàn)者。
以上是個(gè)推推送系統(tǒng)中的四個(gè)不同角色,看起來比較抽象,可以通過以下圖片來加強(qiáng)理解:
說明:
AppID:應(yīng)用ID,第三方在個(gè)推系統(tǒng)注冊(cè)帳號(hào)并創(chuàng)建生成的唯一的應(yīng)用標(biāo)識(shí)。
ClientID:用于標(biāo)識(shí)客戶端身份,由第三方客戶端獲取并保存到第三方服務(wù)端。
UID:一般為第三方系統(tǒng)帳號(hào)體系中的用戶標(biāo)識(shí)。第三方服務(wù)端一般需要保存UID和ClientID的映射關(guān)系,進(jìn)行消息推送時(shí),通過UID查找到相應(yīng)的ClientID,便可進(jìn)行定向推送了。
我們用一個(gè)更加形象的方式來描述一下這個(gè)系統(tǒng):淘寶購物相信很多人都體驗(yàn)過,就拿它舉個(gè)例子。
淘寶賣家——第三方服務(wù)器
淘寶買家——第三方客戶端
快遞公司(比如順風(fēng))——個(gè)推服務(wù)器
集淘寶買家中的地址管理、快遞查收、包裹檢驗(yàn)等一系列工作的集合——個(gè)推SDK(這個(gè)有點(diǎn)不形象,但是大概理解意思就好)。
假設(shè)淘寶買家下了一單,首先需要填寫寄件地址(假設(shè)不用默認(rèn)的),這個(gè)相當(dāng)于個(gè)推SDK根據(jù)客戶端的信息,建立了一條通道(快遞配送地址)。
當(dāng)買家付款成功后,賣家需要發(fā)貨(第三方服務(wù)端要推送數(shù)據(jù)),當(dāng)然先叫快遞公司拿件(把推送數(shù)據(jù)發(fā)送給個(gè)推服務(wù)器),快遞公司根據(jù)包裹上的地址(第三方客戶端的身份信息,就是上面所說的ClientID)將包裹(數(shù)據(jù))寄送到買家(第三方客戶端),買家收貨后,先驗(yàn)收一下貨物是否有損壞(數(shù)據(jù)是否符合定制要求),獲取到包裹內(nèi)容(獲得服務(wù)端推送的數(shù)據(jù)),并簽單驗(yàn)收(個(gè)推SDK反饋數(shù)據(jù)發(fā)送成功)。
與上面的例子相對(duì)應(yīng),我們?cè)倜枋鲆槐檎麄€(gè)推送過程的技術(shù)流程:
1. 第三方客戶端集成個(gè)推SDK。
2. 第三方客戶端啟動(dòng)的時(shí)候,調(diào)用SDK接口,啟動(dòng)推送服務(wù),SDK后臺(tái)運(yùn)行并維護(hù)和個(gè)推服務(wù)端的長(zhǎng)連接,實(shí)現(xiàn)SDK注冊(cè)和登錄。
3. 第三方服務(wù)端調(diào)用個(gè)推服務(wù)器的接口,將要發(fā)送的數(shù)據(jù)通過個(gè)推服務(wù)器發(fā)送到指定身份的個(gè)推SDK當(dāng)中。
4. 個(gè)推SDK解析定制數(shù)據(jù),并且把第三方服務(wù)器透?jìng)鞯臄?shù)據(jù)發(fā)送給第三方客戶端,第三方客戶端根據(jù)服務(wù)器的數(shù)據(jù)做出相應(yīng)的動(dòng)作或者展現(xiàn)。
陷阱
初步看來,實(shí)現(xiàn)一個(gè)推送系統(tǒng)并不是特別復(fù)雜,然后實(shí)際上,尤其是針對(duì)Android移動(dòng)終端來說,仍然有相當(dāng)多的技術(shù)問題需要克服。
1. 電源管理
Android系統(tǒng)為了***程度降低手機(jī)功耗、延長(zhǎng)待機(jī)時(shí)間,在電源管理方面做了非常大量的底層工作,對(duì)電池的使用到了精打細(xì)算的地步。然而Android系統(tǒng)在電源管理方面做出的這些努力,很輕易地就能被不守規(guī)矩的應(yīng)用程序消耗殆盡。個(gè)推SDK服務(wù)作為需要長(zhǎng)期后臺(tái)穩(wěn)定運(yùn)行的程序,在電源管理方面能夠做到取之有度,日均耗電量能夠控制在40mAh左右,對(duì)用戶日常手機(jī)使用幾乎沒有影響。
2. 網(wǎng)絡(luò)穩(wěn)定性
在國(guó)內(nèi)移動(dòng)運(yùn)營(yíng)商網(wǎng)絡(luò)條件下,地區(qū)差異、時(shí)間段差異、運(yùn)營(yíng)商差異都比較明顯,使得手機(jī)上實(shí)現(xiàn)穩(wěn)定的聯(lián)網(wǎng)困難重重。為了在各種網(wǎng)絡(luò)條件下,都能實(shí)現(xiàn)穩(wěn)定聯(lián)網(wǎng)和流量消耗的兼顧平衡,個(gè)推研發(fā)了能夠根據(jù)網(wǎng)絡(luò)狀況動(dòng)態(tài)調(diào)整心跳間隔的自適應(yīng)算法,以最小的網(wǎng)絡(luò)代價(jià)實(shí)現(xiàn)最穩(wěn)定的聯(lián)網(wǎng)質(zhì)量。目前個(gè)推SDK空載流量消耗每月僅有0.8M-1.2M,不會(huì)對(duì)用戶的錢袋造成損失。
3. 性能問題
為了實(shí)現(xiàn)千萬SDK同時(shí)連接到服務(wù)端,同時(shí)又能控制系統(tǒng)運(yùn)營(yíng)成本,推送平臺(tái)需要具備平行可擴(kuò)展能力,以及較高的接入服務(wù)器性能。目前個(gè)推系統(tǒng)通過內(nèi)核調(diào)優(yōu)、代碼優(yōu)化、層級(jí)架構(gòu)設(shè)計(jì)等技術(shù)手段,已經(jīng)實(shí)現(xiàn)單擊200w穩(wěn)定在線,理論上支持無限平行擴(kuò)展,并且經(jīng)得起實(shí)踐考驗(yàn),正在在線上為超過千萬的用戶提供穩(wěn)定的推送服務(wù)。
總結(jié)
推送服務(wù)是伴隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展,逐漸顯露出來的商業(yè)化訴求。越來越多的移動(dòng)應(yīng)用、電商、游戲意識(shí)到推送服務(wù)對(duì)于自身業(yè)務(wù)的重要性,然后國(guó)內(nèi)的現(xiàn)狀,導(dǎo)致Android系統(tǒng)上并沒有穩(wěn)定可靠的推送服務(wù)可供使用,于是個(gè)推應(yīng)運(yùn)而生。本文概要介紹了個(gè)推系統(tǒng)的結(jié)構(gòu)和消息推送流程,并對(duì)實(shí)踐中必須解決的技術(shù)問題做了探討。個(gè)推致力于實(shí)現(xiàn)Android系統(tǒng)上最穩(wěn)定可靠的推送服務(wù),并在相關(guān)技術(shù)參數(shù)上做到了***。