Netty 多线程在 4.1 版中损坏?无法处理长查询后的短查询?
Netty multithreading broken in version 4.1 ? Unable to process short queries after long ones?
我只想设置一个非常普通的服务器:它必须接受连接并进行一些业务计算以得到 return 答案。计算可以很短也可以很长 -> 我需要某种 ThreadPoolExecutor 来执行这些计算。
在我们使用了很长时间的 netty 3 中,这很容易实现,只需在我的 BusinessHandler 之前在管道中使用 ExecutionHandler。
但现在尝试在 netty 4 中设置相同的东西,我在文档中读到 ExecutionHandler 不再存在,并且我在将我的 BusinessHandler 添加到通道管道时添加以指定 EventExecutor。
DefaultEventExecutorGroup applicativeExecutorGroup = new DefaultEventExecutorGroup(10);
...
ch.pipeline().addLast(applicativeExecutorGroup, businessHandler);
它适用于非常基本的场景(仅短查询),但不适用于以下场景。 原因是 DefaultEventExecutorGroup 不会 select 一个免费的工作人员,而是任何一个基于循环的工作人员。
- 第一个请求 (R1) 来了,被分配了 T1(DefaultEventExecutorGroup 的线程 1),并且会花费很长时间(比如 1 分钟)。
- 然后收到了一些其他查询Ri (i=2 to 10)。分配了Ti,也处理成功
- 但是当R11来的时候,由于DefaultEventExecutorGroup中实现的round-robin算法,又被分配了T1,query排在了很长的R1之后。结果,它不会在一分钟之前开始处理,这显然是不可接受的延迟。在具体场景中,客户端永远不会得到答案,因为在我们开始处理之前,他们等待答案的时间已经超时。
- 就这样继续下去。每 10 个查询一个查询就会失败,因为在唯一繁忙的线程中排在长查询之后,而该组的所有其他线程都只是空闲。
我的管道是否有其他可行的配置?例如,是否存在 EventExecutor 的实现,它可以像标准执行器一样工作(select 一个免费的工作人员)。
或者它只是 netty 4.1 中的一个错误?这看起来很奇怪,因为这对于任何服务器来说都是很常见的情况。
感谢您的帮助。
根据您上面的解释,我认为您想使用 UnorderedThreadPoolEventExecutor
来替代 DefaultEventExecutorGroup
。或者如果顺序很重要 NonStickyEventExecutorGroup
.
我只想设置一个非常普通的服务器:它必须接受连接并进行一些业务计算以得到 return 答案。计算可以很短也可以很长 -> 我需要某种 ThreadPoolExecutor 来执行这些计算。
在我们使用了很长时间的 netty 3 中,这很容易实现,只需在我的 BusinessHandler 之前在管道中使用 ExecutionHandler。
但现在尝试在 netty 4 中设置相同的东西,我在文档中读到 ExecutionHandler 不再存在,并且我在将我的 BusinessHandler 添加到通道管道时添加以指定 EventExecutor。
DefaultEventExecutorGroup applicativeExecutorGroup = new DefaultEventExecutorGroup(10);
...
ch.pipeline().addLast(applicativeExecutorGroup, businessHandler);
它适用于非常基本的场景(仅短查询),但不适用于以下场景。 原因是 DefaultEventExecutorGroup 不会 select 一个免费的工作人员,而是任何一个基于循环的工作人员。
- 第一个请求 (R1) 来了,被分配了 T1(DefaultEventExecutorGroup 的线程 1),并且会花费很长时间(比如 1 分钟)。
- 然后收到了一些其他查询Ri (i=2 to 10)。分配了Ti,也处理成功
- 但是当R11来的时候,由于DefaultEventExecutorGroup中实现的round-robin算法,又被分配了T1,query排在了很长的R1之后。结果,它不会在一分钟之前开始处理,这显然是不可接受的延迟。在具体场景中,客户端永远不会得到答案,因为在我们开始处理之前,他们等待答案的时间已经超时。
- 就这样继续下去。每 10 个查询一个查询就会失败,因为在唯一繁忙的线程中排在长查询之后,而该组的所有其他线程都只是空闲。
我的管道是否有其他可行的配置?例如,是否存在 EventExecutor 的实现,它可以像标准执行器一样工作(select 一个免费的工作人员)。 或者它只是 netty 4.1 中的一个错误?这看起来很奇怪,因为这对于任何服务器来说都是很常见的情况。
感谢您的帮助。
根据您上面的解释,我认为您想使用 UnorderedThreadPoolEventExecutor
来替代 DefaultEventExecutorGroup
。或者如果顺序很重要 NonStickyEventExecutorGroup
.