摘要:服務(wù)器大規(guī)模下發(fā)數(shù)據(jù)幀時(shí),可進(jìn)行有效的擁塞控制超時(shí)重發(fā),可有效提升集群設(shè)備的可靠性,降低集群設(shè)備的研發(fā)難度。幀調(diào)度策略由于這些問題,故自行制定如下幀調(diào)度策略,實(shí)踐表明,該策略可最大程度上解決以上問題。
「博客搬家」 原地址: 簡(jiǎn)書 原發(fā)表時(shí)間: 2017-07-19
最近正在做一個(gè) Java 后端項(xiàng)目「大規(guī)模集群設(shè)備的管理平臺(tái)」。使用 Spring 作為基礎(chǔ)框架,使用 Netty 搭建 TCP 服務(wù)器與上萬臺(tái)設(shè)備組成的集群通信,使用基于 JavaFX 的圖形界面應(yīng)用程序模擬上萬臺(tái)設(shè)備的行為,并可對(duì)服務(wù)器進(jìn)行壓力測(cè)試。
本項(xiàng)目的基礎(chǔ)實(shí)現(xiàn)架構(gòu)已開源,訪問以下地址獲?。骸窯itHub」
Java 服務(wù)器中,由于眾多硬件設(shè)備的數(shù)據(jù)幀處理能力較差,可靠性較差,所以在 Netty 模塊中使用的幀調(diào)度算法。服務(wù)器大規(guī)模下發(fā)數(shù)據(jù)幀時(shí),可進(jìn)行有效的擁塞控制、超時(shí)重發(fā),可有效提升集群設(shè)備的可靠性,降低集群設(shè)備的研發(fā)難度。
1. Netty 模塊和大規(guī)模集群設(shè)備通信遇到的問題硬件設(shè)備的幀處理能力較差,單臺(tái)設(shè)備最大處理能力為 20 幀/秒,服務(wù)器需進(jìn)行流量控制,避免到達(dá)設(shè)備的處理極限。
硬件設(shè)備的可靠性較差,偶爾會(huì)出現(xiàn)丟幀的情況,故雖使用 TCP 協(xié)議,服務(wù)器仍需自行保證整個(gè)通信的可靠性。
2. 幀調(diào)度策略由于這些問題,故自行制定如下幀調(diào)度策略,實(shí)踐表明,該策略可最大程度上解決以上問題。
「注」本部分為源碼「Netty服務(wù)器」部分的解釋說明,需結(jié)合源碼進(jìn)行閱讀。2.1 服務(wù)器發(fā)送 Message 指令策略
源碼從此處獲取:「GitHub」
服務(wù)器 ServerTcpMessageHandler 對(duì)象首先檢查鏈表雙端隊(duì)列「LinkedBlockingDeque」中待發(fā)送幀的數(shù)量,若數(shù)量大于限定數(shù)量,則將待執(zhí)行指令「Message」傳入時(shí)間輪進(jìn)行等待,使之在預(yù)訂的時(shí)間后執(zhí)行。
2.2 Message 指令執(zhí)行策略待執(zhí)行的指令 Message 有兩種:
基本指令:普通幀生成指令,該指令分為以下 2 種:
復(fù)合指令:一條指令需要多個(gè) CAN 幀才能完整表示
簡(jiǎn)單指令:一條指令生成一個(gè) CAN 幀
WebMsgSpecial:包含特殊執(zhí)行指令,該指令均內(nèi)含一條普通指令,該指令分為以下 3 種:
廣播發(fā)送:發(fā)送至一組或多組設(shè)備
緊急發(fā)送:將生成的 CAN 幀放置在隊(duì)列首位,以便優(yōu)先發(fā)送
不設(shè)置檢錯(cuò)重發(fā):該 CAN 幀無回復(fù),或重復(fù)發(fā)送該幀易導(dǎo)致設(shè)備異常
Netty 通道「WebMsgOutBoundHandler」接收到待執(zhí)行的指令 Message,根據(jù) Message 指令進(jìn)行執(zhí)行,生成 CAN 幀并被 SendableMsg 對(duì)象包裹,具體執(zhí)行策略如下:
若為基本指令:生成相對(duì)應(yīng)的一個(gè)或多個(gè) CAN 幀,并添加進(jìn)入不同的 SendableMsg 對(duì)象,執(zhí)行策略設(shè)為非緊急和開啟檢錯(cuò)重發(fā)機(jī)制。
若為 WebMsgSpecial 指令
若為廣播指令:將內(nèi)含 Message 根據(jù)廣播指令生成多條其他 WebMsgSpecial 指令
若為其他指令:生成 CAN 幀和對(duì)應(yīng)的 SendableMsg 對(duì)象的同時(shí),將「緊急」和「檢錯(cuò)重發(fā)」標(biāo)識(shí)添加進(jìn) SendableMsg 對(duì)象
Netty 通道「WebMsgOutBoundHandler」接收到待執(zhí)行的「執(zhí)行通道」指令 SendableMsg,根據(jù)指令進(jìn)行執(zhí)行:
1) SendableMsg 指令執(zhí)行策略若為「緊急」指令,將內(nèi)含的 CAN 幀放置在隊(duì)列首位,以便優(yōu)先發(fā)送
若為「不檢錯(cuò)重發(fā)」指令,在內(nèi)含的 CAN 幀被發(fā)送后,不執(zhí)行「檢錯(cuò)重發(fā)」操作
若為「普通」指令,執(zhí)行「非緊急」操作和「檢錯(cuò)重發(fā)」操作
在隊(duì)列中選取首位 SendableMsg 對(duì)象,內(nèi)含 CAN 幀被發(fā)送的同時(shí),CAN 幀的「組號(hào)」、「設(shè)備號(hào)」和「功能位」組成 Key,CAN 幀作為 Value,添加進(jìn) HashMap 中,并在時(shí)間輪上設(shè)置「檢錯(cuò)重發(fā)」策略,該策略在約定延遲時(shí)間后執(zhí)行,之后在 TCP 通道發(fā)送該 CAN 幀。
在約定延遲時(shí)間內(nèi),Netty 的 InBound 處理通道收到特定 CAN 幀的回復(fù),則將特定 CAN 幀的「Key, Value」對(duì)從 HashMap 中移除。
在約定時(shí)間后,執(zhí)行時(shí)間輪「檢錯(cuò)重發(fā)」策略:
檢測(cè) HashMap 中相應(yīng) CAN 幀的「Key, Value」對(duì):
若為空,則服務(wù)器收到該 CAN 幀的回復(fù),該策略終止
若不為空,則服務(wù)器未收到該 CAN 幀的回復(fù),查看 SendableMsg 對(duì)象的執(zhí)行次數(shù)
若次數(shù)大于 3 次,Netty 模塊向 Server 模塊發(fā)送設(shè)備通信故障 Message,將該設(shè)備設(shè)為異常狀態(tài)。
若次數(shù)小于 3 次,根據(jù) SendableMsg 指令的內(nèi)含操作重新執(zhí)行。
3. 參考資料本項(xiàng)目的「GitHub」
Netty 源碼解讀之時(shí)間輪算法實(shí)現(xiàn)-HashedWheelTimer
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/68247.html
摘要:消息與邏輯請(qǐng)求或響應(yīng)消息對(duì)應(yīng)的完整的一系列幀。聲明數(shù)據(jù)流依賴關(guān)系指出,應(yīng)盡可能先向父數(shù)據(jù)流分配資源,然后再向其依賴項(xiàng)分配資源。數(shù)據(jù)流應(yīng)先于和獲得完整資源分配和應(yīng)先于和獲得相同的資源分配和應(yīng)基于其權(quán)重獲得比例分配。 轉(zhuǎn)載自 | 小米運(yùn)維(公眾號(hào) ID:MI-SRE)showImg(https://segmentfault.com/img/bVbbesG?w=344&h=344); HTT...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續(xù)后端好書閱讀與推薦續(xù)二后端好書閱讀與推薦續(xù)三這里依然記錄一下每本書的亮點(diǎn)與自己讀書心得和體會(huì),分享并求拍磚。然后又請(qǐng)求封鎖,當(dāng)釋放了上的封鎖之后,系統(tǒng)又批準(zhǔn)了的請(qǐng)求一直等待。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續(xù))后端好書閱讀與推薦(續(xù)二)后端好書閱讀與推薦(續(xù)三) 這里依然記錄一下每本書的...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續(xù)后端好書閱讀與推薦續(xù)二后端好書閱讀與推薦續(xù)三這里依然記錄一下每本書的亮點(diǎn)與自己讀書心得和體會(huì),分享并求拍磚。然后又請(qǐng)求封鎖,當(dāng)釋放了上的封鎖之后,系統(tǒng)又批準(zhǔn)了的請(qǐng)求一直等待。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續(xù))后端好書閱讀與推薦(續(xù)二)后端好書閱讀與推薦(續(xù)三) 這里依然記錄一下每本書的...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續(xù)后端好書閱讀與推薦續(xù)二后端好書閱讀與推薦續(xù)三這里依然記錄一下每本書的亮點(diǎn)與自己讀書心得和體會(huì),分享并求拍磚。然后又請(qǐng)求封鎖,當(dāng)釋放了上的封鎖之后,系統(tǒng)又批準(zhǔn)了的請(qǐng)求一直等待。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續(xù))后端好書閱讀與推薦(續(xù)二)后端好書閱讀與推薦(續(xù)三) 這里依然記錄一下每本書的...
摘要:如問到是否使用某框架,實(shí)際是是問該框架的使用場(chǎng)景,有什么特點(diǎn),和同類可框架對(duì)比一系列的問題。這兩個(gè)方向的區(qū)分點(diǎn)在于工作方向的側(cè)重點(diǎn)不同。 [TOC] 這是一份來自嗶哩嗶哩的Java面試Java面試 32個(gè)核心必考點(diǎn)完全解析(完) 課程預(yù)習(xí) 1.1 課程內(nèi)容分為三個(gè)模塊 基礎(chǔ)模塊: 技術(shù)崗位與面試 計(jì)算機(jī)基礎(chǔ) JVM原理 多線程 設(shè)計(jì)模式 數(shù)據(jù)結(jié)構(gòu)與算法 應(yīng)用模塊: 常用工具集 ...
閱讀 2712·2019-08-30 15:52
閱讀 3657·2019-08-29 17:02
閱讀 1907·2019-08-29 13:00
閱讀 981·2019-08-29 11:07
閱讀 3315·2019-08-27 10:53
閱讀 1824·2019-08-26 13:43
閱讀 1067·2019-08-26 10:22
閱讀 1403·2019-08-23 18:06