2014-11-22 29 views
2

我想使用Java Netty爲來自客戶端的大量持久連接創建一個TCP服務器。換句話說,映像中有1000個客戶端設備,並且它們都創建並維護與TCP服務器的持久連接。將會有合理的流量(大部分是文本行)在這些永久連接之間來回傳遞。如何確定NioEventLoopGroup的boss和worker組中使用的最佳線程數?具有持久連接的NioEventLoopGroup的線程數

我的理解是,當連接創建時,Netty會創建一個SimpleChannelInboundHandler對象來處理連接。當創建連接時,會調用處理程序channelActive方法,並且每次從客戶端獲取新消息時,都會調用messageReceived方法(或Netty 4.0.24中的channelRead0方法)。我的理解是否正確?如果我有很長的運行代碼在messageReceived中運行,會發生什麼情況 - 我是否需要在另一個線程(java.util.Thread)中啓動此代碼?如果我的messageReceived方法阻塞某些內容或需要很長時間才能完成,會發生什麼情況?這是否會讓Netty陷入癱瘓?

基本上我需要編寫一個TCP套接字服務器,可以儘可能快地服務於大量的持久連接。是否有關於NioEventLoopGroup的線程數量以及如何在處理程序中使用任何線程的指導?

任何幫助將不勝感激。

回答

5

如何確定在NioEventLoopGroup的boss和worker組中使用的最佳線程數?

  • 關於老闆線程,如果你說你需要持久連接,沒有意義使用大量的老闆線程,因爲老闆線程只負責接受新的連接。所以我只會使用一個boss線程。
  • 工作線程的數量應取決於您的處理器內核。

不要忘記添加-XmsYYYYM-XmxYYYYM爲你的虛擬機屬性,因爲沒有他們,你可以當你的JVM沒有使用的所有核心所面臨的情況。

如果我有長時間運行的代碼在messageReceived中運行會怎麼樣 - 我是否需要在另一個線程(java.util.Thread)中啓動此代碼?

  • 你真的需要這樣做嗎?也許你應該想到以另一種方式來做你的邏輯,如果不是的話,那麼你應該考慮每個連接的新線程。

如果我的messageReceived方法阻塞某事或需要很長時間才能完成,會發生什麼?

  • 您應該避免在您的處理程序中使用線程阻止操作

這是否會讓Netty陷入癱瘓?

  • 是的,它的確如此。
+0

太棒了,謝謝! – Marc 2014-11-24 18:43:09