自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談京東云推送----節(jié)省 穩(wěn)定 精準(zhǔn)

云計(jì)算
移動(dòng)互聯(lián)網(wǎng)時(shí)代,推送(Push)服務(wù)成為App應(yīng)用不可或缺的重要組成部分。推送服務(wù)可以提升用戶的活躍度和留存率。

 移動(dòng)互聯(lián)網(wǎng)時(shí)代,推送(Push)服務(wù)成為App應(yīng)用不可或缺的重要組成部分。推送服務(wù)可以提升用戶的活躍度和留存率。

然而,市場(chǎng)現(xiàn)有推送服務(wù)一直存在不少問(wèn)題。

第一、耗電。手機(jī)耗電量大,手機(jī)電池堅(jiān)持不了兩天,待機(jī)時(shí)間短;

第二、不穩(wěn)定。消息丟失、重復(fù)推送、延遲送達(dá)、過(guò)期推送時(shí)有發(fā)生;

第三、無(wú)用消息,用戶收到的大量無(wú)用消息,垃圾信息滿天飛。

這些問(wèn)題讓用戶很受傷。用戶很生氣,后果很嚴(yán)重,用戶可能直接就把應(yīng)用卸載了,真是成也蕭何,敗也蕭何。

京東云推送是京東云平臺(tái)推出的節(jié)省、穩(wěn)定、精準(zhǔn)的推送服務(wù)。針對(duì)耗電、不穩(wěn)定、無(wú)用消息等問(wèn)題,京東云推送做了的周全的處理。本文將嘗試分析京東云推送如何解決市場(chǎng)現(xiàn)有推送服務(wù)存在的上述問(wèn)題,實(shí)現(xiàn)節(jié)省、穩(wěn)定、精準(zhǔn)推送。

使用傳統(tǒng)推送服務(wù),手機(jī)上多個(gè)應(yīng)用都使用推送服務(wù)時(shí),耗電量大,手機(jī)電池堅(jiān)持不了兩天 ,待機(jī)時(shí)間短。手機(jī)推送原理,就是通過(guò)建立一條手機(jī)與服務(wù)端的連接鏈路,即長(zhǎng)連接,當(dāng)有消息需要推送到手機(jī)時(shí),通過(guò)這條鏈路發(fā)送消息。長(zhǎng)連接需要定期發(fā)送心跳來(lái)確保鏈路一直保持,這都有電量和流量消耗。比如有5個(gè)應(yīng)用都使用了某推送服務(wù),每個(gè)應(yīng)用都和后端服務(wù)器建立長(zhǎng)連接,并定期發(fā)送心跳包,耗電、流量情況可想而知。

省電省流量。京東云推送設(shè)計(jì)多應(yīng)用單服務(wù)單連接模式、使用AlarmManager定時(shí)心跳節(jié)省電量和流量。

多應(yīng)用單服務(wù)單連接。手機(jī)上多個(gè)App應(yīng)用共享一個(gè)Android服務(wù)一個(gè)連接。京東云推送設(shè)計(jì)了多應(yīng)用單服務(wù)單連接模式。手機(jī)上多個(gè)應(yīng)用使用了京東云推送,即每個(gè)應(yīng)用內(nèi)嵌入了京東云推送SDK,多個(gè)應(yīng)用共享一個(gè)服務(wù)JDPushService,由Service去和云端服務(wù)器建立TCP長(zhǎng)連接,接收消息。

每個(gè)終端設(shè)備在云推送平臺(tái)有一個(gè)唯一標(biāo)識(shí)Token,每個(gè)應(yīng)用有唯一標(biāo)識(shí)AppID. JDPushService收到云端消息后,根據(jù)消息包里的AppID,來(lái)判斷消息屬于哪個(gè)App后發(fā)送給對(duì)應(yīng)的App應(yīng)用。第一個(gè)應(yīng)用啟動(dòng)了推送服務(wù)后,其他應(yīng)用啟動(dòng)服務(wù)的時(shí)候,會(huì)檢查服務(wù)是否存在,如果存在就使用已啟動(dòng)服務(wù)。每個(gè)應(yīng)用都有機(jī)會(huì)啟動(dòng)JDPushService服務(wù),運(yùn)行推送服務(wù)增加的耗電量和流量總體上會(huì)比較平均地分?jǐn)偟礁鱾€(gè)應(yīng)用上。多應(yīng)用單服務(wù)單連接,有效解決了多應(yīng)用多鏈路帶來(lái)的高耗電費(fèi)流量問(wèn)題。單個(gè)手機(jī)上使用京東云推送服務(wù)的應(yīng)用越多,省電省流量?jī)?yōu)勢(shì)就越明顯。

AlarmManager定時(shí)心跳。京東云推送使用AlarmManager來(lái)定時(shí)執(zhí)行心跳任務(wù)。長(zhǎng)連接通信,如果連接一段時(shí)間沒(méi)有通訊數(shù)據(jù)時(shí),鏈路一般會(huì)被切斷。為了防止鏈路中斷,需要發(fā)送心跳維持存活。Android手機(jī)上使用Timer 執(zhí)行定時(shí)任務(wù)時(shí),需要用WakeLock讓Cpu 保持喚醒狀態(tài),會(huì)大量消耗手機(jī)電量,縮短手機(jī)待機(jī)時(shí)間。而用AlarmManger來(lái)執(zhí)行定時(shí)任務(wù),Cpu可以正常休眠,只有在需要運(yùn)行任務(wù)時(shí)醒來(lái)很短時(shí)間,極大的提升手機(jī)的待機(jī)時(shí)間。

節(jié)省服務(wù)器。京東云推送單服務(wù)器能夠支撐200萬(wàn)(C2000K)以上的連接數(shù)。單服務(wù)器承載同時(shí)連接數(shù)越多,所需服務(wù)器就越少,成本越低。保證大量的在線連接穩(wěn)定可靠地通信,對(duì)后端連接服務(wù)器有很大挑戰(zhàn)。如何提升單服務(wù)器連接數(shù),保證連接穩(wěn)定可靠的推送數(shù)據(jù),是推送服務(wù)的技術(shù)難點(diǎn)。

Object pool緩存可重用的對(duì)象。會(huì)話服務(wù)器上承載了大量的終端連接,每個(gè)Session連接處理、心跳包、回執(zhí)、命令處理的結(jié)構(gòu)和過(guò)程都是一樣的,京東云推送使用Object pool緩存一組可重用的對(duì)象,減少了頻繁動(dòng)態(tài)創(chuàng)建對(duì)象帶來(lái)的內(nèi)存分配和回收資源消耗。和動(dòng)態(tài)分配內(nèi)存相比,分配和回收速度快很多。另外,對(duì)每個(gè)對(duì)象和處理細(xì)節(jié),充分優(yōu)化內(nèi)存使用,持續(xù)優(yōu)化。內(nèi)存瓶頸會(huì)限制服務(wù)器能夠接入的用戶連接數(shù),通過(guò)Object pool 、各處理對(duì)象細(xì)節(jié)優(yōu)化,極大提升了內(nèi)存使用效率。

多核并行化。將任務(wù)調(diào)度到服務(wù)器所有Cpu核心上,并行處理。會(huì)話服務(wù)器上承載了大量的終端連接,Session會(huì)話連接和消息處理時(shí),盡量充分利用現(xiàn)代服務(wù)器普遍具有的多核特性,將任務(wù)并行化,將所有任務(wù)調(diào)度到所有CPU核心上,最大化的利用服務(wù)器多核計(jì)算能力,從而提升推送服務(wù)整體性能。

市場(chǎng)現(xiàn)有推送服務(wù)一直存在消息丟失、重復(fù)推送、延遲送達(dá)、過(guò)期推送等諸多問(wèn)題,京東云推送針對(duì)這些問(wèn)題,做了周詳處理。

消息丟失問(wèn)題主要原因有網(wǎng)絡(luò)不穩(wěn)定、系統(tǒng)可用性差等問(wèn)題引起。國(guó)內(nèi)手機(jī)網(wǎng)絡(luò)不是太穩(wěn)定,上網(wǎng)方式復(fù)雜眾多,覆蓋范圍也不是很全,另外用戶還經(jīng)常使用WIFI上網(wǎng)。網(wǎng)絡(luò)信號(hào)經(jīng)常時(shí)好時(shí)壞,網(wǎng)絡(luò)不穩(wěn)定造成消息丟失或丟包都是正常的。

不丟消息。京東云推送通過(guò)消息回執(zhí)確認(rèn)機(jī)制、高可用分布式服務(wù)器集群確保不丟消息。

消息回執(zhí)確認(rèn)。用戶終端每收到一條消息,會(huì)給云端發(fā)送回執(zhí)確認(rèn)。消息發(fā)送給用戶終端應(yīng)用后,終端JDPushService服務(wù)發(fā)送收到該消息的回執(zhí)確認(rèn)給云端服務(wù),云端把消息狀態(tài)置為已送達(dá)。手機(jī)網(wǎng)絡(luò)不穩(wěn)定造成長(zhǎng)連接中斷時(shí),JDPushService向云端服務(wù)發(fā)起重連時(shí),如果未收到回執(zhí)確認(rèn)并且消息未過(guò)期,云端會(huì)重新發(fā)送該消息給用戶終端,確保即使網(wǎng)絡(luò)不穩(wěn)定 ,用戶始終能收到消息。

為了防止應(yīng)用重復(fù)收到同一條消息,終端JDPushService服務(wù)對(duì)最新消息做持久化,收到消息時(shí)判斷是否已收過(guò)該消息,如果未收過(guò)就發(fā)送給應(yīng)用,否則不再發(fā)送。同時(shí)發(fā)送回執(zhí)給云端,有效解決重復(fù)推送問(wèn)題。

高可用分布式服務(wù)器集群。系統(tǒng)可用性差也會(huì)造成消息丟失,比如消息發(fā)送處理中,系統(tǒng)出現(xiàn)意外,就有消息丟失可能。京東云推送云端采用分布式服務(wù)器集群架構(gòu),每個(gè)服務(wù)節(jié)點(diǎn)沒(méi)有單點(diǎn),確保系統(tǒng)的高可用。各個(gè)實(shí)例節(jié)點(diǎn)間通過(guò)MQ通信,對(duì)每個(gè)job是否成功的反饋確認(rèn),如果worker節(jié)點(diǎn)在執(zhí)行job時(shí)崩潰或者退出,該job會(huì)再分發(fā)給其他woker節(jié)點(diǎn)執(zhí)行,確保消息處理環(huán)節(jié)不丟失。數(shù)據(jù)存儲(chǔ)集群提供完善的數(shù)據(jù)備份和故障轉(zhuǎn)移支持,確保數(shù)據(jù)在存儲(chǔ)環(huán)節(jié)不丟失。

實(shí)時(shí)送達(dá)。京東云推送點(diǎn)播消息1秒內(nèi)送達(dá)用戶終端。市場(chǎng)現(xiàn)有推送服務(wù),消息從發(fā)出到用戶收到消息時(shí)間過(guò)長(zhǎng),用戶無(wú)法第一時(shí)間收到消息,推送不實(shí)時(shí)。京東云推送終端應(yīng)用啟動(dòng)推送服務(wù)時(shí),會(huì)啟動(dòng)一個(gè)后臺(tái)共享服務(wù)JDPushService,由該服務(wù)和云端服務(wù)建立長(zhǎng)連接。云端服務(wù)通過(guò)這條鏈路,有消息時(shí)實(shí)時(shí)推送消息到用戶終端。移動(dòng)網(wǎng)絡(luò)很不穩(wěn)定,如果TCP鏈接出現(xiàn)中斷,JDPushService服務(wù)會(huì)重新發(fā)起連接,保證通信鏈路一直可用。JDPushService是后臺(tái)服務(wù),即使應(yīng)用退出后,服務(wù)仍然可以接收應(yīng)用消息并通知用戶,確保應(yīng)用即使在線離線狀態(tài)下,也能實(shí)時(shí)收到最新消息。

耗時(shí)任務(wù)分解。單服務(wù)器處理能力是有限的,耗時(shí)任務(wù)拆分成多個(gè)子任務(wù),多臺(tái)服務(wù)器同時(shí)并行處理,提升時(shí)效。比如給5000萬(wàn)用戶發(fā)送一個(gè)廣播消息,需要把消息任務(wù)分解成多個(gè)子任務(wù),多服務(wù)器同時(shí)并行處理,有效縮短消息發(fā)送處理時(shí)間。

有效期推送。京東云推送設(shè)計(jì)消息過(guò)期失效機(jī)制,確保只推送有效期內(nèi)消息。消息具有時(shí)效性,過(guò)了某個(gè)時(shí)間點(diǎn)的消息對(duì)用戶來(lái)說(shuō)就失去了價(jià)值,同時(shí)還影響體驗(yàn)。比如用戶關(guān)機(jī)一個(gè)月后開(kāi)機(jī)啟動(dòng)應(yīng)用后,瞬間收到一個(gè)月的所有消息,用戶手機(jī)瞬間癱瘓。京東云推送對(duì)消息設(shè)置離線保存時(shí)間,如果超過(guò)離線保存時(shí)間,消息自動(dòng)失效并置為歷史消息,不再對(duì)用戶推送。比如設(shè)置離線保存72小時(shí)(默認(rèn)2天),發(fā)送消息時(shí)用戶沒(méi)有開(kāi)機(jī),兩天后用戶開(kāi)機(jī)并啟動(dòng)推送服務(wù),這時(shí)不會(huì)收到已過(guò)期的消息。

精準(zhǔn)推送。京東云推送提供精細(xì)化的標(biāo)簽組播推送和點(diǎn)播推送。現(xiàn)有推送用戶經(jīng)常收到的大量無(wú)用消息,垃圾信息滿天飛。應(yīng)用內(nèi)廣播每個(gè)應(yīng)用終端用戶都能收到,但是未必每個(gè)用戶都需要。京東云推送提供了標(biāo)簽組播和點(diǎn)播功能,開(kāi)發(fā)者可以根據(jù)用戶的習(xí)慣、愛(ài)好、對(duì)特定產(chǎn)品偏好程度等給用戶設(shè)置標(biāo)簽。用戶使用App某個(gè)預(yù)設(shè)操作時(shí),調(diào)用京東推送SDK標(biāo)簽綁定接口,給用戶綁定標(biāo)簽。應(yīng)用商需要對(duì)該類用戶推送特定消息時(shí),調(diào)用標(biāo)簽組播推送接口,京東云推送會(huì)定位到綁定了該標(biāo)簽的所有用戶,并把消息實(shí)時(shí)推送給用戶。標(biāo)簽設(shè)置粒度越細(xì),推送的精準(zhǔn)度越高。如果需要對(duì)某個(gè)特定用戶推送消息,可以使用點(diǎn)播功能推送消息。通過(guò)用標(biāo)簽組播和點(diǎn)播功能,消息只推送給感興趣的用戶,實(shí)現(xiàn)消息精準(zhǔn)推送。

京東云推送通過(guò)多應(yīng)用單服務(wù)單連接、AlarmManager定時(shí)心跳,省電省流量;Cache pool 、多核并行化提升后端服務(wù)器單機(jī)處理能力,節(jié)省服務(wù)器;消息回執(zhí)確認(rèn)機(jī)制、高可用服務(wù)器集群確保不丟消息;終端服務(wù)已收消息過(guò)濾防止消息重復(fù)推送;Android后臺(tái)服務(wù)長(zhǎng)連接、云端耗時(shí)任務(wù)分解并行處理,實(shí)現(xiàn)實(shí)時(shí)送達(dá);離線消息過(guò)期時(shí)間設(shè)置確保消息有效期內(nèi)推送;精細(xì)化標(biāo)簽組播和點(diǎn)播有效提升消息推送精準(zhǔn)度。京東云推送通過(guò)這一系列策略、技術(shù)實(shí)現(xiàn),為開(kāi)發(fā)者提供一個(gè)節(jié)省、穩(wěn)定、精準(zhǔn)的推送服務(wù)。

作者簡(jiǎn)介:康新榮,京東云平臺(tái)資深架構(gòu)師,云推送項(xiàng)目研發(fā)負(fù)責(zé)人。10年IT行業(yè)研發(fā)經(jīng)驗(yàn),在云計(jì)算、NoSQL、分布式、高并發(fā)系統(tǒng)構(gòu)建等領(lǐng)域有豐富的經(jīng)驗(yàn)。

責(zé)任編輯:小明 來(lái)源: 京東
相關(guān)推薦

2015-06-11 11:18:04

友盟精準(zhǔn)推送

2013-09-09 09:39:02

云數(shù)據(jù)庫(kù)京東云

2016-07-28 17:54:17

華為

2025-02-06 11:44:56

2011-07-18 13:56:19

2019-01-11 08:37:34

云計(jì)算京東云金山云

2020-02-20 10:02:45

云計(jì)算IT虛擬機(jī)

2018-01-09 15:39:42

云計(jì)算網(wǎng)絡(luò)安全

2013-09-16 09:16:42

云成本云成本節(jié)省云應(yīng)用

2017-02-13 14:35:46

京東云金蝶混合云

2017-12-01 11:34:44

京東京東云自動(dòng)化運(yùn)維

2012-12-17 11:32:53

無(wú)線路由器WLAN

2016-07-20 12:29:35

云計(jì)算

2014-12-30 13:35:41

極光推送JPush王小導(dǎo)

2013-05-03 14:26:09

騰訊云云計(jì)算騰訊

2020-07-08 10:11:45

云計(jì)算云服務(wù)私有云

2019-03-27 14:17:44

Web 開(kāi)發(fā)代碼

2019-01-14 11:16:03

2015-07-10 16:26:00

個(gè)推

2013-11-07 11:22:06

云計(jì)算京東私有云平臺(tái)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)