故事背景
最近看到一篇關於百萬級推送架構的介紹,正好解決了之前一直想做但沒有做的難題,因爲興趣愛好一開始我手擼了一遍一個小demo,項目源碼請移步這裏。
系統概覽
app接入除了接入restApi(push-admin)之外,還需要兼容connector(push-admin的client,用於和push-server通信)的通信協議。
基於protostuff編解碼,協議定義參考PushRequest.java/PushResponse.java。
推送:只有下行消息(服務端到app)
IM:分上下行消息(app到服務端再到app)
演示
1.創建開發者賬號
2.創建app
APP設備註冊
APP鑑權
推送:鑑權成功後拿到真實的推送服務ip地址,然後建立長連接併發起註冊請求,後續等待後臺推送消息即可。
IM:同上述流程,只不過前提需要建立好友、羣組等關係,ok後就可以發起聊天了。
3.選擇APP,點擊發布消息
4.admin收到推送指令,下發給所有當前app關聯的設備id
6.推送服務收到admin轉發的推送指令,依次下發到註冊設備的長連接上
7.客戶端收到來自管理員的推送消息
架構圖
app爲移動設備,3rdparty爲三方服務(一般爲服務端)。
模塊講解
restApi(admin),開放給三方的功能接口。
開發者註冊
app設備鑑權
好友管理
羣組管理
推送管理
connector
連接pushServer的橋樑,內置在pushAdmin
自動發現服務
一致性hash路由客戶端故障轉移
router
維護用戶和連接的映射
維護用戶和服務的映射
pushServer
註冊連接
推送消息
路由轉發
webProxy
對connector做了一層封裝,暴露websocket協議
推送流程
IM流程大致同推送流程,只不過多了一層上行消息(通過restApi發佈消息,pushServer再基於好友/羣組關係路由到各個對端應用)。