日本一级爽快片淫片高清特级_日韩中文字幕网_国产视频在线免费观看_好男人资源在线观看高清社区

歡迎光臨水表信息網(wǎng)!
技術(shù)前沿
當(dāng)前位置: 首頁 » 技術(shù)前沿 » 技術(shù)論文
 
技術(shù)論文

搭建基于Windows的水表行業(yè)高可用Socket通信服務(wù)框架

字體: 放大字體  縮小字體 發(fā)布日期:2019-04-02  來源:湖南常德牌水表制造有限公司  作者:張 景  瀏覽次數(shù):1027

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


 
[ 技術(shù)前沿搜索 ]  [ 加入收藏 ]  [ 告訴好友 ]  [ 打印本文 ]  [ 關(guān)閉窗口 ]
 
相關(guān)新聞