Netty中处理SQL查询等长时间任务

Dealing With Long Time Task Such As SQL Query In Netty

我正在学习Netty,但是对于Netty线程我还不清楚。

哪个是IO线程?我在网上看了一些页面,上面说你不能阻塞IO线程。但是,我不知道哪个 IO 线程是。

例如:

 b = new ServerBootstrap(); 
 b.group(bossGroup, workerGroup)
  .channel(NioServerSocketChannel.class) 
  .childHandler(new SimpleChatServerInitializer())  // (4)
  .option(ChannelOption.SO_BACKLOG, 128)            // (5)
  .childOption(ChannelOption.SO_KEEPALIVE, true);   // (6)

WorkGroup 还是 bossGroup?

bossGroup和workerGroup都是线程池,为I/O处理提供线程。 bossGroup 线程处理客户端连接请求并将接受连接并为每个客户端创建一个通道。之后,来自 workerGroup 的线程将专门分配给该通道,该通道可能同时有入站和出站数据包通过。对于入站数据包,工作线程将被事件调用并需要读取数据包。对于出站数据包,工作线程需要将它们写入通道套接字缓冲区以进行发送。这就是为什么它们都是 I/O 个线程。

然后准备(从像MySQL/MongoDB这样的持久性存储中获取messages/data),如果将业务逻辑放在同一个工作线程中,它将被阻塞。在更糟糕的情况下,如果同一个工作线程正在被其他通道used/shared。业务逻辑将阻止 I/O 其他可能有紧急(时间敏感)数据包需要处理的通道。这会导致问题。因此,您应该让业务逻辑在不同的线程中执行(例如,用户定义的线程),或者您可以创建一个单独的 EventExecutorGroup 并让业务逻辑处理程序在该线程组中。

希望以上内容对您有所帮助。