目前websocket技術(shù)已經(jīng)很成熟,選型Go語言,當然是為了節(jié)省成本以及它強大的高并發(fā)性能。我使用的是第三方開源的websocket庫即gorilla/websocket。
我們提供的服務(wù)有:網(wǎng)站設(shè)計制作、網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、白云ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學管理、有技術(shù)的白云網(wǎng)站制作公司
由于我們線上推送的量不小,推送后端需要部署多節(jié)點保持高可用,所以需要自己做集群,具體架構(gòu)方案如圖:
Auth Service:鑒權(quán)服務(wù),根據(jù)Token驗證用戶權(quán)限。
Collect Service:消息采集服務(wù),負責收集業(yè)務(wù)系統(tǒng)消息,存入MongoDB后,發(fā)送給消息分發(fā)服務(wù)。
Dispatch Service:消息分發(fā)服務(wù),根據(jù)路由規(guī)則分發(fā)至對應消息推送服務(wù)節(jié)點上。
Push Service:消息推送服務(wù),通過websocket將消息推送給用戶。
集群推送的關(guān)鍵點在于,web端與服務(wù)端建立長連接之后,具體跟哪個推送節(jié)點保持長連接的,如果我們能夠找到對應的連接節(jié)點,那么我們就可以將消息推送出去。下面講解一下集群的大致流程:
1. web端用戶登錄之后,帶上token與后端推送服務(wù)(Push Service)保持長連接。
2. 推送服務(wù)收到連接請求之后,攜帶token去鑒權(quán)服務(wù)(Auth Service)驗證此token權(quán)限,并返回用戶ID。
3. 把返回的用戶ID與長連接存入本地緩存,保持用戶ID與長連接綁定關(guān)系。
4. 再將用戶ID與本推送節(jié)點IP存入redis,建立用戶(即長連接)與節(jié)點綁定關(guān)系,并設(shè)置失效時間。
5. 采集服務(wù)(Collect Service)收集業(yè)務(wù)消息,首先存入mongodb,然后將消息透傳給分發(fā)服務(wù)(Dispatch Service)。
6. 分發(fā)服務(wù)收到消息之后,根據(jù)消息體中的用戶ID,從redis中獲取對應的推送服務(wù)節(jié)點IP,然后轉(zhuǎn)發(fā)給對應的推送節(jié)點。
7. 推送服務(wù)節(jié)點收到消息之后,根據(jù)用戶ID,從本地緩存中取出對應的長連接,將消息推送給客戶端。
其他注意事項:
Socket通信的原理還是比較簡單的, 它大致分為以下幾個步驟。 服務(wù)器端的步驟如下。 (1)建立服務(wù)器端的Socket,開始偵聽整個網(wǎng)絡(luò)中的連接請求。 (2)當檢測到來自客戶端的連接請求時,向客戶端發(fā)送收到連接請求的信息,并建立與客戶端之間的...
蘋果的消息推送是通過請求域名: 實現(xiàn)的,該域名解析結(jié)果為美國,這引發(fā)了兩個問題:
1、接口請求時間長,性能低,而且容易請求超時報錯
2、高峰期推送請求錯誤率升高
總體思路:增加一個美國代理服務(wù)器,通過代理服務(wù)器請求蘋果消息推送服務(wù)
1、原來流程
2、現(xiàn)在流程
3、具體方案實施選擇
選擇一:proxy服務(wù)器,部署一個正向代理服務(wù),提供push消息的正向代理,消息通過代理服務(wù)器送達蘋果服務(wù)端
選擇二:proxy服務(wù)器,獨立實現(xiàn)、部署一個 標準的apns服務(wù),負責 ios消息推送。將需要走美國節(jié)點的請求轉(zhuǎn)發(fā)到該proxy節(jié)點
具體情況、具體分析,應思考的點:
問題一、蘋果官方提供的SDK中,不支持設(shè)置代理服務(wù)器。官方SDK不適合更改,對以后系統(tǒng)更新不利
問題二、只有蘋果的push服務(wù)需要代理,其他例如華為、小米、vivo不應走海外代理
問題三、代理安全性
問題四、代理方案下,有重試邏輯。 如何準確定義和判斷失敗, 可能會引起消息重復推送
問題五、實現(xiàn)簡單、有效,正向代理方式:只需實現(xiàn)一個實例化對象方法,其他利用原始sdk即可。獨立apns服務(wù)方式:需要實現(xiàn)一個apns服務(wù),國內(nèi)、國外均需服務(wù)部署,需要增加獨立的開發(fā)和運營成本,另外還得改造調(diào)用服務(wù),實現(xiàn)請求調(diào)度,優(yōu)點服務(wù)獨立、單一,具備一個單獨微服務(wù)條件
github.com/sideshow/apns2
方法一: 修改SDK文件
第一步:設(shè)置環(huán)境變量
第二步:修改apns2.NewClient方法
方法二: 從新定義一個NewClient方法