消息推送

http://blog.csdn.net/axi295309066/article/details/53180628html

 

消息推送

標籤: 消息推送push極光推送小米推送即時通訊
分類:

目錄(?)[+]api

消息推送,即時通訊,目的:想辦法讓服務器可以及時的通知客戶端服務器

消息推送最簡單的方法就是使用第三方的,好比如今使用比較多的是小米推送、極光推送,消息推送的技術原理是:移動無線網絡長鏈接微信

實現方案

一、輪詢

客戶端每隔必定的時候就向服務器發出請求,得到最新的信息。特色:markdown

  • 若是用在最新新聞通知上,那麼效率就比較低了。
  • 技術簡單,好現實。

應用場景:當服務器端的數據以固定的頻率更新,好比 股票行情。網絡

二、發短信

特色:效率高,最及時,同時,費用也是最高的。
應用場景:比較土毫的作法,不差錢。微信開發

三、使用第三方的開源項目

AndroidPN ( Android push notify) app

四、使用第三方的API實現推送功能

小米推送,百度推送、極光推送、個推、微信推送socket

實現方式3和4原理上都屬於消息推送。

消息推送 的實現原理:Socket長聯接 + 心跳楨

XMPP 網絡上開源的,用於網絡聊天的網絡協議

asmack.jar jar包是對xmpp協議的實現

推送原理

  • xmpp 是一種基於TCP/IP的協議, 這種協議更適合消息發送
  • socket 套接字, 發送和接收網絡請求
  • 長鏈接 keep-alive, 服務器基於長鏈接找到設備,發送消息
  • 心跳包 , 客戶端會定時(30秒一次)向服務器發送一段極短的數據,做爲心跳包, 服務器定時收到心跳,證實客戶端或者,纔會發消息.不然將消息保存起來,等客戶端活了以後(從新鏈接),從新發送.

客戶端輪詢(客戶端定時主動拉取數據), 浪費流量, 浪費性能
谷歌推送服務(不能用,被牆了)

移動互聯網絡的現狀

由於手機平臺自己、電量、網絡流量的限制,移動互聯網應用在設計上跟傳統PC 上的應用很大不同,須要根據手機自己的特色,儘可能的節省電量和流量,同時又要儘量的保證數據能及時到達客戶端。爲了解決數據同步的問題,在手機平臺上,經常使用的方法有2種。

一種是定時去服務器上查詢數據,也叫Polling,還有一種手機跟服務器之間維護一個TCP 長鏈接,當服務器有數據時,實時推送到客戶端,也就是咱們說的Push。從耗費的電量、流量和數據送達的及時性來講,Push 都會有明顯的優點,但Push 的實現和維護成本相對較高。在移動無線網絡下維護長鏈接,相對也有一些技術上的難度

移動無線網絡的特色

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

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

Android 平臺上長鏈接的實現

爲了避免讓NAT 表失效,咱們須要定時的發心跳,以刷新NAT 表項,避免被淘汰。Android 上定時運行任務經常使用的方法有2種,一種方法用Timer,另外一種是AlarmManager。

Timer

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

AlarmManager

AlarmManager 是Android 系統封裝的用於管理RTC 的模塊,RTC (Real Time Clock) 是一個獨立的硬件時鐘,能夠在CPU 休眠時正常運行,在預設的時間到達時,經過中斷喚醒CPU。這意味着,若是咱們用AlarmManager 來定時執行任務,CPU 能夠正常的休眠,只有在須要運行任務時醒來一段很短的時間。極光推送的Android SDK 就是基於這種技術實現的。

服務器設計

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

上面只是針對極光推送來講,下面是具體的消息推送的通常有的方式:

經過SMS進行服務器端和客戶端的交流通訊

在Android平臺上,你能夠經過攔截SMS消息而且解析消息內容來了解服務器的意圖,能夠實現徹底的實時操做。可是問題是這個方案的成本相對比較高,且依賴於運營商

循環主動定時獲取

這種方法須要客戶端來作一個定時或者週期性的訪問服務器端接口,以得到最新的消息。輪詢的頻率太慢可能致使某些消息的延遲,太快則會大量消耗網絡帶寬和電池

持久鏈接

這個方案能夠解決由輪詢帶來的性能問題,可是仍是會消耗手機的電池。咱們須要開一個服務來保持和服務器端的持久鏈接(蘋果就和谷歌的C2DM是這種 機制)。可是對於Android系統,當系統可用資源較低,系統會強制關閉咱們的服務或者是應用,這種狀況下鏈接會強制中斷。(Apple的推送服務之所 以工做的很好,是由於每一臺手機僅僅保持一個與服務器之間的鏈接,事實上C2DM也是這麼工做的。即全部的推送服務都是經由一個代理服務器完成的,這種情 況下只須要和一臺服務器保持持久鏈接便可。C2DM=Cloud to Device Messaging)。

相比之下第三種仍是最可行的。爲軟件編寫系統服務或開機啓動功能;或者若是系統資源較低,服務被關閉後能夠在onDestroy ()方法裏面再重啓該服務,進而實現持久鏈接的方式。

C2DM內置於Android的2.2系統上,沒法兼容老的1.6到2.1系統;且依賴於Google官方提供的C2DM服務器,因爲國內的網絡環境,這個服務常常不可用。

創建在TCP協議之上的XMPP協議,不只可提供可這種持久鏈接的功能,能實現服務器和客戶機的雙工通訊,還能不依賴與系統版本和google服務器的限制,提供了比較好的解決方案。

小米消息推送服務

目前用的最多的,也是最穩定消息推送服務,http://dev.xiaomi.com/console/appservice/push.html

極光推送

相關文章
相關標籤/搜索