Netty 多线程在 4.1 版中损坏?无法在长查询后处理短查询?



我只想设置一个非常常见的服务器:它必须接受连接并进行一些业务计算才能返回答案。计算可以是短的或长的 ->我需要某种ThreadPoolExecutor来执行这些计算。

在netty 3中,我们使用了很长时间,这很容易实现,只需在我的BusinessHandler之前在管道中使用ExecutionHandler。

但是现在尝试在netty 4中设置同样的东西,我在文档中读到ExecutionHandler不再存在,并且在将我的BusinessHandler添加到通道管道时,我添加了指定EventExecutor。

DefaultEventExecutorGroup applicativeExecutorGroup = new DefaultEventExecutorGroup(10);
...
ch.pipeline().addLast(applicativeExecutorGroup, businessHandler);

它适用于非常基本的方案(仅短查询(,但不适用于以下方案。原因是 DefaultEventExecutorGroup 不会选择自由工作线程,而是基于循环选择任何工作线程。

  • 第一个请求 (R1( 来了,被分配了 T1(DefaultEventExecutorGroup 的线程 1(,并且需要很长时间(例如 1 分钟(。
  • 然后收到一些其他查询 Ri(i=2 到 10(。它们被分配为 Ti,并且也已成功处理。
  • 但是当 R11 到来时,由于在 DefaultEventExecutorGroup 中实现了循环算法,它再次被分配 T1,并且查询在长 R1 之后排队。因此,它不会在一分钟之前开始处理,这显然是不可接受的延迟。在具体场景中,客户端永远不会得到答案,因为它们在我们开始处理之前会等待答案。
  • 这种情况就这样继续下去。每 10 个查询中有一个查询会失败,因为在唯一的繁忙线程中排在长查询之后,而组的所有其他线程都处于空闲状态。

我的管道是否有其他配置可以工作?例如,是否存在像标准执行器一样工作的 EventExecutor 的嵌入(选择自由工作者(。 或者它只是 netty 4.1 中的一个错误?这看起来很奇怪,因为这看起来是任何服务器都非常常见的场景。

感谢您的帮助。

从您上面解释的内容来看,我认为您想使用UnorderedThreadPoolEventExecutor作为DefaultEventExecutorGroup的替代品。或者如果订购很重要NonStickyEventExecutorGroup.

最新更新