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