




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Netty之驚人的性能1. 背景1.1. 驚人的性能數(shù)據(jù)最近一個(gè)圈內(nèi)朋友通過私信告訴我,通過使用Netty4 + Thrift壓縮二進(jìn)制編解碼技術(shù),他們實(shí)現(xiàn)了10W TPS(1K的復(fù)雜POJO對(duì)象)的跨節(jié)點(diǎn)遠(yuǎn)程服務(wù)調(diào)用。相比于傳統(tǒng)基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多。事實(shí)上,我對(duì)這個(gè)數(shù)據(jù)并不感到驚訝,根據(jù)我5年多的NIO編程經(jīng)驗(yàn),通過選擇合適的NIO框架,加上高性能的壓縮二進(jìn)制編解碼技術(shù),精心的設(shè)計(jì)Reactor線程模型,達(dá)到上述性能指標(biāo)是完全有可能的。下面我們就一起來看下Netty是如何支持10W TPS的跨節(jié)點(diǎn)遠(yuǎn)程服務(wù)調(diào)用的,在正式開始講解之前,我們先簡單
2、介紹下Netty。1.2. Netty基礎(chǔ)入門Netty是一個(gè)高性能、異步事件驅(qū)動(dòng)的NIO框架,它提供了對(duì)TCP、UDP和文件傳輸?shù)闹С?,作為一個(gè)異步NIO框架,Netty的所有IO操作都是異步非阻塞的,通過Future-Listener機(jī)制,用戶可以方便的主動(dòng)獲取或者通過通知機(jī)制獲得IO操作結(jié)果。作為當(dāng)前最流行的NIO框架,Netty在互聯(lián)網(wǎng)領(lǐng)域、大數(shù)據(jù)分布式計(jì)算領(lǐng)域、游戲行業(yè)、通信行業(yè)等獲得了廣泛的應(yīng)用,一些業(yè)界著名的開源組件也基于Netty的NIO框架構(gòu)建。2. Netty高性能之道2.1. RPC調(diào)用的性能模型分析2.1.1. 傳統(tǒng)RPC調(diào)用性能差的三宗罪網(wǎng)絡(luò)傳輸方式問題:傳
3、統(tǒng)的RPC框架或者基于RMI等方式的遠(yuǎn)程服務(wù)(過程)調(diào)用采用了同步阻塞IO,當(dāng)客戶端的并發(fā)壓力或者網(wǎng)絡(luò)時(shí)延增大之后,同步阻塞IO會(huì)由于頻繁的wait導(dǎo)致IO線程經(jīng)常性的阻塞,由于線程無法高效的工作,IO處理能力自然下降。下面,我們通過BIO通信模型圖看下BIO通信的弊端:圖2-1 BIO通信模型圖采用BIO通信模型的服務(wù)端,通常由一個(gè)獨(dú)立的Acceptor線程負(fù)責(zé)監(jiān)聽客戶端的連接,接收到客戶端連接之后為客戶端連接創(chuàng)建一個(gè)新的線程處理請(qǐng)求消息,處理完成之后,返回應(yīng)答消息給客戶端,線程銷毀,這就是典型的一請(qǐng)求一應(yīng)答模型。該架構(gòu)最大的問題就是不具備彈性伸縮能力,當(dāng)并發(fā)訪問量增加后,服務(wù)端的線程個(gè)數(shù)和
4、并發(fā)訪問數(shù)成線性正比,由于線程是JAVA虛擬機(jī)非常寶貴的系統(tǒng)資源,當(dāng)線程數(shù)膨脹之后,系統(tǒng)的性能急劇下降,隨著并發(fā)量的繼續(xù)增加,可能會(huì)發(fā)生句柄溢出、線程堆棧溢出等問題,并導(dǎo)致服務(wù)器最終宕機(jī)。序列化方式問題:Java序列化存在如下幾個(gè)典型問題:1) Java序列化機(jī)制是Java內(nèi)部的一種對(duì)象編解碼技術(shù),無法跨語言使用;例如對(duì)于異構(gòu)系統(tǒng)之間的對(duì)接,Java序列化后的碼流需要能夠通過其它語言反序列化成原始對(duì)象(副本),目前很難支持;2) 相比于其它開源的序列化框架,Java序列化后的碼流太大,無論是網(wǎng)絡(luò)傳輸還是持久化到磁盤,都會(huì)導(dǎo)致額外的資源占用;3) 序列化性能差(CPU資源占用高)。線程模型問題:
5、由于采用同步阻塞IO,這會(huì)導(dǎo)致每個(gè)TCP連接都占用1個(gè)線程,由于線程資源是JVM虛擬機(jī)非常寶貴的資源,當(dāng)IO讀寫阻塞導(dǎo)致線程無法及時(shí)釋放時(shí),會(huì)導(dǎo)致系統(tǒng)性能急劇下降,嚴(yán)重的甚至?xí)?dǎo)致虛擬機(jī)無法創(chuàng)建新的線程。2.1.2. 高性能的三個(gè)主題1) 傳輸:用什么樣的通道將數(shù)據(jù)發(fā)送給對(duì)方,BIO、NIO或者AIO,IO模型在很大程度上決定了框架的性能。2) 協(xié)議:采用什么樣的通信協(xié)議,HTTP或者內(nèi)部私有協(xié)議。協(xié)議的選擇不同,性能模型也不同。相比于公有協(xié)議,內(nèi)部私有協(xié)議的性能通??梢员辉O(shè)計(jì)的更優(yōu)。3) 線程:數(shù)據(jù)報(bào)如何讀???讀取之后的編解碼在哪個(gè)線程進(jìn)行,編解碼后的消息如何派發(fā),Reactor線程模型的不
6、同,對(duì)性能的影響也非常大。圖2-2 RPC調(diào)用性能三要素2.2. Netty高性能之道2.2.1. 異步非阻塞通信在IO編程過程中,當(dāng)需要同時(shí)處理多個(gè)客戶端接入請(qǐng)求時(shí),可以利用多線程或者IO多路復(fù)用技術(shù)進(jìn)行處理。IO多路復(fù)用技術(shù)通過把多個(gè)IO的阻塞復(fù)用到同一個(gè)select的阻塞上,從而使得系統(tǒng)在單線程的情況下可以同時(shí)處理多個(gè)客戶端請(qǐng)求。與傳統(tǒng)的多線程/多進(jìn)程模型比,I/O多路復(fù)用的最大優(yōu)勢是系統(tǒng)開銷小,系統(tǒng)不需要?jiǎng)?chuàng)建新的額外進(jìn)程或者線程,也不需要維護(hù)這些進(jìn)程和線程的運(yùn)行,降低了系統(tǒng)的維護(hù)工作量,節(jié)省了系統(tǒng)資源。JDK1.4提供了對(duì)非阻塞IO(NIO)的支持,JDK1.5_update10版本使
7、用epoll替代了傳統(tǒng)的select/poll,極大的提升了NIO通信的性能。JDK NIO通信模型如下所示:圖2-3 NIO的多路復(fù)用模型圖與Socket類和ServerSocket類相對(duì)應(yīng),NIO也提供了SocketChannel和ServerSocketChannel兩種不同的套接字通道實(shí)現(xiàn)。這兩種新增的通道都支持阻塞和非阻塞兩種模式。阻塞模式使用非常簡單,但是性能和可靠性都不好,非阻塞模式正好相反。開發(fā)人員一般可以根據(jù)自己的需要來選擇合適的模式,一般來說,低負(fù)載、低并發(fā)的應(yīng)用程序可以選擇同步阻塞IO以降低編程復(fù)雜度。但是對(duì)于高負(fù)載、高并發(fā)的網(wǎng)絡(luò)應(yīng)用,需要使用NIO的非阻塞模式進(jìn)行開發(fā)。
8、Netty架構(gòu)按照Reactor模式設(shè)計(jì)和實(shí)現(xiàn),它的服務(wù)端通信序列圖如下:圖2-3 NIO服務(wù)端通信序列圖客戶端通信序列圖如下:圖2-4 NIO客戶端通信序列圖Netty的IO線程N(yùn)ioEventLoop由于聚合了多路復(fù)用器Selector,可以同時(shí)并發(fā)處理成百上千個(gè)客戶端Channel,由于讀寫操作都是非阻塞的,這就可以充分提升IO線程的運(yùn)行效率,避免由于頻繁IO阻塞導(dǎo)致的線程掛起。另外,由于Netty采用了異步通信模式,一個(gè)IO線程可以并發(fā)處理N個(gè)客戶端連接和讀寫操作,這從根本上解決了傳統(tǒng)同步阻塞IO一連接一線程模型,架構(gòu)的性能、彈性伸縮能力和可靠性都得到了極大的提升。2.2.2. 零拷貝
9、很多用戶都聽說過Netty具有“零拷貝”功能,但是具體體現(xiàn)在哪里又說不清楚,本小節(jié)就詳細(xì)對(duì)Netty的“零拷貝”功能進(jìn)行講解。Netty的“零拷貝”主要體現(xiàn)在如下三個(gè)方面:1) Netty的接收和發(fā)送ByteBuffer采用DIRECT BUFFERS,使用堆外直接內(nèi)存進(jìn)行Socket讀寫,不需要進(jìn)行字節(jié)緩沖區(qū)的二次拷貝。如果使用傳統(tǒng)的堆內(nèi)存(HEAP BUFFERS)進(jìn)行Socket讀寫,JVM會(huì)將堆內(nèi)存Buffer拷貝一份到直接內(nèi)存中,然后才寫入Socket中。相比于堆外直接內(nèi)存,消息在發(fā)送過程中多了一次緩沖區(qū)的內(nèi)存拷貝。2) Netty提供了組合Buffer對(duì)象,可以聚合多個(gè)ByteBu
10、ffer對(duì)象,用戶可以像操作一個(gè)Buffer那樣方便的對(duì)組合Buffer進(jìn)行操作,避免了傳統(tǒng)通過內(nèi)存拷貝的方式將幾個(gè)小Buffer合并成一個(gè)大的Buffer。3) Netty的文件傳輸采用了transferTo方法,它可以直接將文件緩沖區(qū)的數(shù)據(jù)發(fā)送到目標(biāo)Channel,避免了傳統(tǒng)通過循環(huán)write方式導(dǎo)致的內(nèi)存拷貝問題。下面,我們對(duì)上述三種“零拷貝”進(jìn)行說明,先看Netty 接收Buffer的創(chuàng)建:圖2-5 異步消息讀取“零拷貝”每循環(huán)讀取一次消息,就通過ByteBufAllocator的ioBuffer方法獲取ByteBuf對(duì)象,下面繼續(xù)看它的接口定義:圖2-6 ByteBufAllocat
11、or 通過ioBuffer分配堆外內(nèi)存當(dāng)進(jìn)行Socket IO讀寫的時(shí)候,為了避免從堆內(nèi)存拷貝一份副本到直接內(nèi)存,Netty的ByteBuf分配器直接創(chuàng)建非堆內(nèi)存避免緩沖區(qū)的二次拷貝,通過“零拷貝”來提升讀寫性能。下面我們繼續(xù)看第二種“零拷貝”的實(shí)現(xiàn)CompositeByteBuf,它對(duì)外將多個(gè)ByteBuf封裝成一個(gè)ByteBuf,對(duì)外提供統(tǒng)一封裝后的ByteBuf接口,它的類定義如下:圖2-7 CompositeByteBuf類繼承關(guān)系通過繼承關(guān)系我們可以看出CompositeByteBuf實(shí)際就是個(gè)ByteBuf的包裝器,它將多個(gè)ByteBuf組合成一個(gè)集合,然后對(duì)外提供統(tǒng)一的ByteB
12、uf接口,相關(guān)定義如下:圖2-8 CompositeByteBuf類定義添加ByteBuf,不需要做內(nèi)存拷貝,相關(guān)代碼如下:圖2-9 新增ByteBuf的“零拷貝”最后,我們看下文件傳輸?shù)摹傲憧截悺保簣D2-10 文件傳輸“零拷貝”Netty文件傳輸DefaultFileRegion通過transferTo方法將文件發(fā)送到目標(biāo)Channel中,下面重點(diǎn)看FileChannel的transferTo方法,它的API DOC說明如下:圖2-11 文件傳輸 “零拷貝”對(duì)于很多操作系統(tǒng)它直接將文件緩沖區(qū)的內(nèi)容發(fā)送到目標(biāo)Channel中,而不需要通過拷貝的方式,這是一種更加高效的傳輸方式,它實(shí)現(xiàn)了文件傳輸
13、的“零拷貝”。2.2.3. 內(nèi)存池隨著JVM虛擬機(jī)和JIT即時(shí)編譯技術(shù)的發(fā)展,對(duì)象的分配和回收是個(gè)非常輕量級(jí)的工作。但是對(duì)于緩沖區(qū)Buffer,情況卻稍有不同,特別是對(duì)于堆外直接內(nèi)存的分配和回收,是一件耗時(shí)的操作。為了盡量重用緩沖區(qū),Netty提供了基于內(nèi)存池的緩沖區(qū)重用機(jī)制。下面我們一起看下Netty ByteBuf的實(shí)現(xiàn):圖2-12 內(nèi)存池ByteBufNetty提供了多種內(nèi)存管理策略,通過在啟動(dòng)輔助類中配置相關(guān)參數(shù),可以實(shí)現(xiàn)差異化的定制。下面通過性能測試,我們看下基于內(nèi)存池循環(huán)利用的ByteBuf和普通ByteBuf的性能差異。用例一,使用內(nèi)存池分配器創(chuàng)建直接內(nèi)存緩沖區(qū):圖2-13 基于
14、內(nèi)存池的非堆內(nèi)存緩沖區(qū)測試用例用例二,使用非堆內(nèi)存分配器創(chuàng)建的直接內(nèi)存緩沖區(qū):圖2-14 基于非內(nèi)存池創(chuàng)建的非堆內(nèi)存緩沖區(qū)測試用例各執(zhí)行300萬次,性能對(duì)比結(jié)果如下所示:圖2-15 內(nèi)存池和非內(nèi)存池緩沖區(qū)寫入性能對(duì)比性能測試表明,采用內(nèi)存池的ByteBuf相比于朝生夕滅的ByteBuf,性能高23倍左右(性能數(shù)據(jù)與使用場景強(qiáng)相關(guān))。下面我們一起簡單分析下Netty內(nèi)存池的內(nèi)存分配:圖2-16 AbstractByteBufAllocator的緩沖區(qū)分配繼續(xù)看newDirectBuffer方法,我們發(fā)現(xiàn)它是一個(gè)抽象方法,由AbstractByteBufAllocator的子類負(fù)責(zé)具體實(shí)現(xiàn),代碼如
15、下:圖2-17 newDirectBuffer的不同實(shí)現(xiàn)代碼跳轉(zhuǎn)到PooledByteBufAllocator的newDirectBuffer方法,從Cache中獲取內(nèi)存區(qū)域PoolArena,調(diào)用它的allocate方法進(jìn)行內(nèi)存分配:圖2-18 PooledByteBufAllocator的內(nèi)存分配PoolArena的allocate方法如下:圖2-18 PoolArena的緩沖區(qū)分配我們重點(diǎn)分析newByteBuf的實(shí)現(xiàn),它同樣是個(gè)抽象方法,由子類DirectArena和HeapArena來實(shí)現(xiàn)不同類型的緩沖區(qū)分配,由于測試用例使用的是堆外內(nèi)存,圖2-19 PoolArena的newByt
16、eBuf抽象方法因此重點(diǎn)分析DirectArena的實(shí)現(xiàn):如果沒有開啟使用sun的unsafe,則圖2-20 DirectArena的newByteBuf方法實(shí)現(xiàn)執(zhí)行PooledDirectByteBuf的newInstance方法,代碼如下:圖2-21 PooledDirectByteBuf的newInstance方法實(shí)現(xiàn)通過RECYCLER的get方法循環(huán)使用ByteBuf對(duì)象,如果是非內(nèi)存池實(shí)現(xiàn),則直接創(chuàng)建一個(gè)新的ByteBuf對(duì)象。從緩沖池中獲取ByteBuf之后,調(diào)用AbstractReferenceCountedByteBuf的setRefCnt方法設(shè)置引用計(jì)數(shù)器,用于對(duì)象的引用計(jì)
17、數(shù)和內(nèi)存回收(類似JVM垃圾回收機(jī)制)。2.2.4. 高效的Reactor線程模型常用的Reactor線程模型有三種,分別如下:1) Reactor單線程模型;2) Reactor多線程模型;3) 主從Reactor多線程模型Reactor單線程模型,指的是所有的IO操作都在同一個(gè)NIO線程上面完成,NIO線程的職責(zé)如下:1) 作為NIO服務(wù)端,接收客戶端的TCP連接;2) 作為NIO客戶端,向服務(wù)端發(fā)起TCP連接;3) 讀取通信對(duì)端的請(qǐng)求或者應(yīng)答消息;4) 向通信對(duì)端發(fā)送消息請(qǐng)求或者應(yīng)答消息。Reactor單線程模型示意圖如下所示:圖2-22 Reactor單線程模型由于Reactor模式使
18、用的是異步非阻塞IO,所有的IO操作都不會(huì)導(dǎo)致阻塞,理論上一個(gè)線程可以獨(dú)立處理所有IO相關(guān)的操作。從架構(gòu)層面看,一個(gè)NIO線程確實(shí)可以完成其承擔(dān)的職責(zé)。例如,通過Acceptor接收客戶端的TCP連接請(qǐng)求消息,鏈路建立成功之后,通過Dispatch將對(duì)應(yīng)的ByteBuffer派發(fā)到指定的Handler上進(jìn)行消息解碼。用戶Handler可以通過NIO線程將消息發(fā)送給客戶端。對(duì)于一些小容量應(yīng)用場景,可以使用單線程模型。但是對(duì)于高負(fù)載、大并發(fā)的應(yīng)用卻不合適,主要原因如下:1) 一個(gè)NIO線程同時(shí)處理成百上千的鏈路,性能上無法支撐,即便NIO線程的CPU負(fù)荷達(dá)到100%,也無法滿足海量消息的編碼、解碼
19、、讀取和發(fā)送;2) 當(dāng)NIO線程負(fù)載過重之后,處理速度將變慢,這會(huì)導(dǎo)致大量客戶端連接超時(shí),超時(shí)之后往往會(huì)進(jìn)行重發(fā),這更加重了NIO線程的負(fù)載,最終會(huì)導(dǎo)致大量消息積壓和處理超時(shí),NIO線程會(huì)成為系統(tǒng)的性能瓶頸;3) 可靠性問題:一旦NIO線程意外跑飛,或者進(jìn)入死循環(huán),會(huì)導(dǎo)致整個(gè)系統(tǒng)通信模塊不可用,不能接收和處理外部消息,造成節(jié)點(diǎn)故障。為了解決這些問題,演進(jìn)出了Reactor多線程模型,下面我們一起學(xué)習(xí)下Reactor多線程模型。Rector多線程模型與單線程模型最大的區(qū)別就是有一組NIO線程處理IO操作,它的原理圖如下:圖2-23 Reactor多線程模型Reactor多線程模型的特點(diǎn):1) 有
20、專門一個(gè)NIO線程-Acceptor線程用于監(jiān)聽服務(wù)端,接收客戶端的TCP連接請(qǐng)求;2) 網(wǎng)絡(luò)IO操作-讀、寫等由一個(gè)NIO線程池負(fù)責(zé),線程池可以采用標(biāo)準(zhǔn)的JDK線程池實(shí)現(xiàn),它包含一個(gè)任務(wù)隊(duì)列和N個(gè)可用的線程,由這些NIO線程負(fù)責(zé)消息的讀取、解碼、編碼和發(fā)送;3) 1個(gè)NIO線程可以同時(shí)處理N條鏈路,但是1個(gè)鏈路只對(duì)應(yīng)1個(gè)NIO線程,防止發(fā)生并發(fā)操作問題。在絕大多數(shù)場景下,Reactor多線程模型都可以滿足性能需求;但是,在極特殊應(yīng)用場景中,一個(gè)NIO線程負(fù)責(zé)監(jiān)聽和處理所有的客戶端連接可能會(huì)存在性能問題。例如百萬客戶端并發(fā)連接,或者服務(wù)端需要對(duì)客戶端的握手消息進(jìn)行安全認(rèn)證,認(rèn)證本身非常損耗性能
21、。在這類場景下,單獨(dú)一個(gè)Acceptor線程可能會(huì)存在性能不足問題,為了解決性能問題,產(chǎn)生了第三種Reactor線程模型-主從Reactor多線程模型。主從Reactor線程模型的特點(diǎn)是:服務(wù)端用于接收客戶端連接的不再是個(gè)1個(gè)單獨(dú)的NIO線程,而是一個(gè)獨(dú)立的NIO線程池。Acceptor接收到客戶端TCP連接請(qǐng)求處理完成后(可能包含接入認(rèn)證等),將新創(chuàng)建的SocketChannel注冊(cè)到IO線程池(sub reactor線程池)的某個(gè)IO線程上,由它負(fù)責(zé)SocketChannel的讀寫和編解碼工作。Acceptor線程池僅僅只用于客戶端的登陸、握手和安全認(rèn)證,一旦鏈路建立成功,就將鏈路注冊(cè)到后
22、端subReactor線程池的IO線程上,由IO線程負(fù)責(zé)后續(xù)的IO操作。它的線程模型如下圖所示:圖2-24 Reactor主從多線程模型利用主從NIO線程模型,可以解決1個(gè)服務(wù)端監(jiān)聽線程無法有效處理所有客戶端連接的性能不足問題。因此,在Netty的官方demo中,推薦使用該線程模型。事實(shí)上,Netty的線程模型并非固定不變,通過在啟動(dòng)輔助類中創(chuàng)建不同的EventLoopGroup實(shí)例并通過適當(dāng)?shù)膮?shù)配置,就可以支持上述三種Reactor線程模型。正是因?yàn)镹etty 對(duì)Reactor線程模型的支持提供了靈活的定制能力,所以可以滿足不同業(yè)務(wù)場景的性能訴求。2.2.5. 無鎖化的串行設(shè)計(jì)理念在大多數(shù)
23、場景下,并行多線程處理可以提升系統(tǒng)的并發(fā)性能。但是,如果對(duì)于共享資源的并發(fā)訪問處理不當(dāng),會(huì)帶來嚴(yán)重的鎖競爭,這最終會(huì)導(dǎo)致性能的下降。為了盡可能的避免鎖競爭帶來的性能損耗,可以通過串行化設(shè)計(jì),即消息的處理盡可能在同一個(gè)線程內(nèi)完成,期間不進(jìn)行線程切換,這樣就避免了多線程競爭和同步鎖。為了盡可能提升性能,Netty采用了串行無鎖化設(shè)計(jì),在IO線程內(nèi)部進(jìn)行串行操作,避免多線程競爭導(dǎo)致的性能下降。表面上看,串行化設(shè)計(jì)似乎CPU利用率不高,并發(fā)程度不夠。但是,通過調(diào)整NIO線程池的線程參數(shù),可以同時(shí)啟動(dòng)多個(gè)串行化的線程并行運(yùn)行,這種局部無鎖化的串行線程設(shè)計(jì)相比一個(gè)隊(duì)列-多個(gè)工作線程模型性能更優(yōu)。Netty
24、的串行化設(shè)計(jì)工作原理圖如下:圖2-25 Netty串行化工作原理圖Netty的NioEventLoop讀取到消息之后,直接調(diào)用ChannelPipeline的fireChannelRead(Object msg),只要用戶不主動(dòng)切換線程,一直會(huì)由NioEventLoop調(diào)用到用戶的Handler,期間不進(jìn)行線程切換,這種串行化處理方式避免了多線程操作導(dǎo)致的鎖的競爭,從性能角度看是最優(yōu)的。2.2.6. 高效的并發(fā)編程N(yùn)etty的高效并發(fā)編程主要體現(xiàn)在如下幾點(diǎn):1) volatile的大量、正確使用;2) CAS和原子類的廣泛使用;3) 線程安全容器的使用;4) 通過讀寫鎖提升并發(fā)性能。如果大家想
25、了解Netty高效并發(fā)編程的細(xì)節(jié),可以閱讀之前我在微博分享的多線程并發(fā)編程在 Netty 中的應(yīng)用分析,在這篇文章中對(duì)Netty的多線程技巧和應(yīng)用進(jìn)行了詳細(xì)的介紹和分析。2.2.7. 高性能的序列化框架影響序列化性能的關(guān)鍵因素總結(jié)如下:1) 序列化后的碼流大?。ňW(wǎng)絡(luò)帶寬的占用);2) 序列化&反序列化的性能(CPU資源占用);3) 是否支持跨語言(異構(gòu)系統(tǒng)的對(duì)接和開發(fā)語言切換)。Netty默認(rèn)提供了對(duì)Google Protobuf的支持,通過擴(kuò)展Netty的編解碼接口,用戶可以實(shí)現(xiàn)其它的高性能序列化框架,例如Thrift的壓縮二進(jìn)制編解碼框架。下面我們一起看下不同序列化&反序列化框架序列化后的字節(jié)數(shù)組對(duì)比:圖2-26
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 法律服務(wù)行業(yè)法律顧問服務(wù)協(xié)議
- 產(chǎn)業(yè)園物業(yè)服務(wù)合同
- 古詩文登高解讀與教學(xué)方案設(shè)計(jì)
- 個(gè)人權(quán)益保護(hù)網(wǎng)絡(luò)平臺(tái)使用協(xié)議
- 企業(yè)級(jí)網(wǎng)絡(luò)安全預(yù)防預(yù)案
- 裝修工程擔(dān)保合同
- 《宋代書法欣賞:大學(xué)書法藝術(shù)課程教案》
- 在線教育行業(yè)分析模擬試題集
- 股權(quán)擔(dān)保協(xié)議書規(guī)范
- 企業(yè)社會(huì)責(zé)任年度演講致辭草稿
- 2024-2025年第一學(xué)期小學(xué)德育工作總結(jié):點(diǎn)亮德育燈塔引領(lǐng)小學(xué)生全面成長的逐夢之旅
- 2024解析:第二章聲現(xiàn)象-基礎(chǔ)練(解析版)
- 整體法蘭強(qiáng)度校核計(jì)算表(設(shè)計(jì):zxg)
- 《供配電技術(shù)》課件第1章
- 建筑垃圾清理及運(yùn)輸方案
- 2024年甘肅省公務(wù)員錄用考試《行測》真題卷及答案解析
- 2024版Visio入門到精通完整教程
- 2024年團(tuán)??荚嚾雸F(tuán)考試題庫及答案
- 西鐵城手表H149機(jī)芯中文使用說明書
- 2024年執(zhí)業(yè)藥師繼續(xù)教育專業(yè)答案
- 非ST段抬高型急性冠脈綜合征診斷和治療指南(2024)解讀
評(píng)論
0/150
提交評(píng)論