推送技術原理:移動無線網絡長鏈接

由於手機平臺自己、電量、網絡流量的限制,移動互聯網應用在設計上跟傳統 PC 上的應用很大不同,須要根據手機自己的特色,儘可能的節省電量和流量,同時又要儘量的保證數據能及時到達客戶端。android

爲了解決數據同步的問題,在手機平臺上,經常使用的方法有2種。一種是定時去服務器上查詢數據,也叫 Polling,還有一種手機跟服務器之間維護一個 TCP 長鏈接,當服務器有數據時,實時推送到客戶端,也就是咱們說的 Push。服務器

從耗費的電量、流量和數據送達的及時性來講,Push 都會有明顯的優點,但 Push 的實現和維護成本相對較高。在移動無線網絡下維護長鏈接,相對也有一些技術上的難度。網絡

移動無線網絡的特色

由於 IP v4 的 IP address 量有限,運營商分配給手機終端的 IP 是運營商內網的 IP,手機要鏈接 Internet,就須要經過運營商的網關作一個網絡地址轉換(Network Address Translation,NAT)。簡單的說運營商的網關須要維護一個外網 IP、端口到內網 IP、端口的對應關係,以確保內網的手機能夠跟 Internet 的服務器通信。設計

cisco PLMN

圖片源自 cisco.com.圖片

NAT 功能由圖中的 GGSN 模塊實現。ci

大部分移動無線網絡運營商都在鏈路一段時間沒有數據通信時,會淘汰 NAT 表中的對應項,形成鏈路中斷。同步

Android 平臺上長鏈接的實現

爲了避免讓 NAT 表失效,咱們須要定時的發心跳,以刷新 NAT 表項,避免被淘汰。io

Android 上定時運行任務經常使用的方法有2種,一種方法用 Timer,另外一種是 AlarmManager。互聯網

Timer

Android 的 Timer 類能夠用來計劃須要循環執行的任務,Timer 的問題是它須要用 WakeLock 讓 CPU 保持喚醒狀態,這樣會大量消耗手機電量,大大減短手機待機時間。這種方式不能知足咱們的需求。循環

AlarmManager

AlarmManager 是 Android 系統封裝的用於管理 RTC 的模塊,RTC (Real Time Clock) 是一個獨立的硬件時鐘,能夠在 CPU 休眠時正常運行,在預設的時間到達時,經過中斷喚醒 CPU。

這意味着,若是咱們用 AlarmManager 來定時執行任務,CPU 能夠正常的休眠,只有在須要運行任務時醒來一段很短的時間。

服務器設計

當有大量的手機終端須要與服務器維持長鏈接時,對服務器的設計會是一個很大的挑戰。

假設一臺服務器維護10萬個長鏈接,當有1000萬用戶量時,須要有多達100臺的服務器來維護這些用戶的長鏈接,這裏還不算用於作備份的服務器,這將會是一個巨大的成本問題。那就須要咱們儘量提升單臺服務器接入用戶的量,也就是業界已經討論好久了的 C10K 問題。

做者:張虎,@Tiger_張虎, 雲巴 (yunba.io) 創始人,yunba.io 雲端實時消息服務。 JPush 創始人,原CTO。 Oracle VM 創始團隊成員。

相關文章
相關標籤/搜索