【问题标题】:Netty multi threading per connection每个连接的 Netty 多线程
【发布时间】:2015-10-29 17:51:09
【问题描述】:

我是netty的新手。我想开发一个服务器,旨在接收来自可能很少(比如 Max 是 2 个)客户端的请求。但是每个客户端都会不断地向服务器发送许多请求。服务器必须处理此类请求并响应客户端。所以,在这里我假设即使我配置了多个工作线程,它也可能没有用,因为只有 2 个活动连接。工作线程再次阻塞,直到它处理并响应客户端。所以,请让我知道如何处理这些类型的问题。 如果我在工作线程中使用 threadpoolexecutor 以多线程方式处理两个客户端请求,它会高效吗?或者如果它可以通过netty框架实现,请让我知道如何做到这一点? 提前谢谢...

【问题讨论】:

    标签: multithreading netty


    【解决方案1】:

    如果我理解正确:您的客户端 (2) 将发送许多消息,每个消息都暗示服务器会尽快回复。

    可以看到2个选项:

    1. answear 过程很短(足够短,不会成为您想要达到的速率的问题,这意味着 1 个线程能够尽可能快地回答 1 个客户端的需求):那么您可以继续使用在服务器引导程序中设置的来自 Netty 的标准线程(一次 1 个客户端的 1 个工作线程)。这是最短路径。

    2. answear过程时间不够短(速度会很可怕,比如因为有一个“长时间”的过程,比如阻塞调用、数据库访问、文件写入……):那么你可以在 Netty 管道中为你的 ChannelHandler 添加一个线程池(一个组)来做这样的阻塞/长进程。

    以下是从 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,它会并行运行。我可以使用线程池执行器框架吗?会有什么不同吗?请帮助...
    【解决方案2】:

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

    类似的东西。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-24
      • 2013-01-29
      • 2013-03-19
      • 2015-09-29
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多