Netty每个连接的多线程处理

3
我是新手,正在学习Netty。我想开发一个服务器,接收来自最多两个客户端的请求,但每个客户端都将连续发送许多请求到服务器。服务器必须处理这些请求并响应给客户端。因此,我假设即使我配置了多个工作线程,由于只有2个活动连接,它可能也没有用处。工作线程会阻塞,直到它处理完并响应给客户端。那么,请告诉我如何处理这些问题。 如果我在工作线程中使用Threadpoolexecutor以多线程方式处理两个客户端的请求,是否高效?或者如果可以通过Netty框架实现,麻烦您告诉我如何做到这一点? 提前致谢...
2个回答

0

如果我理解正确:您的客户(2)将发送许多消息,每个消息都意味着需要尽快从服务器获得答案。

可以看到两种选择:

  1. 答案进程很短(足够短,不会影响您想要达到的速率,这意味着1个线程能够为1个客户端提供所需的答案速度):那么您可以使用Netty(在服务器引导程序中为1个客户端设置1个工作线程)的标准线程。这是最短的路径。

  2. 答案过程不够短暂(速率将非常低,例如因为存在“长时间”进程,例如阻塞调用、数据库访问、文件写入等):那么您可以在Netty管道中为执行此类阻塞/长进程的通道处理程序添加一个线程池(组)。

以下是从ChannelPipeline获取的API文档摘录: http://netty.io/4.0/api/io/netty/channel/ChannelPipeline.html

// Tell the pipeline to run MyBusinessLogicHandler's event handler methods
// in a different thread than an I/O thread so that the I/O thread is not blocked by
// a time-consuming task.
// If your business logic is fully asynchronous or finished very quickly, you don't
// need to specify a group.
pipeline.addLast(group, "handler", new MyBusinessLogicHandler());

我已经实现了DefaultEventExecutorGroup,并将我的处理程序添加到管道中以在该组下运行,如上所述。只是添加了S.O.P来打印线程名称和Thread.sleep(2000)以查看线程名称和并行线程是否正在运行,并从一个客户端向服务器发送3条消息。但在服务器端,所有3条消息始终显示相同的线程编号。如果我在我的处理程序中添加threadpoolexecutor并将消息分派到threadpoolexecutor,则可以并行运行。我可以使用线程池执行程序框架吗?会有什么区别吗?请帮忙... - devoss ind

0

只需将一个带有特殊EventExecutorGroup的ChannelHandler添加到ChannelPipeline中。例如UnorderedThreadPoolEventExecutor(src)。

就像这样。

UnorderedThreadPoolEventExecutor executorGroup = ...;
pipeline.addLast(executorGroup, new MyChannelHandler());

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