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