1

我对如何处理 netty (3.6.2.FINAL) 和 keep-alive=true 中的大量连接感到困惑。

对于作为服务器端连接器的 netty 客户端的工作,对另一个服务进行 http 调用,它希望始终保持连接打开以提高性能(keep-alive=true)。

问题:打开通道的数量有一个硬性限制,之后客户端在尝试打开通道时会挂起。为什么没有异常只是挂起?这是通道超时方面的设置吗?

我似乎无法理解 Netty 对工作线程内连接的整体管理:

  • 使用阻塞的写入/读取客户端 ChannelHandler(http 请求/响应),如何检测连接池为空?

  • 处理程序可以接收 ChannelEvent(s),但没有关于连接池中可用的总数(无论如何它非常不确定)。如果通道未打开,考虑到它在工作线程中运行,处理程序启动打开一个新通道是否有意义?

  • 但是如果连接池用完了,你怎么去清理一些空闲的连接(在处理程序内)?
4

1 回答 1

0

我必须完全拆开我的处理程序,才能让客户端阻塞调用在不挂起的情况下正常工作。该问题主要是通过不保留处理程序中的本地通道引用来解决的。

现在我们只需将 ConnectionInterface#openConnection() [返回一个新的 ChannelFuture] 传递给共享的自定义 ChannelHandler#call( ConnectionInterface connectionInterface, HttpRequest request )。

最好在处理程序调用方法中打开通道,并在通道.write(x)之前传递该通道以及对其状态的检查,如果!channel.isWritable()则回收通道(来自新的客户端连接,例如ConnectionInterface #openConnection()) 并重试写入。甚至不需要关闭通道(它在池中处理)。

只需用 500 个线程 / 5000 个请求运行它,它就成功了。

于 2013-02-08T01:31:07.427 回答