短信服務平臺SMSSDK進化之路和架構(gòu)思路
SMSSDK 是可以叫應用快速、免費擁有手機驗證功能的SDK。幫助開發(fā)者減少大量的開發(fā)工作,幫助企業(yè)節(jié)省短信群發(fā)費用。
SMSSDK到現(xiàn)在為止經(jīng)歷1.0到3.0幾十個版本的迭代升級,已經(jīng)非常穩(wěn)定和高效。
這個過程中有:
· sdk的bug修復,性能提升,安全性提升。
· sdk發(fā)送驗證碼部分收費到完全免費的升級。
· 功能逐漸豐富的過程
· 服務端架構(gòu)調(diào)整
SMSSDK的初始版本在效能和穩(wěn)定性上有太多的不足和缺失。這些問題主要集中的服務端,下面我來介紹一下SMSSDK服務端的進化之路。
一、SMSSDK1.0版本
· 問題
1. 效能性:經(jīng)常出現(xiàn)發(fā)送短信延遲或者失敗的情況;
2. 穩(wěn)定性:服務不夠穩(wěn)定,需要經(jīng)常重啟服務保證服務的相對正常運行;
3. 可用性:開發(fā)者反饋問題后,技術支持解決時間較長;
· 原因
在1.0時期的服務器架構(gòu)有一些不合理的地方導致出現(xiàn)了上面的問題。下面我會根據(jù)架構(gòu)圖介紹當時的架構(gòu)細節(jié),如圖:
如圖中所示從SDK到負載均衡這一階段沒有太大的問題,可以繼續(xù)保持使用。
問題主要出現(xiàn)在一下三個方面:
· 業(yè)務服務
· 數(shù)據(jù)中轉(zhuǎn)
· 數(shù)據(jù)存儲
業(yè)務服務
1. 所有業(yè)務耦合在一起,經(jīng)常因為一個不重要的業(yè)務流程執(zhí)行緩慢導致整個驗證碼發(fā)送、校驗業(yè)務緩慢或崩潰;
2. 服務間通信采用普通的HTTP接口交互,且依賴度很高,互相影響較大;
3. 服務的容錯性較低;
4. 通道單一,當通道出問題后服務不可用。
數(shù)據(jù)中轉(zhuǎn)
使用單臺Redis作為消息隊列中轉(zhuǎn)數(shù)據(jù)。
redis作為消息隊列時,經(jīng)常出現(xiàn)內(nèi)存不足的情況,導致前面的服務響應緩慢或不響應。
因此,還延伸出了離線處理數(shù)據(jù)的多個輔助程序,增加維難度。
數(shù)據(jù)存儲
1.存儲數(shù)據(jù)介質(zhì)多樣:MongoDB,Redis,HBase,Elasticsearch。增加系統(tǒng)復雜度,增加維護成本;
2.存儲介質(zhì)穩(wěn)定性低,且異常處理缺失,導致一些數(shù)據(jù)丟失;
3.日志信息記錄不全,查找問題困難
上面的架構(gòu)給開發(fā),運維,技術支持帶來巨大的工作量,非常影響SMSSDK的服務質(zhì)量,加上SMSSDK免費業(yè)務線確定,決定對服務器架構(gòu)進行重構(gòu),由此誕生了SMSSDK2.0。
一、SMSSDK2.0版本
此版本主要解決1.0版本中存在的各種問題,旨在為開發(fā)者提供更快,更穩(wěn)定,更豐富功能的SDK。
架構(gòu)圖:
1.訪問層使用Nginx做負載均衡;
2.服務層:要求服務間互不影響或影響較小。將之前的一個服務拆分為:
o 基礎服務:查多寫少的服務,要求響應迅速;
o 短信發(fā)送、校驗服務:發(fā)送驗證碼短信,校驗驗證碼短信。
o 其他服務:其他開發(fā)者可選集成的服務。
o Web服務:開發(fā)者服務器接口服務。
o 速碼云服務:隸屬于速碼云內(nèi)部的公共服務。
通過服務拆分,將業(yè)務分級,流量分流,各個服務間解耦互不影響,服務穩(wěn)定性穩(wěn)步提升。例如:有一段時間基礎服務被攻擊,pv由正常的2000w增加到3.7億,導致基礎服務響時間增加。但此時短信發(fā)送,校驗等其他服務任然能正常使用。
3.數(shù)據(jù)處理層:
數(shù)據(jù)處理層更改的地方比較多,從根本上解決1.0版本的不穩(wěn)定因素。
· 使用kafka做消息隊列,將業(yè)務解耦,數(shù)據(jù)統(tǒng)一處理。
· 縮短服務層的處理流程,通過kafka將復雜耗時的處理在數(shù)據(jù)處理中心中異步處理,縮短服務層的訪問時間。
· 獨立短信發(fā)送業(yè)務,專注對接通道,保證短信發(fā)送穩(wěn)定高效;
· 服務間調(diào)用使用Dubbo通信。
· Redis不再寫盤,并增加keepalived。
· 接入多條通道,保證短信發(fā)送成功率。當一條通道出現(xiàn)問題,自動啟動備用通道發(fā)送短信。
· 增加業(yè)務全流程監(jiān)控,并提供技術支持系統(tǒng)。將之前的問題查詢時間縮短10倍。
· 服務配置動態(tài)化,即時生效,且不需要重啟服務器。
4.數(shù)據(jù)存儲:簡化升級數(shù)據(jù)存儲介質(zhì),提高其穩(wěn)定性,降低維護難度。
· MongoDB分庫分表以提升查詢寫入性能;
· 升級優(yōu)化ES的索引結(jié)構(gòu),提升數(shù)據(jù)的完整性;
· 通過kafka傳遞數(shù)據(jù),在數(shù)據(jù)中心統(tǒng)一落地,統(tǒng)一處理落地錯誤的數(shù)據(jù)
以上就是SMSSDK2.0版本的服務端架構(gòu)縮影,在實際的實施過程中還遇到了很多問題:
· 新老版本的數(shù)據(jù)兼容合并問題;
· kafka重復消費導致短信重復發(fā)送的問題;
· 統(tǒng)計耗費過多資源,且數(shù)據(jù)不準確的問題;
· 通道智能切換的問題;
等等其它大大小小的問題。不過在2.0版本上,進行bug查找,修復的難度降低了很多。
1. 業(yè)務升級:
· 增加的SDK的智能驗證功能;
· 增加了web-api發(fā)送自定短信內(nèi)容的接口;
· 優(yōu)化了SDK的通信協(xié)議,提升安全性和性能;
在SMSSDK2.0穩(wěn)定運行之后,由于速碼云內(nèi)部業(yè)務調(diào)整,開發(fā)者需求增多等諸多因素,SMSSDK邁入了3.0。
三、SMSSDK3.0版本
SMSSDK3.0在主體架構(gòu)上沒有做太大的改動,主要在業(yè)務上做了很多的優(yōu)化工作。最終目的是縮短開發(fā)者集成SDK的時間,提升速碼云平臺的服務品質(zhì)。
在3.0中,主要做了以下升級:
1. 同一個appkey可以在速碼云的所有sdk中使用。
2. 開發(fā)者可以個性化配置:短息內(nèi)容,驗證碼長度,驗證碼有效時間;
3. 接入了更多優(yōu)質(zhì)通道,提升短信發(fā)成功率;
4. 標準化sdk的通信協(xié)議,方便和其他速碼云下sdk組合使用; 還有bug修復,性能優(yōu)化的工作,就不逐個列舉了。
文章結(jié)語
以上就是SMSSDK 2年來的進化過程。這其中有服務崩潰時的慌張,有數(shù)據(jù)丟失時的驚恐,有尋找bug時的迷惑,有服務穩(wěn)定高效時的欣喜。
在未來SMSSDK將繼續(xù)保持高效、穩(wěn)定的短信驗證和發(fā)送服務。持續(xù)不斷的技術升級,為開發(fā)者提更為豐富的功能。