高效使用Netty管道

5
在服务器上,每次建立新连接时都会调用ChannelPipelineFactory#getPipeline()。我的服务器的ChannelHandlers有分配序列化缓冲区和其他不是线程安全的对象。我如何避免为每个连接分配它们?我的应用程序具有大量短暂连接,这对性能有影响。我没有在处理程序中存储每个连接状态,我真正需要的是仅为将使用管道的线程分配一次,因为处理程序中的对象不是线程安全的。

可能我可以使用带有单个处理程序的管道。当收到任何事件时,我会从ThreadLocal获取实际处理程序的引用。这样,我每个线程服务连接只分配一个实际处理程序。不过,这意味着每个事件都需要进行ThreadLocal查找。

是否有其他更好的解决方案?

我认为在相对简单的示例代码中,Netty管道看起来很棒,并且在适合问题(例如HTTP处理)时非常整洁,但是对于许多其他情况来说,它并不是非常灵活。这里有其他人对此的看法。使用单个处理程序来构建自己的“管道”似乎完全可行,这并不是什么灾难,但我想知道我是否做错了?
1个回答

3

如果您认为使用ThreadLocal足够好,那么这似乎是个不错的选择。但请注意,这只适用于上游事件,因为下游事件可能由任何线程触发,所以ThreadLocal可能无法很好地工作。


嗯,说得好。据我所知,目前这样做是可以的,因为我的服务器是开放/请求/响应/关闭的,所以写线程将始终是工作线程。写入操作将立即在读取响应的工作线程中发生,或者如果写入未成功,则稍后使用OP_WRITE,在工作线程中进行。如果我的请求开始花费太长时间,并且我引入线程池以避免阻塞工作线程,则必须将ThreadLocal更改为同步池。你觉得这些都正确吗? - NateS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接