1. 程式人生 > >Netty,HttpAsyncClient和阻塞I/O(Httpclient)比較

Netty,HttpAsyncClient和阻塞I/O(Httpclient)比較

客戶端比較

Netty 4.0.8(無連線池)
Apache HttpAsyncClient 4.0-beta4(啟動連線池)
Apache HttpClient 4.3(啟用連線池)

測試設定

在伺服器端,在Amazon EC2雲中設定了一組伺服器。它們都服務相對靜態的內容,其中唯一的變化是可以從客戶端的查詢引數控制的有效載荷的大小。每個伺服器執行300個執行緒的Tomcat應用程式。
客戶端在我的膝上型電腦上執行,這是一個Macbook Pro(2.4Ghz英特爾酷睿i7)執行JVM 1.6.0_51 2G位元組堆大小。測試不同的請求批量大小。每個批處理在一個迴圈中傳送所有請求,並執行多次而不關閉JVM。一個批次大小的測試結果是所有執行的平均值。來自批處理的第一次執行的資料被忽略,因為它通常包括JVM,執行緒池和連線熱身。

指標

從測試收集或計算三個指標 
·傳送所有請求所需的時間。對於基於執行緒池的阻止客戶端,請求被認為是當它從執行緒池出隊並且交接給客戶端時傳送。對於Netty,當獲得ChannelFuture時,請求被認為是傳送的。對於Apache HttpAsyncClient,當Future< HttpResposne>時,請求被認為是傳送的。物件。
·平均延遲。對於NIO客戶端,當請求切換到客戶端時,定時器啟動。對於HttpClient,當請求入隊到執行緒池時,定時器啟動。當接收到完整的HTTP響應時,定時器停止。對所有請求累積該時間,並用於計算平均值。
·吞吐量。這只是批處理的大小除以傳送時間。

結果


有趣的是,觀察到最好的延遲是通過具有合理大小的執行緒池的阻塞I / O客戶端實現的。這可能是因為每個套接字在阻塞I / O中都有一個專用執行緒,而在NIO中,只有少數選擇器需要輪詢數百甚至數千或套接字。另一方面,當執行緒池的大小增加時,等待時間變得更糟。


與Netty相比,HttpAsyncClient具有更好的延遲,因為它具有內建的連線池支援。

結論

我相信NIO客戶端的效能優勢是在吞吐量方面。如果您的服務要求客戶​​端吞吐量超過1000 rps,請考慮使用NIO客戶端以避免瓶頸。另一方面,如果服務只需要幾百rps,使用具有合理大小的執行緒池的阻塞HttpClient是可管理的,並且將獲得更好的延遲。
HttpAsyncClient享受內建連線池的好處。當客戶端必須處理數千個併發請求時,這被證明是至關重要的。但是,請注意,這只是HTTP客戶端與相對簡單的用例的比較,Netty顯然有更廣泛的協議支援。


原文地址:http://allenxwang.blogspot.com/