一直一來都在使用淘寶的消息推送業務,感覺很好用,前一段時間QQ2012也實現了消息推送的業務,另外一些安卓軟件也實現了消息推送,我感覺消息推送這種技術或架構以后會在很長時間內流行。
引用淘寶開放平台對於消息推送的解釋:
主動通知(Stream api)是數據推送api,即數據主動推送服務,把淘寶產生的數據實時的推送給外部,app通過訂閱可接受這些實時消息。
消息推送業務說的簡單點:
服務端-----》》》啟動。
客戶端-----》》》啟動。
客戶端-----》》》連接服務端,並建立TCP長連接。
服務端-----》》》得到信息源(來源可能是別的系統的消息通知或自己在循環掃描)。
服務端-----》》》把這條信息放入一個隊列中,這個隊列一般用內存實現。
服務端-----》》》把這條信息推送到客戶端。
客戶端-----》》》接收到這條消息,並異步做處理。
這個只是一個大概的構架,其中會有很多問題。
1、如何保證服務端正常運行?
答:在服務端開一個監控服務,用來監控這個服務端正常運行,如果服務端異常,強制重啟,並通知管理員。
2、如何保證客戶端與服務端的連接不中斷?
答:服務端每25秒給客戶端發送一個特定消息包(淘寶稱為“心跳”),如果客戶端收到這個心跳,就說明連接是正常的,如果收不到這個包就說明連接已經中斷,這個時候客戶端應該放一個監控程序,強制重啟客戶端,並再次與服務端進行連接。
3、如何保證服務端與客戶端之間通信所傳送的數據的完整性?
答:兩端之間用json格式進行傳輸,然后在對方得到數據后進行反序列化解析,如果格式不正確則丟棄。
4、數據傳輸過程中如果數據丟失了怎么辦?
答:服務端增加一個功能,每15分鍾檢查一次,如果用戶沒有獲取信息,那就說明客戶端掉了,在下次連接后,那這個時間段發給客戶端。
淘寶是用java開發的,騰訊是用C++開發的,安卓也是用java開發的。我想用C#去開發一個自己實用的消息推送系統,並在開發完成后應用在公司的項目上面。
主要用到的技術:
1、多線程(可以確定)
2、Socket(可以確定)
3、Task(正在考慮中)
Socket中需要使用的協議:TCP
經過與一個大牛的交談,覺得上面的實現可能存在兩個問題:
1、心跳時間不能定下來,要根據具體的網絡環境來定。需要反復測試,換個網絡環境也有可能需要有改動。
2、協議有兩種可選的,TCP和HTTP,我暫定TCP,如果后期發現TCP協議有問題的話,我考慮使用HTTP協議。
另外,多線程需要使用線程池技術。