MobPush推送實現解析

2021-08-20 18:38:23 字數 3035 閱讀 7014

從mobpush聊推送

一、mobpush概述

mobpush是

mob繼一系列公共

sdk之後推出的一款專注推送服務的免費

sdk。可以幫助開發者更快、更方便整合實現推送功能。推送可以大幅度提公升使用者活躍度,有效喚醒沉睡使用者。

目前mobpush可支援

ios

、android

兩大平台

整合,提供

rest api

方便開發者靈活傳送推送訊息,並且提供完整的視覺化資料和強大管理後台。在推送形式上已經完全支援基本的通知欄訊息、透傳訊息、本地訊息的推送,並且可設定定時下發推送功能;在考慮精準推送上,

mobpush

支援不同程度的推送範圍傳送

---registration id

、別名、標籤、地理位置以及精細化的使用者分群方式。

二、推送模式解析

mobpush整體使用

mobpush

自有通道

+廠商通道的方式,廠商通道包括

ios的

apns

,android

的廠商通道包括華為、小公尺、魅族三個通道;

mobpush

自有通道是自定義的一套基於

udp的更為簡單的二進位制網路通訊協議。如下圖先看下整體的推送流程:

以上是mobpush整體的流程,

ios的通知欄訊息全部是基於

apns

首先下發的,但是如果

apns

傳送失敗,我們會再嘗試使用自有訊息通道進行訊息下發,然後再由客戶端處理為本地通知的方式到達通知欄,這樣可以保證更高的訊息到達能力;

android

的通知訊息如果對接了廠商通道,則優先會經過廠商系統級別的通道傳送,並且如果廠商通道失敗,會採用離線的方式保留,待客戶端下次上線之後採用

mobpush

通道下發;所有的透傳訊息都是需要經過

mobpush

自有通道下發的。

為什麼會考慮使用udp協議?

有很多推送協議也是採用mqtt 或

xmpp

或 其他基於

tcp

的方案,

mqtt

有qos

功能,實現了重發次數以及相關策略,但是比較複雜、可自定義程度比較低;

xmpp

基於xml

協議,屬於文字協議範疇,協議對比比較複雜且太冗餘,不太適合推送系統。

mobpush定位為廣大開發者提供穩定、實時的推送服務,需要能夠承受極大的網路負擔壓力,會連線大量的客戶端,並且要積極保障可快速響應;對於推送服務來說訊息內容卻更多是短訊息內容,並非短文,大多類似於簡訊長度的提醒、通知、營銷內容,可以控制在

udp資料報長度內,不需要進行分包處理,

internet

上的標準

mtu(最大傳輸單元)值為

576位元組,網路層

ip需要佔據20,

udp首部占用

8個,所以只需要控制下發內容長度在

576-20-8 =548

位元組即可;對於

push

來說,對資料的到達順序性要求比較低,不像

im這種互動需要保障訊息的順序。

基於以上原因,udp更加適合

mobpush

的協議選型了,當然在

mobpush

也並不是完全放棄如

mqtt

的qos

機制,這個會在業務**中處理而不是靠網路協議來補償,

mobpush

在對應的設定條件下可保障訊息有一次的到達。

mobpush

在訊息安全上也有所考慮,會在下發訊息經過壓縮、

aes加密處理,而加密的

aes key

是動態生成。

既然是做推送sdk的,為什麼還需要對接廠商通道呢?

android

的保活、互拉及其困難,但是絕對重要。一般的保活方式包括:利用系統

service

機制、設定程序優先順序的方式、利用系統廣播、使用

alarmmanager

、程序間相互拉起、利用

native

程序等等,但是現在

android

的對這些機制都有了對應策略,很難發揮相對大的作用。誠然在華為、小公尺、魅族各系統中已經有廠商自己的推送鏈結服務,廠商自己的推送服務肯定是不會被殺死的,所以在考慮推送服務的時候,利用好廠商自有通道,可以很好的保障訊息的準確到達,並且有的機型可以很好喚醒

。說到推送的長連線不得不說到另外乙個問題:埠老化的問題,因為ip資源的有限以及路由器埠數量有限導致這一問題,具體關於

nat本文不分析。

mobpush

依靠心跳的機制來維護客戶端、路由器、基站、服務端的關係,以此對抗

nat老化問題,以確保

udp鏈結的套接字保活。

mobpush

的心跳包體只有乙個位元組長度,能夠很大的節省

client

的流量,而且對於心跳時間也可以調整。

三、服務整體架構

整體採用微服務架構,各層之間邏輯清晰,能很好的做到水平擴充套件和服務拆分以及負載。

控制層:主要為資料入口,主要負責資料安全加解密、流控;

業務服務:和控制層dubbo互動,處理業務邏輯,可以根據實際情況做到業務降級和壓力分流;

基礎服務:主要包含一些資料統計、定時任務的處理:如定時推送業務、推送中心,還有最重要的為mobpush通道提供支援的

udp服務,這些服務當前也是設計為分布式服務,可以很好的進行水平擴充套件;

儲存層:根據不同資料的重要性、實時性、量級分別輸入到不同儲存空間,並且根據重要資料歸檔日誌。

在系統中,根據業務規則,使用kafka作為訊息佇列將業務解耦,縮短業務處理流程,將複雜的處理邏輯分層簡化,非同步處理,提公升業務響應時間。

iOS推送 實現本地推送

第一步 建立本地推送 建立乙個本地推送 uilocalnotification notification uilocalnotification alloc init autorelease 設定 10秒之後 nsdate pushdate nsdate datewithtimeintervalsi...

iOS推送 實現本地推送

第一步 建立本地推送 建立乙個本地推送 uilocalnotification notification uilocalnotification alloc init autorelease 設定10秒之後 nsdate pushdate nsdate datewithtimeintervalsin...

使用Jpush 極光推送 實現推送功能

農曆猴年最後一篇文章,在寫前先寫一段話,我覺得挺好的,2017年要努力做到 學會忍耐,因為事已成現實自己無法改變 學會說不,因為做不到的事不要強求 學會適應,因為任何條件下都要生存 學會知而不言,因為言多必失 學會拿得起放得下,以為只要這樣才會能重新開始新的起點 做不了決定的時候,讓時間幫你決定,如...