在服务器上,为每个新连接调用ChannelPipelineFactory#getPipeline()。我的服务器的ChannelHandler分配了序列化缓冲区和其他非线程安全的对象。如何避免为每个连接分配它们?我的应用程序具有大量短期连接,这会损害性能。我没有在处理程序中存储每个连接状态,我真的只需要为每个使用管道的线程分配一次,因为处理程序中的对象不是线程安全的。
可能我可以使用带有单个处理程序的管道。当收到任何事件时,我会从ThreadLocal获得对我的实际处理程序的引用。这样我每个服务连接的线程只分配一个实际的处理程序。它确实意味着ThreadLocal会查找每个事件。
还有其他可能更好的解决方案吗?
我的印象是Netty管道在相对简单的示例代码中看起来很棒,并且当它很好地适应问题时(例如HTTP处理)非常简洁,但是对于许多其他场景它并不是非常灵活。 Here是他人的思想。这不是任何灾难,因为使用单个处理程序来滚动自己的“管道”似乎完全可行,但我想知道我做错了吗?
答案 0 :(得分:3)
使用ThreadLocal似乎是个好主意,如果这对你来说已经足够了。请注意,这只适用于上游事件,因为任何线程都可能触发下游事件,因此ThreadLocal的内容可能无法解决这个问题。