關注我們

電話:

(全國服務熱線)400-003-3800 (售前電話)0736-7793-866 / 0736-7792-494
(售后電話)0736-7952-222 / 0736-7951-999

 

 

郵箱:

info@changdewm.com     

marketing@changdewm.com

地址:

湖南省常德國家高新技術產業開發區崗中西路9號 常德牌水表智能科技產業園

OA系統                         outlook郵箱

 

新聞中心

NEWS

搭建基于Windows的水表行業高可用Socket通信服務框架

瀏覽量
張  景
(湖南常德牌水表制造有限公司,湖南常德 415000)
 
摘 要:隨著城市化發展的速度越來越快,互聯網以及互聯網與傳統水務行業相融合所產生的智能遠傳水表產品的使用日益增多,這就給互聯網后臺服務應用程序提出了更高的性能和并發要求。目前開發的后臺服務應用程序中數據采集系統主要以基于TCP/IP協議的Socket編程技術構建。本文主要結合水表行業實際項目經驗,闡述我是如何設計和開發一個高并發、高性能、高可用的網絡通信框架。
關鍵字:水表 高可用 Socket 框架
       Socket服務器主要用于提供高效、穩定的數據處理、消息轉發等服務,它直接決定了前臺應用程序的性能。
       Socket通信從技術上分為客戶端和服務端,目前客戶端主要為無線遠傳集中器、有線遠傳集中器、單個物聯網終端水表,實際上客戶端在單微機上都只有一個Tcp客戶端在連接。服務端Tcp連接包含長連接和短連接共存,隨著用戶量以及設備量的增加,一個高可用的Socket服務端技術的實現是非常重要的。
       直入主題,介紹我們的Socket通信服務框架,從架構上分為:網絡層、業務層、數據層,其中在網絡層增加了消息隊列,在業務層加入業務抽象類處理不同的業務類型,在數據層引入SQL消息隊列以及緩存數據庫。具體如圖:
(圖一)WMSocket通信服務框架
(一)網絡層
       網絡層主要實現Socket連接的創建、消息接收、消息發送、關閉連接功能。作為Socket通信服務端,網絡層的性能非常重要,所以我們在設計網絡層的時候,著重的突破以下幾方面:最大連接數、最大并發數、消息處理秒級別。主要通過如下幾種技術和技巧解決:
1)使用基于IOCP模型的SAEA方式
       在Windows環境下利用Windows內核來進行I/O的調度,是用于Socket通信模式中性能最好的網絡通信模型。Windows I/O Completion Ports完成端口技術的提出解決了“one-thread-per-client”即一個客戶端連接就啟動一個新的線程和客戶端進行通信導致CPU在線程之間進行上下文切換所帶來了負擔的缺點,它充分利用內核對象的調度,僅僅只需要少量的幾個線程來處理和客戶端的所有通信,消除了無畏的上下文切換,從而最大限度的提升了網絡通信的性能。
而在.NET環境下使用SAEA(SocketAsyncEventArgs)方式,重點在于池化,主要目的是避免在異步套接字I/O量非常大的情況下發生重復的對象分配和同步,提升性能和減少GC回收壓力。
2)使用雙工通信
       雙工通信是提升Socket服務通信效率的一種有效技術方法。我們采用啟動一個TcpSend線程調度器,在SAEA異步接收消息進行業務處理后,如果需要進行發送消息到客戶端,采用向發送消息隊列中Push一條消息,包含SAEA連接對象,通過TcpSend調度器輪詢進行消息發送,以實現全雙工通信。
3)消息隊列及調度任務
       網絡層消息隊列主要為接收消息隊列以及發送消息隊列,主要目的在于提高Socket服務器的吞吐量。我們定義一個接收消息隊列RecQueue和一個發送消息隊列SendQueue,然后啟動多個調度任務,不斷的從消息隊列中拿取消息,接收消息隊列調度任務將消息拿取拋至業務層進行業務邏輯處理,發送消息隊列調度任務拿取消息調用網絡層發送消息接口,向指定客戶端發送消息。
4)心跳掃描
       心跳分兩種,一種為長連接客戶端模式時由客戶端定時發送心跳過來,服務端接收心跳消息,一旦超時沒有心跳消息則判斷客戶端斷開,服務端主動關閉該連接。另一種為服務端啟動的定時心跳掃描,定時掃描每條連接,不論長連接還是短連接如果超過超時時間沒有I/O響應,則關閉它,杜絕了掛掉的客戶端成為落地生根的釘子戶,占用系統資源。
5)粘包處理
       針對短連接不存在粘包情況,因為每次接收消息都要經過握手連接,接收消息,關閉連接。但是針對長連接,服務端在接收消息包時,就可能出現兩條或多條消息一起接收了,而出現粘包情況。在這里我們采取了封裝報文頭和報文尾,并且加入報文長度位進行處理,來解決粘包的問題。
(二)業務層
       業務層接收到網絡層調度任務拋過來的消息后,解決消息包,根據獲取到的消息類型TYPE,通過抽象類轉到相對對象的業務處理流程進行處理。
       業務處理流程通過單機或集群進行業務處理后,生成數據緩存實體,存入到Redis緩存數據庫,以供Redis調度任務進行數據處理。
       同時業務層有發送消息時,根據具體的業務應用,封裝不同功能的消息包,調用網絡層消息發送接口,往網絡層消息發送隊列插入消息,以供網絡層發送消息隊列調度任務進行發送處理。
(三)數據層
       數據層的設計是整個Socket通信服務架構的關鍵。舉個例子說明:假設我們的Socket服務器每秒均值處理2000條消息,每處理一條消息都會將數據作為歷史記錄存儲到數據庫,同時還要關聯其他相關業務數據和表。那么數據層要想跟上網絡層的處理性能,其執行SQL語句的效率也就必須達到每秒2000*n次,通常情況下我們的SQL語句的執行效率要達到那么高是很困難的。所以在整個Socket通信服務端,數據庫的執行效率是瓶頸!
       那么如何提高數據庫的執行效率,讓數據層的處理速度和網絡層的處理速度達到一個平衡?我們的設計是分兩步走:首先采用高效內存數據庫Redis+異步數據存儲處理方式,確保通過高效的內存數據庫Redis跟上網絡層的處理速度;然后異步數據存儲,通過DB連接池+SQL消息隊列+SQL調度任務批量處理,通過穩定平衡的利用數據庫空閑時間的處理來降低數據庫硬盤存儲數據的壓力。
結論
以上架構設計完成后,通過測試發現:一臺4G內存,2.4G主頻,2處理器CPU的單機,接收客戶端連接為32000時出現拒絕連接。也就是說在該服務器資源情況下,最多能接收到32000個連接數,按照一個采集設備至少負載1000臺智能水表算,該服務器資源情況下至少能滿足3000萬臺無線遠傳水表的接入和數據上傳,完全能夠滿足一個大?。ㄈ绾鲜。┑闹悄苓h傳水表的接入。
 
參考文獻:
[1] 楊秋黎,金智.Windows網絡編程(第2版).人民郵電出版社,2016.
[2] 胡萍,陳志鵬. 基于線程池的高性能服務器軟件的設計與實現. 計算機技術與發展. 2006.
[3] [美]Josiah L. Carlson,黃健宏譯. Redis In Action. 中國工業出版集團,2015.
[4] 劉偉. 設計模式(重點大學軟件工程規劃系列教材).清華大學出版社,2011.
[5] 黃曉君,周志斌. 淺談遠傳水表系統. 科技信息學術版,2008(16):260+262.
日本一本大道无码高清_亚洲色综合高清无码_日本高清视频中文无码