我们有一个 HTTP 服务有大量的小请求,而且大部分只请求一次(大约 70%)
因此,如果我们在请求到来时保持通道打开,很快就会有很多通道留在内存中而什么都不做。
目前我们做的是注册一个 IdleStateHandler 和一个 IdleStateAwareChannelHandler,这样任何一个 5 秒内没有活动的通道都会被关闭。
这似乎行得通,并且打开的渠道的大小是稳定的。
但是我们还有另一个问题:
对于每个打开的频道,我们都自定义了与之关联的 ServerConnection 对象,以存储与当前频道相关的一些有用信息。我们将这些 ServerConnection 保存在一个名为 connectionMap 的全局映射中,键是通道。
每次调用messageReceived时,我们检查channel是否已经在connectionMap中,如果没有,则创建一个新的ServerConnection。
每次检测到 channelClosed/exceptionCaught 事件时,我们调用 connectionMap.remove 将其移除。
当 IdleStateHandler 被调用时,我们手动从地图中移除。
但是有些 ServerConnections 并没有被移除,而它的 Channel 的状态实际上是关闭的。
我们错过了什么吗?是否还有其他地方关闭了 Channel,但我们忘记了捕捉事件?