前言:
極光簡訊屬於極光推送的一塊業務,極光簡訊最大的優勢是針對推送訊息未送達的使用者進行補發簡訊,既保證訊息觸達又節省成本,以及認證簡訊或者其他業務場景都需要用到簡訊功能。
極光簡訊業務最底層是真實對對接運營商,使用的cmpp協議傳送簡訊,而在測試環境中, 不可能對真實環境來驗證簡訊功能,原因:
1.測試需要傳送大量的簡訊,費用會很高
2.需要模擬各種異常的訊息 ,真實運營商有很多規則才能觸發異常
3.需要對運營商快速返回各種錯誤,真實運營商可能會延遲,不利於測試
4.還需要針對大量資料時進行限速設定等各種場景
所以針對以上4點的考慮,最終我們選擇自己“建立”一個運營商來處理資料客戶端發來的資料,滿足日常的簡訊業務測試
在模擬之前,我們需要對運營商使用的底層協議,互動方式,資料處理方式進行確認,才能更好的建立一個自己的“運營商”。
術語解釋
1.認識cmpp協議
1.1網路結構
如圖1所示,網際網路簡訊閘道器(ISMG)是外部資訊資源站實體(SP)與移動網內簡訊中心之間的中介實體,網際網路簡訊閘道器一方面負責接收SP傳送給移動使用者的資訊和提交給簡訊中心。另一方面,移動使用者點播SP業務的資訊將由簡訊中心通過網際網路簡訊閘道器發給SP。
1.2 CMPP功能概述
以下內容來自cmpp2.0文件的的介紹
簡訊接收(Short Message Mobile Terminated,SM MT) 典型的業務操作舉例如圖3所示:
圖3 需要前轉的MT示意圖
1.SP發出資料請求(可能是簡訊通知或手機鈴聲等),被源ISMG接收;
2.源ISMG對接收到的資訊返回響應;
3.源ISMG在本地資料庫中找不到手機號段所對應閘道器程式碼,向GNS(匯接閘道器)發路由請求資訊;
4.匯接閘道器將路由資訊返回;
5.源ISMG根據路由資訊將請求轉給目的ISMG;
6.目的ISMG對接收到的資訊返回響應;
7.目的ISMG將請求資訊傳送至SMC;
8.SMC向目的ISMG返回響應;
2.協議棧
CMPP協議以TCP/IP作為底層通訊承載,具體結構由圖2所示:
圖 2.1CMPP協議棧
ICP與ISMG以Clientmdash;Server方式建立TCP連線,用於雙方資訊的相互提交。TCP/IP連線建立後,由Client發起建立應用層的連線,這時如果ICP或ISMG認為需要建立TLS連線,則在傳輸的資料包中置TLS欄位,從而在雙方建立TLS連線。
在應用層連線建立後的資料傳輸過程中,如果ICP或ISMG需要向對端傳送加密資訊,也可建立TLS連線,這時只需要置相應的訊息體中Tls_available(是否使用TLS層)屬性欄位, 本條訊息的訊息體中的其他屬性不傳送。
訊息採用併發方式傳送,加以滑動視窗流量控制,即接收方在應答前一次收到的訊息多於視窗大小條將予以拒絕。流程圖如圖3所示:
2.1.訊息定義
訊息定義是客戶端與服務端之間“溝通的方式” 以下是cmpp協議內容的定義 (其中的一個鑑權協議)
基本資料型別
訊息結構
訊息頭格式(Message Header)
CMPP_CONNECT訊息定義(SPàISMG)
CMPP_CONNECT訊息定義
CMPP_CONNECT_RESP訊息定義(ISMG à SP)
3.構建服務端
3.1簡訊測試樁架構分析
業務處理流程。如圖3.2所示
圖3.2
處理流程說明
1.服務端收到一條為39個位元組的長度的請求資料,由於頭部固定為12位元組,剩餘為27個位元組
2.根據以上的協議27個位元組長度判斷是需要建立連線
3.獲取客戶端的連線的使用者名稱與密碼,解析AuthenticatorISMG欄位驗證是否鑑權成功
4.成功進行下一步操作 (需要回應 鑑權成功),在根據建立的連線後,對獲取的資料進行處理,返回內容
我們以鑑權部分提取它的主要程式碼: 取出頭部資料包
獲取主體內容,鑑權內容
日誌展示
3.2效果展示
簡訊測試樁目前已在測試環境中執行了2年多,幫助公司節省了一大筆測試費用,以下是它展示的效果內容
在iportal上展示,傳送成功狀態。
在iportal上展示,傳送失敗狀態。
在iportal上展示,已傳送的狀態。
Iportal上展示,餘額不足的狀態
3.3簡訊模擬樁遇到的問題
1.傳送的請求資料量已經超過視窗大小
當客戶端傳送的數量超過了大小處理大小,服務端進行限流,讓任務進行排隊處理並對它返回響應的code,以減輕服務端壓力
2.程式碼建立無效的連結,浪費資源
建立一個連線,就儲存一個連線,當無效連結時,需要刪除連線,如何判定無效,心跳連線不在建立,或建立連線後,20分鐘內都沒有傳送訊息(測試環境),服務端對斷鏈進行處理
3.語言的選項,以及方案設計
可選擇java以及Python語言都可以,考慮Python在公司的使用程度較高,選擇Python
選擇Python的類有struct模組,使用者解析位元組資料,使用gevent來解決協程,或者是Python提供的多程式
4.訊息粘包
讀取資料時,根據頭部的長度資訊,按序讀取ioArgs緩衝區中的資料,若沒有達到長度要求,繼續讀下一個ioArgs解決粘包、半包問題。
我們逐步完善測試樁,它不僅具有解析資料的功能,傳送報告,保持心跳、處理不同錯誤code,我們也提升了處理速度,以前是1分鐘處理10個,現在1分鐘能處理300個,滿足我們大批量資料速度的一個提升,完善了我們各種場景的測試。