百度競(jìng)價(jià)排名收費(fèi)標(biāo)準(zhǔn)長(zhǎng)沙正規(guī)競(jìng)價(jià)優(yōu)化服務(wù)
介紹一下 Netty 使用的線程模型?
答:
Netty 主要基于主從 Reactor 多線程模型,其中主從 Reactor 多線程模型將 Reactor 分為兩部分:
- mainReactor:監(jiān)聽 Server Socket,用來處理網(wǎng)絡(luò) IO 連接建立操作,將建立的 SocketChannel 指定注冊(cè)給 subReactor
- subReactor:和建立起來的 socket 做數(shù)據(jù)交互和業(yè)務(wù)處理操作
因?yàn)榭蛻舳说倪B接數(shù)量相對(duì)來說比較少,而數(shù)據(jù)的讀和寫會(huì)比較多一點(diǎn),使用 mainReactor 只接受客戶端連接,由其他線程 subReactor 負(fù)責(zé)讀和寫,將業(yè)務(wù)處理剝離出,讓線程池來處理,降低了 Reactor 的性能開銷
擴(kuò)展:單 Reactor 單線程模型、單 Reactor 多線程模型
-
單 Reactor 單線程模型
通過 1 個(gè)線程負(fù)責(zé)客戶端連接、網(wǎng)絡(luò)數(shù)據(jù)的讀寫、業(yè)務(wù)處理
緩存 Redis 就是單 Reactor 單線程模型
-
單 Reactor 多線程模型
通過 1 個(gè)線程負(fù)責(zé)客戶端的連接、網(wǎng)絡(luò)數(shù)據(jù)的讀寫,將業(yè)務(wù)處理剝離出去,通過線程池來進(jìn)行處理
三種 Reactor 模型的優(yōu)缺點(diǎn):
- 單 Reactor 單線程模型是單線程進(jìn)行業(yè)務(wù)處理,當(dāng)負(fù)載過重時(shí),處理速度將會(huì)變慢,影響系統(tǒng)性能,因此引出單 Reactor 多線程模型
- 單 Reactor 多線程模型時(shí)多個(gè)線程處理業(yè)務(wù),業(yè)務(wù)處理速度上來了,但是單 Reactor 承擔(dān)了所有時(shí)間的監(jiān)聽和響應(yīng),可能存在性能問題。當(dāng)有數(shù)百萬客戶端進(jìn)行連接或者服務(wù)端需要對(duì)客戶端握手進(jìn)行安全認(rèn)證,認(rèn)證本身非常消耗性能,因此出現(xiàn)了主從 Reactor 多線程模型
- 主從 Reactor 多線程模型中 1 個(gè)主 Reactor 只用來處理網(wǎng)絡(luò) IO 的連接建立操作,而對(duì)于接入認(rèn)證、IP 黑白名單過濾、握手等操作由從 Reactor 進(jìn)行處理,這樣進(jìn)一步提升性能,在主從 Reactor 多線程模型中,從 Reactor 有多個(gè),可以與 CPU 個(gè)數(shù)相同
TCP 粘包、拆包是什么?如何解決?
答:
TCP本身的機(jī)制決定了一定會(huì)有粘包、拆包,因?yàn)?TCP 傳輸協(xié)議時(shí)基于數(shù)據(jù)流傳輸?shù)?#xff0c;而流化的數(shù)據(jù)沒有界限,因此 TCP 作為傳輸層協(xié)議并不了解上層業(yè)務(wù)數(shù)據(jù)的具體含義,會(huì)根據(jù) TCP 緩沖區(qū)的實(shí)際情況進(jìn)行數(shù)據(jù)包的劃分,所以業(yè)務(wù)上認(rèn)為的一個(gè)完整的包,可能被 TCP 拆成多個(gè)包或者把多個(gè)小的包封裝成一個(gè)大的包進(jìn)行發(fā)送。
產(chǎn)生原因:
- 粘包:客戶端發(fā)送的包的大小比socket的緩存小或者接收方讀取socket緩存不及時(shí),因此多個(gè)包一起發(fā)送了
- 拆包:客戶端發(fā)送的包的大小比socket的緩存大或者發(fā)送的數(shù)據(jù)大于協(xié)議的MTU(最大傳輸單元)必須拆包,那么這個(gè)包就被拆分成了多個(gè)包進(jìn)行發(fā)送
解決方法:
有三種方式:
- 通過指定分隔符來進(jìn)行分割
- 通過指定固定長(zhǎng)度來進(jìn)行分割
- 上邊兩種方式靈活性不好,因此常用的是通過指定接收數(shù)據(jù)的長(zhǎng)度來解決,也就是
LengthFieldBasedFrameDecoder()
這個(gè)類