Java大量文件傳輸(Netty應(yīng)用二)

前言

在Netty應(yīng)用一 大文件傳輸那篇文章和之前的demohttps://gitee.com/bbstone101/pisces.git)能夠傳輸單個(gè)幾G的文件,但是,一旦遇到傳輸?shù)奈募?shù)量多(比如膘格,超過一萬)碉熄,就會(huì)出現(xiàn)服務(wù)器端卡死問題别凤。主要原因是建芙,使用FileRegion模式和ChunkedFile模式傳輸文件旷偿,server端會(huì)主動(dòng)讀取發(fā)送文件到網(wǎng)絡(luò)管道速缆,一旦client端接收和存儲(chǔ)速度跟不上降允,就會(huì)導(dǎo)致server端數(shù)據(jù)堆積,占用服務(wù)器資源艺糜。

本篇基于Netty應(yīng)用一存在的問題和文件備份實(shí)際情況剧董,即,小文件多破停,且文件不過超過1G翅楼,超過10G的更是少。設(shè)計(jì)了pisces2-m基于LengthFieldBasedFrameDecoder自定義文件傳輸協(xié)議真慢,程序由client端來觸發(fā)和控制文件發(fā)送的頻率毅臊,這樣設(shè)計(jì)更切合實(shí)際。

服務(wù)器和客戶端這兩種通信控制模式黑界,與MQ的消息的 推/拉 模式相像:

  • Netty應(yīng)用一管嬉,是由服務(wù)器主動(dòng)推送文件數(shù)據(jù),客戶端接收园爷;
  • Netty應(yīng)用二宠蚂,是由客戶端主動(dòng)去服務(wù)器拉取文件信息和文件數(shù)據(jù)。

項(xiàng)目代碼:https://gitee.com/bbstone101/pisces2-m.git

架構(gòu)設(shè)計(jì)

image.png

ChunkSlicer: server端將文件切分成一個(gè)個(gè)chunk數(shù)據(jù)塊發(fā)送給client童社。server直接從FileInputStream一個(gè)個(gè)chunk讀取數(shù)據(jù)求厕,然后構(gòu)造響應(yīng)buildRsp發(fā)送給client。

RecvBuffer: client端接收到chunk數(shù)據(jù)后,先緩存起來呀癣,默認(rèn)緩存大忻榔帧:32 * 1024 * 1024 = 32M

請(qǐng)求–響應(yīng)處理流程

image.png

通信協(xié)議

請(qǐng)求協(xié)議

協(xié)議定義:

image.png
獲取文件列表索引信息和數(shù)據(jù):
  • REQ_LIST_INFO:客戶端請(qǐng)求獲取fileNo=0的fli.idx文件信息(文件checksum,chunks數(shù)等)项栏。

  • REQ_LIST_DATA:客戶端請(qǐng)求獲取fileNo=0的fli.idx文件數(shù)據(jù)浦辨。

  • REQ_LIST_INFO_ACK:客戶端確認(rèn)已經(jīng)接收fli.idx文件信息。

  • REQ_LIST_DATA_ACK:客戶端確認(rèn)已經(jīng)接收fli.idx文件chunk的數(shù)據(jù)沼沈。

獲取文件列表索引中文件的信息和數(shù)據(jù):
  • REQ_FILE_INFO:客戶端請(qǐng)求獲取fileNo=n的文件信息

  • REQ_FILE_DATA客戶端請(qǐng)求獲取fileNo=n的文件數(shù)據(jù)流酬。

  • REQ_FILE_INFO_ACK:客戶端確認(rèn)已經(jīng)接收文件信息。

  • REQ_FILE_DATA_ACK:客戶端確認(rèn)已經(jīng)接收文件chunk的數(shù)據(jù)列另。

LengthFieldBasedFrameDecoder參數(shù)和說明:
  • image.png

請(qǐng)求消息的最大幀長度是1MB芽腾,請(qǐng)求消息大多數(shù)沒有請(qǐng)求體或請(qǐng)求體為空。

響應(yīng)協(xié)議

協(xié)議定義:

  • image.png

服務(wù)器響應(yīng)列表索引文件信息和數(shù)據(jù):

  • RSP_LIST_INFO:響應(yīng)列表信息(包括chunks和文件checksum)

  • RSP_LIST_DATA:響應(yīng)列表文件數(shù)據(jù)页衙,chunkNo摊滔,body的checksum,文件數(shù)據(jù)

服務(wù)器響應(yīng)列表索引文件里的文件信息和數(shù)據(jù):

  • RSP_FILE_INFO:響應(yīng)文件信息(包括chunks和文件checksum)

  • RSP_FILE_DATA:響應(yīng)文件數(shù)據(jù)店乐,chunkNo艰躺,body的checksum,文件數(shù)據(jù)

LengthFieldBasedFrameDecoder參數(shù)和說明:

  • image.png

響應(yīng)消息最大幀大小是12MB眨八,響應(yīng)消息主要是響應(yīng)文件信息和數(shù)據(jù)腺兴,其中文件數(shù)據(jù)是body主要內(nèi)容,為加快文件從server傳給client踪古,需要適當(dāng)調(diào)整響應(yīng)消息的最大幀大小含长。

后語

目前能夠在局域網(wǎng)正確傳輸30萬左右的文件,但是耗時(shí)也較長伏穆。

可以考慮開多個(gè)client來消費(fèi)fli.idx中的文件列表傳輸任務(wù)來提高文件傳輸效率。

TODO:

1)同時(shí)啟動(dòng)多個(gè)客戶端連服務(wù)器下載(請(qǐng)求)文件

2)客戶端并發(fā)讀取和消費(fèi)fli.idx列表任務(wù)管理器設(shè)計(jì)和開發(fā)

補(bǔ)充:多客戶端與單客戶端性能對(duì)比

更新日期:20220621

  • image.png

結(jié)論:

  • 以上測試兩個(gè)版本皆為單服務(wù)端纷纫,其中單客戶端接收40w+文件耗時(shí)枕扫,是同條件下10個(gè)客戶端耗時(shí)的10倍多。

  • 另外辱魁,從初步性能測試結(jié)果看烟瞧,不能確定客戶機(jī)啟動(dòng)10個(gè)客戶端接收數(shù)據(jù)已觸及到客戶機(jī)的磁盤IO或CPU負(fù)載的極限。即染簇,增大客戶端個(gè)數(shù)参滴,還有可能提升性能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锻弓,一起剝皮案震驚了整個(gè)濱河市砾赔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖暴心,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妓盲,死亡現(xiàn)場離奇詭異,居然都是意外死亡专普,警方通過查閱死者的電腦和手機(jī)悯衬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檀夹,“玉大人筋粗,你說我怎么就攤上這事≌ǘ桑” “怎么了亏狰?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長偶摔。 經(jīng)常有香客問我暇唾,道長,這世上最難降的妖魔是什么辰斋? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任策州,我火速辦了婚禮,結(jié)果婚禮上宫仗,老公的妹妹穿的比我還像新娘够挂。我一直安慰自己,他們只是感情好藕夫,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布孽糖。 她就那樣靜靜地躺著,像睡著了一般毅贮。 火紅的嫁衣襯著肌膚如雪办悟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天滩褥,我揣著相機(jī)與錄音病蛉,去河邊找鬼。 笑死瑰煎,一個(gè)胖子當(dāng)著我的面吹牛铺然,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酒甸,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼魄健,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了插勤?” 一聲冷哼從身側(cè)響起沽瘦,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤革骨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后其垄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苛蒲,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡献酗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蚕脏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了特咆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昼扛。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孽亲,死狀恐怖侈玄,靈堂內(nèi)的尸體忽然破棺而出非凌,到底是詐尸還是另有隱情秸应,我是刑警寧澤橘霎,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布蔫浆,位于F島的核電站,受9級(jí)特大地震影響姐叁,放射性物質(zhì)發(fā)生泄漏瓦盛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一外潜、第九天 我趴在偏房一處隱蔽的房頂上張望原环。 院中可真熱鬧,春花似錦处窥、人聲如沸嘱吗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谒麦。三九已至,卻和暖如春哆致,著一層夾襖步出監(jiān)牢的瞬間绕德,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工沽瞭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迁匠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓驹溃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親延曙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豌鹤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容