伺服器推送
Server push——嶄新的“推”技術,它是一種先進的
伺服器和客戶機之間的通信連線方式,利用在伺服器端的CGI腳本程式把數據源源不斷地推向客戶機,從而使客戶機和伺服器之間的互動性能大大提高。在
中國計算機報電腦工作室中有介紹Serverpush,我們也蒐集整理一些關於Server push的資料,供大家參考。
首先也來看看傳統Client pull的工作方式,Client pull以 這樣的HTML文檔頭來自動刷新頁面,使用戶的瀏覽器能不斷地刷新以接受伺服器傳回的內容,那么用戶就不得不忍受等待“time”值的痛苦,相信在中國電信的網速之下,大家對這個深有體會。
採用了Serverpush技術的
伺服器在客戶機做出一個請求後,和客戶機建立一個永久的連線,然後伺服器會根據客戶機的請求不斷把
數據包推向客戶,這個推的過程是不間斷的。由伺服器推向客戶機的數據在客戶機的瀏覽器上會不斷產生新的內容,而且不會產生Client pull那樣的HTML文檔頭,從而大大減少了延遲的時間,向(伺服器回響——客戶機請求)同步邁進了一步。
實現Serverpush技術非常簡單。Server push在伺服器的CGI腳本聲明HTML文檔類型時,把傳統的content-type:text/html改為content-type:multipart/x-mixed-replace;boundary=BOUNDARY這樣的文檔類型,就會反饋給用戶一個Server push類型的連線。這是Serverpush和Client pull的根本區別。如果CGI腳本中提供了這樣的HTML文檔頭,
伺服器在處理客戶機請求調用CGI
腳本程式時,就會把CGI腳本中指定的數據強行推給客戶機。
Serverpush在生成頁面時會採用很多的技巧來處理用戶端瀏覽器頁面的生成。主程式和傳統方式沒有本質的區別,但記得在腳本中加入print“Content-Type:multipart/x-mixed-replace;boundary=BOUNDARY”這樣的文檔頭。套用在PERL寫的CGI聊天室中有立竿見影之效,其速度和刷新方式和傳統聊天室不是一個檔次的。
常用的伺服器推送技術實現方式有以下三種。
服務端代碼編程:最簡單的方法是通過服務端代碼編程實現,回響代碼中使用死循環。當Web伺服器接收到客戶請求後開啟一個執行緒執行服務端代碼,而該方法由遲遲不肯結束,使執行緒無法釋放。這種方法的缺點是當客戶端數量增加時,伺服器依然會承受很大的負擔。
使用特定的Web伺服器:目前的趨勢是從Web伺服器內部入手,用NIO(JDK1.4提出的java.nio包)改寫Request/Response的實現,再利用執行緒池增強伺服器的資源利用率,從而解決這個問題。JDK1.4版本最顯著的新特性就是增加了NIO,能夠以非阻塞的方式處理網路的請求,這就使得在Java中只需要少量的執行緒就能處理大量的並發請求了。目前支持這一非J2EE官方技術的伺服器有Glassfish和Jetty。Jetty6設計來處理大量並發連線,它使用Java語言的不堵塞I/O(java.nio)庫並且使用最佳化的輸出緩衝架構。Jetty也有一個處理長連線的殺手鐧:一個稱為Continuations的特性。Grizzly作為GlassFish中非常重要的一個項目,就是用NIO的技術來實現套用伺服器中的高性能純Java的HTTP引擎。Grizzly還是一個獨立於GlassFish的框架結構,可以單獨用來擴展和構建自己的伺服器軟體。使用NIO不是一件簡單的技術,它的一些特點使得編程的模型比原來阻塞的方式更為複雜。
使用框架:基於Java的成熟的伺服器推送框架有DWR(DirectWebRemoting)。DWR是開源的基於Apache許可協定的解決方案,它通過將伺服器端的Java代碼映射稱瀏覽器端可使用的JavaScript來實現遠程調用,本質上還是Ajax實現。DWR從2.0開始增加了伺服器推送功能[5]。Java平台上Ajax-RPC還有Dojo、Comet4J、Pushlet等框架,但DWR相對成熟且功能完善[6]。DWR可以將Java對象中需要遠程調用的public方法自動轉換成瀏覽器端可直接調用的JavaScript代碼,這些代碼發出的請求由指定的DWRServlet處理後自動直接調用相應的Java方法。這樣整個過程開發者不需要直接處理XMLHttpRequest也不需要處理方法參數或轉化返回值,都由DWR自動實現。這種實現方式技術成熟,配置簡單,DWR與Spring、Struts2、ExtJS都能整合。
手機推送
內容
手機推送服務是指
伺服器定向將信息實時送達手機的服務。與常見的輪詢方式(偽推送)相比區別主要在於兩點,一是否長聯網,二是到達實時性。推送服務是長聯網的,一般到達手機的延遲在0.1-0.5秒左右,而輪詢方式(偽推送)不是長聯網的,達到延遲時間則根據輪詢時間的不同為1-10分鐘,也有延遲1小時或一天的情況。一般來說,自
黑莓,蘋果和安卓採用標準長連線推送方式後,手機推送服務就特指能夠實時到達的形式。
手機推送服務的原理很簡單,就是通過建立一條手機與
伺服器的連線
鏈路,當有訊息需要傳送到手機時,通過此鏈路傳送即可。
推送服務的使用流程雖然略有差別但是大致都和 iOS的
APNs 相似:
1、首先是應用程式註冊訊息推送。
2、 iOS 向 APNs Server 取得deviceToken。應用程式接受deviceToken。
3、應用程式將deviceToken傳送給PUSH服務端程式。
4、 服務端程式向APNs服務傳送訊息。
5、APNs服務將訊息傳送給iPhone應用程式。
實現方式
1、Android 推送
方案1、使用C2DM服務(Google Cloud Messaging)
優點:Google提供的服務、原生、簡單,無需實現和部署服務端。
缺點:Android版本限制(必須大於2.2版本),該服務在國內不夠穩定、需要用戶綁定Google帳號,受限於Google。
方案2、使用XMPP協定(Openfire + Spark + Smack)
簡介:基於
XML協定的通訊協定,前身是
Jabber,已由IETF國際標準化組織完成了標準化工作。
優點:協定成熟、強大、可擴展性強、主要套用於許多聊天系統中,且已有開源的Java版的開發實例androidpn。
缺點:協定較複雜、冗餘(基於XML)、費流量、費電,部署硬體成本高。
方案3、使用MQTT協定
簡介:輕量級的、基於代理的“發布/訂閱”模式的訊息傳輸協定。
優點:協定簡潔、小巧、可擴展性強、省流量、省電,套用到企業領域,且已有C++版的服務端組件rsmb。
缺點:不夠成熟、實現較複雜、服務端組件 rsmb 不開源,部署硬體成本較高。
方案4、使用第三方推送服務
簡介:通過嵌入
SDK使用第三方提供的推送服務,主流的有百度雲推送,
極光推送,
智游推送,Urban Airship,
個推,PUBNUB,蝴蝶等。
優點:穩定,成熟,節省開發和探索時間,相對自己開發成本低,推送管理界面及統計程式完善。
缺點:有程式嵌入顧慮
2、IOS推送
推薦使用
APNS服務,穩定,方便,美中不足是沒有推送到達的回執和統計,不方便產品運營。如對此方面有需求可以使用
極光推送,
個推蝴蝶等第三方推送服務解決。
3、Win-Phone推送
使用MPNS(Microsoft 推送通知服務),相應速度不錯,但推送不帶狀態,很多功能無法實現。
評價標準
推送方案的公認評價採取4s標準:
1.Safe (安全)
推送方案應支持透傳及各種加密方案,保障信息傳遞安全。
推送方案的ID系統應該獨立於已有的網站或服務的ID系統,這樣保障用戶在不同手機上登錄後的信息投遞準確 性,避免因為取消綁定事件失敗因網路傳輸而造成的信息誤投送。
2. Stable(穩定)
穩定包括兩個部分一個是
伺服器端的穩定性,一個是手機端的穩定性。
服務端穩定性,因為使用長連線方案,對伺服器的開銷和要求很大,推送方案對伺服器開發要求很高,海量執行緒連線下的伺服器穩定性是非常具有挑戰性的。一般的評判標準包括:
- 同時線上時峰值 (一般按照百萬並發連線時伺服器穩定性評測)
- 高並發時訊息平均延遲時間(一般按照1分鐘處理1百萬條信息評測)
- 服務穩定性 (一般要求全年99.9%以上可用,有備份,有負載均衡等)
鑒於
伺服器穩定的開發難度很大,小團隊不建議自己開發,建議使用穩定的第三方推送方案,如
極光推送,
個推,蝴蝶等。
手機端的穩定性,主要是因為中國的複雜網路狀況及手機型號適配情況造成手機長時間穩定聯網較困難,所以穩定性非常重要,一般的評判標準包括:
- 每日聯網23.5小時以上用戶比例 (表征聯網穩定性)
- 訊息傳送後9小時內收到率 (表徵到達率)
一般來說,推送方案要做網路的分
運營商,分省,分機型適配,自己開發工作量較大。
3.Save(節省)
省電應注意
CPU休眠,一般用服務縮短待機時間百分比評判。
省流量應注意協定的修改和冗餘
數據包的處理,一般用空載待機月流量評判。
省成本應考慮單
伺服器承載同時連線數,可承載同時連線數越多成本越低,業內頂尖水平為
極光推送,個推的單伺服器300萬連線。
4.Slim(體積小)
客戶端推送服務SDK應該體積儘量小,不影響主程式的大小和複雜度,一般以小於或等於300K為宜。