Skip to content

Commit fad7dff

Browse files
committed
completed 线程模型的局限
1 parent 2e89a08 commit fad7dff

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
线程模型的局限
2+
====
3+
4+
目前在 Netty 5 中仍然需要解决两个局限性,这些都存在于当前线程模型( Netty 4)。本节将解释这些局限性和显示团队计划如何在 Netty 5 中修复它们
5+
6+
### 选择下个 EventLoop
7+
8+
在 Netty 4 round-robin-like 算法用于给创建的 Channel 选择下一个 EventLoop。开始这工作得很好,但是一段时间后会发生一些 EventLoop 有些 Channel 分配比别人少。这是更有可能如果
9+
EventLoopGroup(包含 EventLoop)处理不同的协议或不同类型的连接,如长连接和短连接。
10+
11+
修复可能听起来很容易,因为你可以选择 EventLoop 最小的 Channel 数。但考虑到渠道的数量 EventLoop 不是足够的适当的修复,因为即使一个EventLoop 持有多个 Channel。另一个它并不代表这 EventLoop 是最繁忙的。有很多需要考虑的事情。这些包括以下几点:
12+
13+
* 队列任务的数量
14+
* 最后执行时间
15+
* 饱和网络堆栈
16+
17+
问题已经在 <https://github.com/netty/netty/issues/1230> 进行了跟踪,目前针对网状的 5.0.0.Final 进行修复,但也可能向后移植到 Netty 4 。
18+
19+
### 整个 EventLoop 重新分配 Channel
20+
21+
另一个问题是如何分配 Channel 在 EventLoop,更好地利用资源。这对于长连接尤其重要,因为这样一些 EventLoop 会比别人忙。
22+
23+
为了修复,Netty 的团队目前正在引入 reregister(....) 方法,它允许您将一个 Channel 移动到另一个 EventLoop,因此对其处理转移到另一个Thread. 。但这不是像听起来那么容易,因为它带来了一些问题。
24+
25+
首先,您必须确保所有的事件和操作被触发,同时老 EventLoop 在老EventLoop 注册的同时执行。未能这样是因为这样将打破线程模型,不能保证每个 ChannelHandler 是由只有一个线程进行处理。另一个问题是如何确保一个线程移动到另一个你不遇到任何可见的问题。
26+
27+
这个问题目前正在跟踪作为 Netty 5.0.0.Final 的<47 https://github.com/netty/netty/issues/1799>。它不可能会移植到 Netty 4.x,因为它需要一个小的 API 破损暴露在 Channel 接口所需的操作上。
28+
29+
30+
31+
32+

0 commit comments

Comments
 (0)