MPUSH開源推送系統(tǒng)官網(wǎng)[https://mpusher.github.io]
前言
對于一個好的推送系統(tǒng),不僅要考慮服務(wù)的性能和穩(wěn)定性,客戶端實現(xiàn)也一樣重要。有時候想寫好客戶端反而更麻煩,比如網(wǎng)絡(luò)部分服務(wù)端可以使用Netty等比較成熟的網(wǎng)絡(luò)組件蘸劈,而客戶端基本要從底層全部要自己實現(xiàn);有時候還要考慮斷線重連以及各種弱網(wǎng)情況疲扎,還有要省電昵时,要保活椒丧,要兼容各種版本問題....
個人覺得好的架構(gòu)設(shè)計一定要簡潔壹甥,每個組件只干自己應(yīng)該干的事情,作為SDK要高度解耦壶熏,只有這樣系統(tǒng)才能更穩(wěn)定不易出錯句柠。
下面簡單分析下MPUSH Android SDK 的實現(xiàn)思路
MPUSH開源推送系統(tǒng)官網(wǎng)[https://mpusher.github.io]
說明
- 整個圖非常簡單清晰的分為Server、SDK棒假、BIZ三部分溯职。
- MpushClient負責(zé)和server通信,屏蔽網(wǎng)絡(luò)帽哑,協(xié)議谜酒,斷線重連等所有和長鏈接相關(guān)的東西。
- MpushService是常駐服務(wù)妻枕,持有MpushClient,并把自身作為MpushClient的ClientListener僻族,監(jiān)聽MpushClient的變化事件。
- MpushReceiver主要負責(zé)監(jiān)聽網(wǎng)絡(luò)變化和AlarmManager屡谐,以便暫停和恢復(fù)推送服務(wù)以及健康檢查述么。
- 線1表示上行的請求,比如握手愕掏,心跳度秘,綁定用戶,業(yè)務(wù)HTTP代理請求等饵撑。
- 線2表示下行響應(yīng)或推送剑梳,比如握手成功唆貌,心跳響應(yīng),HTTP代理響應(yīng)等阻荒。
- 線3表示Client下發(fā)的事件挠锥,主要有:鏈接建立/斷開,握手成功侨赡,收到PUSH,設(shè)備被踢下線等事件粱侣,其中PUSH和KICK_USER事件會廣播出去羊壹,由業(yè)務(wù)(MyReceiver)接收;其他事件會通知給MpushReceiver以便其能更好的控制MpushClient的起停齐婴,而MpushService就比較輕量基本沒有什么業(yè)務(wù)邏輯油猫,只負責(zé)維持后臺服務(wù)。
- 線4表示由MpushService廣播出去的PUSH消息柠偶,由于采用的是廣播的形式情妖,所有也可以分進程。
- 線5表示消息有MyReceiver過濾處理后诱担,轉(zhuǎn)交給業(yè)務(wù)去顯示或存DB等毡证。
- 線6表示業(yè)務(wù)可以直接調(diào)用MpushClient提供的接口發(fā)送消息,目前支持的有綁定usreId蔫仙,發(fā)送Http請求等料睛。
- 線7表示一些不需要業(yè)務(wù)處理的消息都交由MpuhReceiver處理,比如握手成功后啟動AlarmManager摇邦,當(dāng)鏈接斷開后取消AlarmManager恤煞。
- 線8表示MpushReceiver接收到AlarmManager的提醒后去調(diào)用MpshClient的healthCheck方法發(fā)送心跳。
- 線9表示MpushReceiver接收到網(wǎng)絡(luò)變化后暫褪┘或恢復(fù)MpushClient居扒,這樣做主要是為了省電,因為在網(wǎng)絡(luò)斷開后丑慎,MpushClient會去嘗試重連而這時候去重連是沒有意義的喜喂,因為沒有網(wǎng)絡(luò)。
MPUSH開源推送系統(tǒng)官網(wǎng)https://mpusher.github.io