新的傳輸層完全是非堵塞的,與 tcp 不同的是 socket 連接配接、讀寫都不會堵塞。使用 tcp_nio2 最大的好處就是無需針對每個連接配接建立一個讀者線程(如果啟用發送隊列還需要建立寫線程)。
在一個有 1000 個節點的叢集中,使用 tcp 方法每個節點都要維持 999 個連接配接和 999 個讀線程。使用 tcp_nio2 盡管也有 999 個 tcp 連接配接,但隻有一個選擇器線程用來服務所有連接配接。當資料可讀取,我們可以無堵塞的讀取盡可能多的資料,并将讀取到的資料傳遞個相應方法處理。
也就是說相對于 tcp 而言,tcp_nio2 更具備可伸縮性。
性能
我們在一個 9 個節點(每個節點有8核處理器和千兆網絡)的叢集中運作 uperf 和 mperf 測試,得到如下結果:
uperf (500'000 請求/節點, 50 invoker 線程/節點):
tcp: 62'858 reqs/sec/node, tcp_nio2: 65'387 reqs/sec/node
mperf (1百萬消息/節點, 50 個發送線程/節點):
tcp: 69'799 msgs/sec/node, tcp_nio2: 77'126 msgs/sec/node
可見 tcp_nio2 在兩種情況下運作都更好,我對這個結果也非常驚訝,bio 方法更快。