【问题标题】:netty client + keep-alive=truenetty 客户端 + keep-alive=true
【发布时间】:2013-01-19 20:43:06
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: http asynchronous client netty


    【解决方案1】:

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

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

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

    只需运行 500 个线程 / 5000 个请求就可以成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-16
      • 2020-07-10
      • 1970-01-01
      • 2010-09-29
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多