2012-05-16 31 views
4

在服务器上,为每个新连接调用ChannelPipelineFactory#getPipeline()。我的服务器的ChannelHandler分配了序列化缓冲区和其他非线程安全的对象。我怎样才能避免为每个连接分配它们?我的应用程序有大量的短暂连接,这会影响性能。我不在每个连接状态中存储处理程序,因为处理程序中的对象不是线程安全的,所以我只需要为每个将使用管道的线程分配一次。有效使用Netty流水线

可能我可以使用一个处理程序的管道。当收到任何事件时,我会从ThreadLocal中获得对我的实际处理程序的引用。这样我只为每个线程服务连接分配一个实际的处理程序。它的确意味着一个ThreadLocal查找每个事件。

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

我的印象是,Netty流水线在相对简单的示例代码中看起来很棒,当它很适合问题(比如HTTP处理)时非常整洁,但是对于很多其他场景它不是很灵活。 Here是别人的思路。这不是一种灾难,因为使用单个处理程序来滚动你自己的“管道”似乎是完全可行的,但我不知道我是否做错了?

回答

3

使用ThreadLocal似乎是一个好主意,如果这对你来说已经足够了。请注意,这仅适用于上游事件,因为任何线程都可能触发下游事件,因此ThreadLocal可能无法解决上述问题。

+0

嗯,好点。 AFAIK,现在这是好的,因为我的服务器是打开/请求/响应/关闭,所以写入线程将永远是一个工作线程。写入会立即发生,在读取响应的工作线程中,或者写入不成功,然后在工作线程中使用OP_WRITE。如果我的请求开始花费很长时间并引入一个线程池以避免阻塞工作线程,那么我必须将ThreadLocal更改为同步池。这一切对你来说是否正确? – NateS

+0

对我来说听起来不错 –