騰訊信鴿海量移動推送服務是如何構建的


InfoQ:各位觀衆大家好,我們現在正在2018 QCon全球軟件開發大會上海站的現場,InfoQ很榮幸地邀請到了騰訊數據平臺部高級工程師郭生求老師接受我們的採訪,首先請郭老師簡單介紹一下自己吧。

郭生求:好,謝謝主持人,大家好。我叫郭生求,來自騰訊公司數據平臺部,最近一直在做的是一個實時的推送系統,叫騰訊信鴿,本人目前的工作主要集中在後臺系統的開發,包括系統優化工作。

InfoQ:好的,謝謝郭老師。郭老師,想問一下,你們是通過哪些技術來保證信鴿系統的穩定性的呢?

郭生求:說到這個問題,我們可以從三方面來看:

第一個是後臺系統,因爲後臺系統是一個很重要的一個環節,然後我們通過分佈式部署,分佈式部署有一個很大的一個好處,單點故障不會影響其他的,我們現在的後臺一些治理服務都是通過多個方案選項,快速部署,能快速檢測,如果出現單點故障之後,它會自動重新拉起一個新節點來提供服務,同時節點之間是無狀態、無差異化的一個服務,這樣就能夠保證,我的系統一直能夠對外提供可靠的服務。

第二點,我們從數據存儲方面來說,我們數據是多節點多備份的,能夠異地容災,這種存儲方式來保證數據的穩定性,包括可用性。

第三點,在可靠性方面,除了剛纔提到的這兩點,我們在網絡節點這一塊,爲了讓用戶能夠享受到網絡帶來的最小影響,我們在多地,包括海外部署了網絡節點,這樣能夠提供更穩定性的網絡,來提供穩定的服務。

InfoQ:那目前服務端SDK,REST API 支持哪些語言?

郭生求:我們現在這個SDK支持Java,還有PHP,然後還有包括用戶自己貢獻的Golong語言,這個要特別感謝一下這些開發者無私的奉獻精神。

InfoQ:那相對來說哪一種語言調用API更便捷?

郭生求:相對來說,現在應該是Java,因爲Java開發者多,用的人應該是最多的。

InfoQ:信鴿推送系統是如何做用戶畫像的?底層數據是基於QQ和微信用戶的行爲數據嗎?

郭生求:首先回答你第一個問題,就是說信鴿怎麼做所謂的用戶畫像,用戶的畫像分幾種,對我們信鴿來說:第一點,信鴿自定義的一個標籤數據,就是自定義的一個畫像數據,就是說用戶可以自己來定義自己的一個畫像,舉個例子來說,特別是在業務裏,比如以一個遊戲APP來舉例,如果是說那個用戶他系統能檢測到他用戶打遊戲打的比較好,或者他級別比較高,你自己定義一個用戶標籤給他比如大俠,高手什麼的,我們提供了一個接口,讓用戶自己能夠打上自己的一個用戶畫像,用戶標籤,這是一類數據。

還有一類是我們信鴿系統自己能夠識別到的一些標籤,一些自己獨有的用戶的一些數據,舉個例子來說,比如說用戶他通過什麼手機來進行APP的業務操作,那我們能夠識別它的手機終端,比如它是華爲手機,小米手機,或者是怎麼樣,甚至它的操作系統是安卓什麼版本,這些我們也能夠採到它的用戶畫像數據,當然這些數據也是一些公開的數據,不涉及說個人的隱私數據。

所以說,剛纔提到的一個是自定義的畫像數據,一個是預設的,我們信鴿自己能夠採到的一些數據,這兩點是我們現在構成的基本的用戶標籤數據。但這也只是說信鴿自己能夠提供的一些標籤數據,用戶畫像數據,其實我們還可以說,跟我們騰訊公司其他的一些業務的一些用戶畫像數據來進行合作,或者說進行一個對接,可以拿到其他部門的一些用戶數據、畫像數據來補充我們信鴿的一些畫像數據。剛剛提到的說是不是基於微信和QQ來的呢?只能說現在不是基於QQ跟微信的一個用戶畫像數據,但是我們跟他們是有一些關聯合作,這樣子。

InfoQ:那在分佈式實時推送環境下,如何保證長連接服務的穩定性和安全性?

郭生求:其實對於我們實時推送系統來說是一個很大的併發量,有億級的用戶,維持億級的一個長連接是個巨大的挑戰,對我們來說,我們是想說第一步是儘量減少那種長連接,比如說一個手機上面,它有多個APP,它都集成了信鴿的一個SDK,不可能每個APP都維持一個長連接,這種情況下,我們是通過共享服務來共享一個鏈路的措施來減少長連接的數。減少只是一方面,再減少它也會存在,還是需要一些長連接,那在這一塊,我們是通過定製一些飽和、拉活的機制來保證這種長連接的可靠性、可用性。

InfoQ:在移動網絡環境下,DNS服務做了哪些技術優化,保證服務的安全性(不被黑客劫持)和穩定性(運營商DNS服務宕機、延遲)?

郭生求:現在很多黑客會利用一些劫持技術,把DNS給劫持了,信鴿現在用的是騰訊內部自建的一個DNS服務,來保證它的可靠性、安全性。

InfoQ:那在手機端的流量消耗、電量消耗,在選擇協議和長連接方面做了哪些優化呢?

郭生求:對APP端來說,手機的電量能耗、損耗是比較受關注的一個問題,現在提倡綠色環保,這種情況下,我們剛纔也提到了一點,就是我們在APP SDK儘量說減少它的連接數,然後通過共享保活Service這樣的機制來減少連接,也就是說,減少它的能耗,電量的損失。然後同時在APP端做一個拉活,那種機制的話,我們還是利用了我們騰訊內部大盤的數據,就是APP抱團的方式,抱團的一個方式,舉個例子來說,比如說你手機上面安裝了王者榮耀,另外再安裝一個其他的APP,這樣子,如果你這個APP沒有啓動也沒關係,因爲王者榮耀相對來說,它的啓動時間肯定更長,我們通過王者榮耀來推送到另外一個APP,這樣來減少一個手機的用電量。

InfoQ:在分佈式環境下,信鴿推送系統是如何保證信息能夠成功的送達用戶,就是怎麼能保證這個信息發送出去了?

郭生求:現在的安卓系統生態五花八門,比如說華爲、小米、魅族,甚至OPPO、vivo這些手機,它都會改造自己的所謂的安卓系統,都會做一些調整,每個手機系統都有它的差異性,特別是手機它會限制一些消息,通知欄的展示,這種情況下怎麼去保證那個消息能夠觸達用戶,能夠讓用戶看到這個消息?這個方面我們是通過幾個方面來做:
第一個是信鴿自建通道,通過其他的APP,其他的存量比較大的APP,比如剛纔提到的王者榮耀和其他遊戲,這種拉活其他的APP,其他APP推送的時候能及時接收到消息,這是我們信鴿自建的通道;
第二,我們現在也是通過集成廠商的一個推送通道,跟廠商合作,我們現在已經集成了華爲、魅族、小米,還包括海外的,我們有Google的一個TCM、FCM,他們的廠商通道是所謂的系統級的保活、拉活的機制,這樣能夠保證你APP不在線的時候,消息也能夠及時地推送到你手機端去。

InfoQ:如果移動網絡不穩定會重複推送一個消息,你們怎麼做優化?

郭生求:是這樣子的,如果是從終端來看,因爲每條推送消息都有個消息ID,這個消息ID是唯一的,那這樣子的話,也就是說如果短時間內,兩條消息一樣的話,我們是會做一些去重的機制,就是儘量不到達客戶展示這一塊,儘量是不會去重複展示,這是在APP端做得一個事情,在APP SDK端,在我們後臺,我們也有那種去重的機制,比如說你短時間內誤操作,連續推送了幾條一模一樣的消息,那我們後臺的推送任務這一塊,就會做一個檢測,這種的話,我們認爲是這個要暫停,或者是說讓客戶確認這種消息是不是重複推送了,這種機制來保證。

InfoQ:我們知道信鴿推送系統它屬於億級別的併發連接,它在負載均衡上做了哪些技術優化的點?

郭生求:現在那個實時推送系統已經到了一個億級的連接,怎麼保證連接一直可用?在負載均衡這方面,我們是利用騰訊內部的I5的一個負載均衡的組件,這種組件最大的好處是,能夠實時動態地檢測各個節點的狀態,如果某一個節點它處於不可用的狀態,它會及時上報一些故障的信息,動態地去調整,做一些狀態的切換。

InfoQ:最後還想問一個問題,就是信鴿推送系統在服務監控、報警方面有什麼經驗跟大家分享嗎?

郭生求:在我們內部是一個立體化的監控,什麼叫立體化呢?首先我們內部系統有自己的運維,或者是測試,或者是我們開發人員能夠看到的一些內部的接口,調用成功率、失敗率我們會實時監控,並實時地展示出來,並設置一些閾值,如果超過了某個界限,我們就會有實時地告警,來提醒我們去關注這方面的指標,這是我們內部的工作,在客戶層面,我們也能夠動態把每一個客戶做的推送效果實時地展示出來,比如說推送下去之後有多少消息是推出去了,有多少消息是抵達了客戶,並且展示出來了,或者是說有多少客戶是點擊了,這些數據我們也能夠實時做一些監控。

嘉賓簡介

郭生求,騰訊移動推送,高級工程師。
2006-2016年華爲近10年通信後臺、IoT平臺開發經驗,2016年加入騰訊公司TEG數據平臺部,主要負責騰訊移動推送平臺—信鴿的後臺研發和優化工作,對分佈式計算有深入的瞭解,有豐富的後臺架構優化的實戰經驗,對構造實時性、高可用、高性能的分佈式大數據處理和推送系統有豐富的實戰經驗。近期主要工作是優化信鴿精準推送後臺系統,包括精準用戶分羣、實時推送、實時推送效果跟蹤、多廠商通道推送等,更好的滿足公司內外部APP用戶的需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章