PUSH系統架構設計簡述html
一.網絡傳輸協議的選擇golang
PUSH系統協議選取:web
UDP協議實時性更好,可是如何處理安全可靠的傳輸而且處理不一樣客戶端之間的消息交互是個難題,實現起來過於複雜,那就非TCP協議莫屬了,要考慮的一樣也有不少,特別是若是有海量用戶的需求。數據庫
a)基於TCP協議的長鏈接;apache
b) 基於websocket的輪詢;json
c)基於http的短連接Pull方式;緩存
二.應該選擇什麼格式的數據協議安全
對於客戶端和服務端的數據傳輸一般會有如下幾點考慮:服務器
1.網絡數據大小——佔用帶寬,傳輸效率:雖然對單個用戶來講,數據量傳輸很小,可是對於服務器端要承受衆多的高併發數據傳輸,必需要考慮到數據佔用帶寬,儘可能不要有冗餘數據,這樣纔可以少佔用帶寬,少佔用資源,少網絡IO,提升傳輸效率;websocket
2.網絡數據安全性——敏感數據的網絡安全:對於相關業務的部分數據傳輸都是敏感數據,因此必須考慮對部分傳輸數據進行加密;
3.編碼複雜度——序列化和反序列化複雜度,效率,數據結構的可擴展性,可維護性:對於平臺相關業務的代碼實現也須要考慮到數據發送方和數據接收方數據處理的複雜度和數據結構的可擴展性,可維護性,人力成本和實施複雜度也必須考慮在內;
4.協議通用性——大衆規範:數據類型必須是跨平臺,數據格式是通用的,你們廣泛能接受上手的;
如下咱們經過幾種不一樣類別的協議數據類型進行比較:
A)自定義二進制
優勢:信息體積小
缺點:編碼複雜度高(本身定義消息格式,本身編寫序列化和反序列化方法,本身進行容錯處理,可擴展性不強,好比添加個字段,就必須改兩端的邏輯處理)
B) 提供序列化和反序列化庫的開源協議:
優勢:是一種流行的通用數據格式,擴展至關方便,序列化和反序列化至關方便(有相應庫),錯誤處理方便(庫支持);
C) 文本化協議:
好比xml,json,xmpp
優勢:序列化,反序列化容易(庫支持),調試方便,可視化強
缺點:相對於二進制存儲佔用體積大
三.架構設計
架構考量:
因爲採用可靠傳輸協議TCP,考慮到負載問題(長鏈接的保持、消息推送等);
後臺架構的靈活性、可擴展性,支持分佈式,可橫向擴展,易伸縮,高可用。同時把網絡層、業務邏輯層、數據層分離,網絡層和業務層支持負載均衡策略、數據層支持分佈式存儲。
架構圖
PUSH推送服務架構圖:
架構設計說明:
A) 右側四大組件分別是ZK服務、配置中心、日誌系統、監控系統.
1)Log System 主要負責業務日誌輸出,主要有連接相關日誌、推送鏈路日誌、心跳日誌、監控日誌等;
2)Monitor 主要用做系統狀態監控,可用於系統調優,包括內存,線程,系統堆棧,GC等狀況;
3) ZK Client 主要負責註冊長連接ip:port,網關ip:port以及監聽各個節點變化,同時增長了緩存;
4) Config-Center 是PUSH Server 配置化服務。
B)Core模塊分別是長連接服務,網關服務,Packet編解碼及消息分發模塊,Message序列化及處理模塊。
1)ConnectServer用於維持和客戶端之間的TCP通道,主要負責和客戶端交互;
2)ConnectionManager主要負責連接管理,定時檢查連接狀況,是否讀寫超時,若是連接斷開發出相應的事件給路由中心去處理;
3) RSA/DES加解密,主要是消息傳輸中的DES加解密,以及登陸的RSA會話密鑰生成及Session複用;
4)Send/Receive-Packet主要負責消息的發送和接收;
5)Packet主要是協議部分的數據包編解碼和包的完整性校驗等;
6) Message部分是處理消息的序列化,還有消息壓縮、加密等。MessageHandler會根據不一樣消息獨立處理本身所屬的業務,主要有:心跳響應、握手及密鑰交換、快速重連、登陸/退出用戶等。
7)MessageDispatcher消息分發 包括分發策略,發送在線設備,存儲離線設備信息等。
8)路由中心主要包括:遠程路由,用戶在線管理等;
a) Router—Center負責維護用戶+設備與連接所在機器IP及連接之間的關係;
b) UserManager主要處理用戶上下線事件的廣播,以及單臺機器的在線用戶及數量的維護和查詢;
C)存儲部分:
1)Redis主要存儲離線設備信息,登陸設備信息和組信息等,其集羣支持水平橫向擴展,雙寫,主備,hash 等特性;
2)Mongo集羣,支持副本集和分配,主要存儲消息流水信息,以便作查詢彙總等處理。
服務端平臺及技術選型
系統開發平臺: CentOS——Linux系統,穩定可靠、可定製優化、支持豐富;
緩存存儲層: Redis——支持豐富的存儲結構,支持分佈式存儲;
數據庫: MySQL/Mongo——最適合互聯網的數據庫,免受權、高效穩定、可控性高;
開發語言: golang/erlang——高併發,跨平臺;
部分熱點問題考量
編碼角度:採用高效的網絡模型,線程模型,I/O處理模型,合理的數據庫設計和操做語句的優化;
垂直擴展:經過提升單服務器的硬件資源或者網絡資源來提升性能,如Linux內核參數,網絡協議棧參數調優等;
水平擴展:經過合理的架構設計和運維方面的負載均衡策略將負載分擔,有效提升性能;後期甚至能夠考慮加入數據緩存層,突破IO瓶頸;
系統的高可用性:(防止單點故障)
在架構設計時作到業務處理和數據的分離,從而依賴分佈式的部署使得在單點故障時能保證系統可用。
對於關鍵獨立節點能夠採用雙機熱備技術進行切換。
數據庫數據的安全性能夠經過磁盤陣列的冗餘配置和主備數據庫來解決。
(轉載請註明出處本文出處: https://www.cnblogs.com/unqiang/p/9258739.html)